Files
video/server/app/api/v1/interactions.py
2026-10-15 20:36:59 +08:00

56 lines
2.6 KiB
Python

"""互动模块路由(对应《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))