"""引导视频 prepare/start/reward 客户端 API。""" from __future__ import annotations import logging from fastapi import APIRouter, Depends, HTTPException from app.api.deps import CurrentUser, DbSession from app.core.ratelimit import rate_limit from app.repositories import guide_video as crud_guide from app.schemas.guide_video import ( GuideVideoPrepareIn, GuideVideoPrepareOut, GuideVideoRewardIn, GuideVideoRewardOut, GuideVideoStartIn, GuideVideoStartOut, ) logger = logging.getLogger("shagua.guide_video") router = APIRouter(prefix="/api/v1/guide-video", tags=["guide-video"]) @router.post( "/prepare", response_model=GuideVideoPrepareOut, dependencies=[Depends(rate_limit(60, 60, "guide-video-prepare"))], ) def prepare( payload: GuideVideoPrepareIn, user: CurrentUser, db: DbSession ) -> GuideVideoPrepareOut: result = crud_guide.prepare_play(db, user.id, scene=payload.scene) logger.info( "guide video prepare user_id=%d scene=%s should_play=%s reason=%s", user.id, payload.scene, result["should_play"], result["reason"], ) return GuideVideoPrepareOut(**result) @router.post( "/start", response_model=GuideVideoStartOut, dependencies=[Depends(rate_limit(60, 60, "guide-video-start"))], ) def start( payload: GuideVideoStartIn, user: CurrentUser, db: DbSession ) -> GuideVideoStartOut: try: result = crud_guide.start_play(db, user.id, play_token=payload.play_token) except crud_guide.PlayStateError as exc: status_code = 404 if exc.code == "play_not_found" else 409 raise HTTPException(status_code=status_code, detail=exc.detail()) from exc logger.info( "guide video start user_id=%d token=%s status=%s seq=%d", user.id, payload.play_token[:12], result["status"], result["seq"], ) return GuideVideoStartOut(**result) @router.post( "/reward", response_model=GuideVideoRewardOut, dependencies=[Depends(rate_limit(120, 60, "guide-video-reward"))], ) def reward( payload: GuideVideoRewardIn, user: CurrentUser, db: DbSession ) -> GuideVideoRewardOut: result = crud_guide.grant_circle( db, user.id, play_token=payload.play_token, circle=payload.circle, ) logger.info( "guide video reward user_id=%d token=%s circle=%d status=%s granted=%s", user.id, payload.play_token[:12], payload.circle, result["status"], result["granted"], ) return GuideVideoRewardOut(**result)