Files
video-gen/video-gen-api/app/api/v1/recent_generation.py
T

104 lines
4.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from __future__ import annotations
from typing import Annotated
from fastapi import APIRouter, Depends, Query
from sqlalchemy.ext.asyncio import AsyncSession
from app.dependencies import get_current_user, get_db
from app.enums.recent_generation import RecentGenerationModuleEnum
from app.models.user import User
from app.schemas.recent_generation import RecentGenerationGroupOut
from app.services.recent_generation_service import (
DEFAULT_RECENT_GENERATION_LIMIT,
MAX_RECENT_GENERATION_LIMIT,
list_recent_generations,
)
router = APIRouter(
prefix="/recent-generations",
tags=["recent-generations"],
)
@router.get(
"",
response_model=RecentGenerationGroupOut,
summary="获取当前用户各模块最近生成记录",
description=(
"获取当前登录用户在多个生成模块下最近生成成功的图片/视频记录。"
"返回结构固定为 project、chat_ai、hot_opening_replicate、shot_replicate 四个数组。"
"modules 不传时查询全部模块;modules 可重复传参指定一个或多个模块,例如 "
"?modules=project&modules=chat_ai。"
"limit 表示每个模块最多返回多少条,默认 5 条,最大 100 条。"
"接口只查询和返回展示所需轻量字段,不返回 prompt、engine_snapshot、provider_response_json 等大字段。"
),
responses={
200: {
"description": "查询成功,固定返回四个模块数组;没有数据的模块返回空数组。",
"content": {
"application/json": {
"example": {
"project": [],
"chat_ai": [],
"hot_opening_replicate": [],
"shot_replicate": [
{
"generated_time": "2026-06-26T14:30:00",
"result_url": "https://example.com/generate/video/demo.mp4?exp=1780000000&sign=xxxx",
"cover_url": "https://example.com/generate/cover/demo.jpg?exp=1780000000&sign=xxxx",
"module": "shot_replicate",
"shot_task_set_id": "0019ef0000000000001",
"shot_segment_id": "0019ef0000000000002",
"module_project_id": "0019ef0000000000003",
"module_step_id": "0019ef0000000000004",
"generation_id": "0019ef0000000000005",
"resource_type": "video",
}
],
}
}
},
},
401: {"description": "未登录或 Token 无效"},
403: {"description": "账号需要先设置登录密码或无权限"},
422: {"description": "参数校验失败,例如 limit 超出范围或 modules 枚举值非法"},
},
)
async def get_recent_generations(
limit: Annotated[
int,
Query(
ge=1,
le=MAX_RECENT_GENERATION_LIMIT,
description=(
"每个模块返回的最近生成记录数量,默认 5,最大 100。"
"例如 limit=10 表示 project/chat_ai/hot_opening_replicate/shot_replicate 每个模块最多返回 10 条。"
),
examples=[DEFAULT_RECENT_GENERATION_LIMIT],
),
] = DEFAULT_RECENT_GENERATION_LIMIT,
modules: Annotated[
list[RecentGenerationModuleEnum] | None,
Query(
description=(
"模块枚举,可不传或重复传参。"
"不传表示查询全部模块。"
"可选值:"
"project=项目生成 GenerationRecord"
"chat_ai=AI创作 ChatGenerationTask.generation_mode=chatapi_async"
"hot_opening_replicate=爆款开头复刻 ChatGenerationTask.generation_mode=hot_opening_replicate"
"shot_replicate=拆镜复刻 ChatGenerationTask.generation_mode=shot_replicate。"
),
examples=[["project", "chat_ai"]],
),
] = None,
current_user: User = Depends(get_current_user),
db: AsyncSession = Depends(get_db),
) -> RecentGenerationGroupOut:
return await list_recent_generations(
db,
user_id=current_user.id,
modules=modules,
limit=limit,
)