Раньше уведомления удалялись через 72 часа после создания независимо от прочтения: кто не зашёл за 3 дня, не видел их вовсе. Теперь по времени чистятся только прочитанные (72ч после прочтения), а от роста у незаходящих защищает кап MAX_PER_USER=100 — при создании удаляются старейшие сверх лимита. Механика доставки не менялась: запись в БД + pull при заходе, SSE лишь ускоряет обновление открытых вкладок. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
36 lines
1.4 KiB
Python
36 lines
1.4 KiB
Python
"""Уведомления игрока: список (pull) и отметка прочитанными.
|
|
|
|
Появление в реальном времени обеспечивает SSE-сигнал `{type:"notifications"}` — по нему клиент
|
|
перезапрашивает этот список. Непрочитанные хранятся до прочтения; прочитанные чистятся
|
|
спустя 72 часа (при чтении и фоном)."""
|
|
from __future__ import annotations
|
|
|
|
from fastapi import APIRouter, Depends
|
|
from sqlmodel import Session
|
|
|
|
from app.auth.deps import get_current_user
|
|
from app.db.session import get_session
|
|
from app.models import User
|
|
from app.schemas import api as s
|
|
from app.services import notification_service
|
|
|
|
router = APIRouter(prefix="/notifications", tags=["notifications"])
|
|
|
|
|
|
@router.get("", response_model=s.NotificationList)
|
|
def my_notifications(
|
|
session: Session = Depends(get_session),
|
|
user: User = Depends(get_current_user),
|
|
) -> dict:
|
|
return notification_service.list_for_user(session, user.id) # type: ignore[arg-type]
|
|
|
|
|
|
@router.post("/read", response_model=s.OkResponse)
|
|
def mark_read(
|
|
body: s.NotificationMarkRead,
|
|
session: Session = Depends(get_session),
|
|
user: User = Depends(get_current_user),
|
|
) -> s.OkResponse:
|
|
notification_service.mark_read(session, user.id, body.ids) # type: ignore[arg-type]
|
|
return s.OkResponse()
|