"""通用与消息模块路由(/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="已收到举报,我们会尽快处理")