from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.ext.asyncio import AsyncSession from typing import Annotated, Optional from app.database import get_db from app.services.notification import NotificationService from app.api.v1.deps import get_current_user_id router = APIRouter() @router.get("") async def list_notifications( page: int = Query(1, ge=1), size: int = Query(20, ge=1, le=100), unread_only: bool = Query(False), user_id: str = Depends(get_current_user_id), db: Annotated[AsyncSession, Depends(get_db)] = None, ): service = NotificationService(db) return await service.list_notifications(user_id, page, size, unread_only) @router.get("/unread-count") async def unread_count( user_id: str = Depends(get_current_user_id), db: Annotated[AsyncSession, Depends(get_db)] = None, ): service = NotificationService(db) count = await service.get_unread_count(user_id) return {"count": count} @router.patch("/{notification_id}/read") async def mark_read( notification_id: str, user_id: str = Depends(get_current_user_id), db: Annotated[AsyncSession, Depends(get_db)] = None, ): service = NotificationService(db) success = await service.mark_read(user_id, notification_id) if not success: raise HTTPException(status_code=404, detail="Notification not found") return {"status": "ok"} @router.post("/read-all") async def mark_all_read( user_id: str = Depends(get_current_user_id), db: Annotated[AsyncSession, Depends(get_db)] = None, ): service = NotificationService(db) count = await service.mark_all_read(user_id) return {"status": "ok", "count": count} @router.delete("/{notification_id}") async def delete_notification( notification_id: str, user_id: str = Depends(get_current_user_id), db: Annotated[AsyncSession, Depends(get_db)] = None, ): service = NotificationService(db) success = await service.delete_notification(user_id, notification_id) if not success: raise HTTPException(status_code=404, detail="Notification not found") return {"status": "ok"}