from fastapi import APIRouter, Depends, HTTPException from sqlmodel import Session, select from typing import List from database import get_session from models import Notification, User from auth import oauth2_scheme, get_current_user router = APIRouter( prefix="/notifications", tags=["notifications"] ) @router.get("/", response_model=List[Notification]) def get_my_notifications( skip: int = 0, limit: int = 20, current_user: User = Depends(get_current_user), session: Session = Depends(get_session) ): statement = ( select(Notification) .where(Notification.user_id == current_user.id) .order_by(Notification.created_at.desc()) .offset(skip) .limit(limit) ) return session.exec(statement).all() @router.get("/unread-count") def get_unread_count( current_user: User = Depends(get_current_user), session: Session = Depends(get_session) ): statement = ( select(Notification) .where(Notification.user_id == current_user.id) .where(Notification.is_read == False) ) results = session.exec(statement).all() return {"count": len(results)} @router.post("/{notification_id}/read") def mark_notification_read( notification_id: int, current_user: User = Depends(get_current_user), session: Session = Depends(get_session) ): notification = session.get(Notification, notification_id) if not notification: raise HTTPException(status_code=404, detail="Notification not found") if notification.user_id != current_user.id: raise HTTPException(status_code=403, detail="Not authorized") notification.is_read = True session.add(notification) session.commit() session.refresh(notification) return notification @router.post("/mark-all-read") def mark_all_read( current_user: User = Depends(get_current_user), session: Session = Depends(get_session) ): statement = ( select(Notification) .where(Notification.user_id == current_user.id) .where(Notification.is_read == False) ) notifications = session.exec(statement).all() for notification in notifications: notification.is_read = True session.add(notification) session.commit() return {"status": "success", "marked_count": len(notifications)}