104 lines
4.4 KiB
Python
104 lines
4.4 KiB
Python
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,
|
||
) |