|
|
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") |
|
|
|
|
|
|
|
|
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"} |
|
|
|
|
|
|
|
|
|