Files
2026-10-15 20:36:59 +08:00

55 lines
2.6 KiB
Python

"""通用与消息模块路由(/app/version + /notifications + /reports,对应《03-接口文档》第 10 章)"""
import redis.asyncio as aioredis
from fastapi import APIRouter, Depends, Query
from sqlalchemy.ext.asyncio import AsyncSession
from app.core import ratelimit
from app.core.response import ok
from app.database import get_db
from app.deps import Identity, get_identity, require_user
from app.redis_client import get_redis
from app.schemas.common import NotificationReadReq, ReportReq
from app.services import common_service
router = APIRouter(tags=["通用"])
@router.get("/app/version")
async def get_app_version(platform: str = Query(pattern="^(ios|android)$"),
version_code: int = Query(ge=1),
db: AsyncSession = Depends(get_db),
redis: aioredis.Redis = Depends(get_redis),
identity: Identity = Depends(get_identity)):
return ok(await common_service.get_app_version(db, redis, platform, version_code))
@router.get("/notifications")
async def list_notifications(page: int = Query(1, ge=1), page_size: int = Query(20, ge=1, le=50),
type: int | None = Query(None),
db: AsyncSession = Depends(get_db),
identity: Identity = Depends(require_user)):
return ok(await common_service.list_notifications(db, identity.user_id, page, page_size, type))
@router.get("/notifications/unread_count")
async def get_unread_count(db: AsyncSession = Depends(get_db), redis: aioredis.Redis = Depends(get_redis),
identity: Identity = Depends(require_user)):
return ok({"unread": await common_service.get_unread_count(db, redis, identity.user_id)})
@router.post("/notifications/read")
async def mark_read(req: NotificationReadReq, db: AsyncSession = Depends(get_db),
redis: aioredis.Redis = Depends(get_redis),
identity: Identity = Depends(require_user)):
await common_service.mark_read(db, redis, identity.user_id, req.ids, bool(req.all))
return ok()
@router.post("/reports")
async def create_report(req: ReportReq, db: AsyncSession = Depends(get_db),
redis: aioredis.Redis = Depends(get_redis),
identity: Identity = Depends(require_user)):
await ratelimit.hit_subject(redis, identity.subject, "report", 10, 86400, "今日举报次数已达上限")
await common_service.create_report(db, redis, identity.user_id, req)
return ok(message="已收到举报,我们会尽快处理")