55 lines
2.6 KiB
Python
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="已收到举报,我们会尽快处理")
|