from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from typing import List from datetime import datetime from config.database import get_db from models.notification import Notification from models.user import User from schemas.notification import NotificationResponse from utils.security import get_current_active_user router = APIRouter() @router.get("/", response_model=List[NotificationResponse]) async def get_user_notifications( db: Session = Depends(get_db), current_user: User = Depends(get_current_active_user), limit: int = 50, offset: int = 0 ): """Get user notifications.""" notifications = db.query(Notification).filter( Notification.user_id == current_user.id ).order_by(Notification.created_at.desc()).limit(limit).offset(offset).all() return notifications @router.put("/{notification_id}/read") async def mark_notification_read( notification_id: int, db: Session = Depends(get_db), current_user: User = Depends(get_current_active_user) ): """Mark a notification as read.""" notification = db.query(Notification).filter( Notification.id == notification_id, Notification.user_id == current_user.id ).first() if not notification: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Notification not found" ) notification.is_read = True notification.read_at = datetime.utcnow() db.commit() return {"message": "Notification marked as read"} @router.put("/read-all") async def mark_all_notifications_read( db: Session = Depends(get_db), current_user: User = Depends(get_current_active_user) ): """Mark all user notifications as read.""" db.query(Notification).filter( Notification.user_id == current_user.id, Notification.is_read == False ).update({ "is_read": True, "read_at": datetime.utcnow() }) db.commit() return {"message": "All notifications marked as read"} @router.get("/unread-count") async def get_unread_count( db: Session = Depends(get_db), current_user: User = Depends(get_current_active_user) ): """Get count of unread notifications.""" count = db.query(Notification).filter( Notification.user_id == current_user.id, Notification.is_read == False ).count() return {"unread_count": count}