ebacf01742
Co-authored-by: exinglang <exinglang@qq.com> Reviewed-on: #200 Co-authored-by: zuochenyong <zuochenyong@wonderable.ai> Co-committed-by: zuochenyong <zuochenyong@wonderable.ai>
80 lines
2.5 KiB
Python
80 lines
2.5 KiB
Python
"""引导视频 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)
|