"""Notification endpoints. Endpoints --------- GET /notifications — list user notifications (paginated) GET /notifications/unread-count — count of unread notifications PATCH /notifications/{id}/read — mark one notification as read POST /notifications/read-all — mark all as read """ import uuid from fastapi import APIRouter, Depends, Query from sqlalchemy.orm import Session from app.database import get_db from app.dependencies.auth import get_current_user from app.domain.unit_of_work import UnitOfWork from app.models.user import User from app.schemas.notification import NotificationOut, UnreadCountOut from app.services.notification_service import ( list_notifications, mark_as_read, mark_all_as_read, get_unread_count, ) router = APIRouter(prefix="/notifications", tags=["notifications"]) # --------------------------------------------------------------------------- # GET /notifications — list (paginated) # --------------------------------------------------------------------------- @router.get("", response_model=list[NotificationOut]) def list_notifications_endpoint( offset: int = Query(0, ge=0), limit: int = Query(20, ge=1, le=100), db: Session = Depends(get_db), current_user: User = Depends(get_current_user), ): """Return paginated notifications for the current user, newest first.""" return list_notifications(db, current_user.id, offset=offset, limit=limit) # --------------------------------------------------------------------------- # GET /notifications/unread-count # --------------------------------------------------------------------------- @router.get("/unread-count", response_model=UnreadCountOut) def unread_count( db: Session = Depends(get_db), current_user: User = Depends(get_current_user), ): """Return the number of unread notifications for the current user.""" count = get_unread_count(db, current_user.id) return UnreadCountOut(unread_count=count) # --------------------------------------------------------------------------- # PATCH /notifications/{id}/read # --------------------------------------------------------------------------- @router.patch("/{notification_id}/read", response_model=NotificationOut) def read_notification( notification_id: uuid.UUID, db: Session = Depends(get_db), current_user: User = Depends(get_current_user), ): """Mark a single notification as read.""" with UnitOfWork(db) as uow: notif = mark_as_read(db, notification_id, current_user.id) uow.commit() return notif # --------------------------------------------------------------------------- # POST /notifications/read-all # --------------------------------------------------------------------------- @router.post("/read-all") def read_all_notifications( db: Session = Depends(get_db), current_user: User = Depends(get_current_user), ): """Mark all notifications for the current user as read.""" with UnitOfWork(db) as uow: count = mark_all_as_read(db, current_user.id) uow.commit() return {"detail": f"Marked {count} notifications as read"}