"""互动模块路由(对应《03-接口文档》第 6 章)""" 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.interaction import CommentCreateReq from app.services import interaction_service # /videos/{video_id} 下的互动接口 router_videos = APIRouter(prefix="/videos", tags=["互动"]) # /comments 下的接口 router_comments = APIRouter(prefix="/comments", tags=["互动"]) @router_videos.post("/{video_id}/like") async def toggle_like(video_id: int, db: AsyncSession = Depends(get_db), redis: aioredis.Redis = Depends(get_redis), identity: Identity = Depends(require_user)): return ok(await interaction_service.toggle_like(db, redis, identity.user_id, video_id)) @router_videos.post("/{video_id}/favorite") async def toggle_favorite(video_id: int, db: AsyncSession = Depends(get_db), redis: aioredis.Redis = Depends(get_redis), identity: Identity = Depends(require_user)): return ok(await interaction_service.toggle_favorite(db, redis, identity.user_id, video_id)) @router_videos.get("/{video_id}/comments") async def list_comments(video_id: int, page: int = Query(1, ge=1), page_size: int = Query(20, ge=1, le=50), parent_id: int = Query(0, ge=0), db: AsyncSession = Depends(get_db), identity: Identity = Depends(get_identity)): return ok(await interaction_service.list_comments(db, video_id, page, page_size, parent_id)) @router_videos.post("/{video_id}/comments") async def create_comment(video_id: int, req: CommentCreateReq, db: AsyncSession = Depends(get_db), redis: aioredis.Redis = Depends(get_redis), identity: Identity = Depends(require_user)): await ratelimit.hit_subject(redis, identity.subject, "comment", 10, 60, "评论过于频繁,请稍后再试") return ok(await interaction_service.create_comment(db, redis, identity.user_id, video_id, req)) @router_comments.delete("/{comment_id}") async def delete_comment(comment_id: int, db: AsyncSession = Depends(get_db), redis: aioredis.Redis = Depends(get_redis), identity: Identity = Depends(require_user)): return ok(await interaction_service.delete_comment(db, redis, identity.user_id, comment_id))