from typing import Optional from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.ext.asyncio import AsyncSession from app.database import get_db from app.core.deps import get_current_user from app.models.user import User from app.services.notification import NotificationService router = APIRouter() @router.get("/") async def list_notifications( is_read: Optional[bool] = Query(None), type: Optional[str] = Query(None), page: int = Query(1, ge=1), page_size: int = Query(20, ge=1, le=100), db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user) ): service = NotificationService(db) notifications = await service.get_notifications( user_id=current_user.id, is_read=is_read, type=type, page=page, page_size=page_size ) return [ { "id": n.id, "type": n.type, "title": n.title, "content": n.content, "is_read": n.is_read, "related_id": n.related_id, "created_at": n.created_at } for n in notifications ] @router.put("/{notification_id}/read") async def mark_notification_read( notification_id: int, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user) ): service = NotificationService(db) success = await service.mark_as_read(notification_id) if not success: raise HTTPException(status_code=404, detail="通知不存在") return {"message": "success"} @router.put("/read-all") async def mark_all_notifications_read( db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user) ): service = NotificationService(db) count = await service.mark_all_as_read(current_user.id) return {"message": "success", "count": count} @router.delete("/{notification_id}") async def delete_notification( notification_id: int, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user) ): service = NotificationService(db) success = await service.delete_notification(notification_id) if not success: raise HTTPException(status_code=404, detail="通知不存在") return {"message": "删除成功"}