Files
LeDiscord/backend/api/routers/notifications.py

80 lines
2.4 KiB
Python

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}