import uuid from typing import Any from fastapi import APIRouter, Query from fastapi.responses import JSONResponse from sqlalchemy import func from sqlmodel import select from app.api.deps import SessionDep from app.models import ( UserClipListenRecord, UserClipListenRecordCreate, UserClipListenRecordsPublic, ) router = APIRouter() @router.post("/clip_listen_records") def create_user_clip_listen_record(*, session: SessionDep, play_history_record_in: UserClipListenRecordCreate) -> Any: """Add clip to users play history.""" raw_data = play_history_record_in.model_dump() user_clip_listen_record_data = { "public_id": f"evt-{uuid.uuid4()}", "clip_id": raw_data["clip_id"], "user_id": raw_data["user_id"], "clip_dislike_count": raw_data["clip_data"].get("dislike_count"), "clip_flag_count": raw_data["clip_data"].get("flag_count"), "clip_play_count": raw_data["clip_data"].get("play_count"), "clip_skip_count": raw_data["clip_data"].get("skip_count"), "clip_upvote_count": raw_data["clip_data"].get("upvote_count"), "clip_model_name": raw_data["clip_data"].get("model_name"), } db_obj = UserClipListenRecord.model_validate(user_clip_listen_record_data) session.add(db_obj) session.commit() session.refresh(db_obj) return JSONResponse(content={"status": "ok"}) @router.get("/clip_listen_records/{user_id}", response_model=UserClipListenRecordsPublic) def get_user_clip_listen_records(*, session: SessionDep, user_id: int, offset: int = 0, limit: int = Query(default=100, le=100)) -> Any: """Get user's clip listen records.""" clip_listen_records = session.exec( select(UserClipListenRecord) .where(UserClipListenRecord.user_id == user_id) .order_by(UserClipListenRecord.created_at.desc()) .offset(offset) .limit(limit) ).all() clip_listen_records_count = session.exec( select(func.count(UserClipListenRecord.id)) .where( UserClipListenRecord.user_id == user_id ) ).one() return { "clip_listen_records": clip_listen_records, "count": clip_listen_records_count, "offset": offset, "limit": limit }