import uuid from fastapi import APIRouter, Depends, Response, status from sqlalchemy.ext.asyncio import AsyncSession from app.core.deps import get_db_session, get_current_user, require_study_member from app.schemas.notification import GeneralNotificationFeed, GeneralNotificationRead, NotificationItem from app.services import document_service, notification_service, project_reminder_service router = APIRouter() @router.get( "/notifications", response_model=list[NotificationItem], dependencies=[Depends(require_study_member())], ) async def list_notifications( study_id: uuid.UUID, skip: int = 0, limit: int = 20, db: AsyncSession = Depends(get_db_session), current_user=Depends(get_current_user), ) -> list[NotificationItem]: return await document_service.list_distribution_notifications( db, study_id, current_user, skip=skip, limit=limit, ) @router.get( "/notifications/feed", response_model=GeneralNotificationFeed, dependencies=[Depends(require_study_member())], ) async def list_general_notifications( study_id: uuid.UUID, skip: int = 0, limit: int = 10, category: str | None = None, unread_only: bool = False, requires_action: bool | None = None, db: AsyncSession = Depends(get_db_session), current_user=Depends(get_current_user), ) -> GeneralNotificationFeed: # Fail closed: stale reminders may contain details for a permission that was just revoked. await project_reminder_service.sync_project_reminders(db, study_id, current_user) return await notification_service.list_feed( db, study_id=study_id, recipient_id=current_user.id, skip=skip, limit=limit, category=category, unread_only=unread_only, requires_action=requires_action, ) @router.post( "/notifications/{notification_id}/read", response_model=GeneralNotificationRead, dependencies=[Depends(require_study_member())], ) async def mark_general_notification_read( study_id: uuid.UUID, notification_id: uuid.UUID, db: AsyncSession = Depends(get_db_session), current_user=Depends(get_current_user), ) -> GeneralNotificationRead: return await notification_service.mark_read( db, study_id=study_id, recipient_id=current_user.id, notification_id=notification_id, ) @router.post( "/notifications/read-all", status_code=status.HTTP_204_NO_CONTENT, dependencies=[Depends(require_study_member())], ) async def mark_all_general_notifications_read( study_id: uuid.UUID, db: AsyncSession = Depends(get_db_session), current_user=Depends(get_current_user), ) -> Response: await notification_service.mark_all_read(db, study_id=study_id, recipient_id=current_user.id) return Response(status_code=status.HTTP_204_NO_CONTENT)