Files
john 1aaef71f52 Initial commit: Happy Up monorepo through Sprint 5.
Document-driven MVP with FastAPI backend, Vue H5, WeChat mini shell, product demo, and Docker dev stack.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-23 11:42:40 +08:00

71 lines
2.2 KiB
Python

from fastapi import APIRouter, Depends, Header, Request
from fastapi.responses import JSONResponse, Response
from sqlalchemy.orm import Session
from app.core.response import error, ok
from app.db.models import User
from app.db.session import get_db
from app.deps import get_current_user
from app.schemas.models import UploadTokenRequest, VideoCreateRequest
from app.services import videos as video_service
router = APIRouter(prefix="/api/videos", tags=["Videos"])
@router.post("/upload-token")
def create_upload_token(
body: UploadTokenRequest,
request: Request,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user),
):
if not video_service.verify_child_owner(db, current_user.id, body.child_id):
return JSONResponse(
status_code=404,
content=error(10004, "child_not_found", request.state.request_id),
)
data = video_service.create_upload_token(body)
return ok(data, request_id=request.state.request_id)
@router.put("/direct-upload")
async def direct_upload(
request: Request,
x_upload_token: str = Header(..., alias="X-Upload-Token"),
x_object_key: str = Header(..., alias="X-Object-Key"),
):
data = await request.body()
try:
video_service.save_direct_upload(x_upload_token, x_object_key, data)
except ValueError:
return JSONResponse(
status_code=403,
content=error(10011, "invalid_upload_token", request.state.request_id),
)
return Response(status_code=204)
@router.post("", status_code=201)
def register_video(
body: VideoCreateRequest,
request: Request,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user),
):
video, err = video_service.register_video(db, current_user.id, body)
if err == "child_not_found":
return JSONResponse(
status_code=404,
content=error(10004, "child_not_found", request.state.request_id),
)
if err == "duplicate":
return JSONResponse(
status_code=409,
content=error(10005, "duplicate_video", request.state.request_id),
)
return ok(
{"id": video.id, "status": video.status},
message="created",
request_id=request.state.request_id,
)