Hp137's picture
fix:Bug fixed NOTIF_04,09,20,21,22
90ebf1e
from src.profile.models import UserDevices
from src.profile.models import Leave
from sqlmodel import select
from requests.api import delete
from src.notifications.schemas import RegisterDeviceRequest
from src.notifications.service import register_device
from fastapi import APIRouter, Depends
from src.auth.utils import get_current_user
from src.core.database import get_async_session
from sqlalchemy.ext.asyncio import AsyncSession
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy import text
import uuid
router = APIRouter(prefix="/notifications", tags=["Notifications"])
@router.post("/register-device")
async def register_device_route(
body: RegisterDeviceRequest,
session: AsyncSession = Depends(get_async_session),
user=Depends(get_current_user),
):
device = await register_device(user, body, session)
return {"message": "Device registered", "device": str(device.id)}
@router.post("/{notif_id}/mark-read")
async def mark_notification_read(
notif_id: str,
session: AsyncSession = Depends(get_async_session),
user_id: str = Depends(get_current_user),
):
notif = await session.get(Leave, uuid.UUID(notif_id))
if not notif:
raise HTTPException(404, "Notification not found")
# Only owner or mentor should mark
if str(notif.user_id) != user_id and \
str(notif.mentor_id) != user_id and \
str(notif.lead_id) != user_id:
raise HTTPException(403, "Unauthorized")
notif.is_read = True
await session.commit()
return {"message": "Marked as read"}
@router.post("/logout")
async def logout(
body: RegisterDeviceRequest,
session: AsyncSession = Depends(get_async_session),
user_id: str = Depends(get_current_user),
):
stmt = select(UserDevices).where(
UserDevices.user_id == user_id, UserDevices.device_token == body.device_token
)
result = await session.execute(stmt)
device = result.scalar_one_or_none()
if not device:
return {"message": "Device already removed"}
await session.delete(device)
await session.commit()
return {"message": "Logged out — device token removed"}
@router.post("/mark-all-read")
async def mark_all_read(
session: AsyncSession = Depends(get_async_session),
user_id: str = Depends(get_current_user),
):
await session.execute(
text(
"""
UPDATE leave
SET is_read = TRUE
WHERE user_id = :uid OR mentor_id = :uid
"""
),
{"uid": user_id},
)
await session.commit()
return {"message": "All notifications cleared"}