From 8a0358b9bfcfa504b5f179a2fe25b4779503b103 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Tue, 18 Aug 2026 13:03:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=20POST=20/assets/bat?= =?UTF-8?q?ch=20=E6=89=B9=E9=87=8F=E8=8E=B7=E5=8F=96=E7=B4=A0=E6=9D=90?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 前端 usePreviewAssets.ts 调用 POST /assets/batch 时返回 405 Method Not Allowed, 原因是后端没有 /batch GET/POST 端点,请求命中了 GET /{asset_id}(batch 被当成 asset_id)。 新增: - BatchGetRequest schema:接收 { ids: string[] },最多 200 个 ID - POST /assets/batch 端点:调用 asset_repository.find_by_ids() 批量查询 - 返回 List[AssetResponse],包含 file_url、duration、width、height 等完整元数据 改动文件: - apps/api/app/schemas/asset.py:新增 BatchGetRequest - apps/api/app/api/routes/assets.py:新增 batch_get_assets 端点 --- apps/api/app/api/routes/assets.py | 15 ++++++++++++++- apps/api/app/schemas/asset.py | 6 ++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/apps/api/app/api/routes/assets.py b/apps/api/app/api/routes/assets.py index 2cbfaf184..0ea6e54cc 100755 --- a/apps/api/app/api/routes/assets.py +++ b/apps/api/app/api/routes/assets.py @@ -1,5 +1,5 @@ import logging -from typing import Any, Optional +from typing import Any, List, Optional from app.api.routes._helpers import check_project_access, format_utc_datetime from app.auth import AuthenticatedUser, get_current_user @@ -14,6 +14,7 @@ from app.schemas.asset import ( AssetResponse, BatchClassifyRequest, BatchDeleteRequest, + BatchGetRequest, BatchMarkRequest, BatchOperationResponse, BatchTagRequest, @@ -370,6 +371,18 @@ def update_asset_review_status( return _to_asset_response(updated) +@router.post("/batch", response_model=List[AssetResponse]) +def batch_get_assets( + request: BatchGetRequest, + authenticated_user: AuthenticatedUser = Depends(get_current_user), + asset_repository: Any = Depends(get_asset_repository), +) -> list[AssetResponse]: + """批量获取素材详情(根据 ID 列表)。""" + items = asset_repository.find_by_ids(request.ids) + storage_service = get_storage_service() + return [_to_asset_response(item, storage_service) for item in items] + + @router.post("/batch-delete", response_model=BatchOperationResponse) def batch_delete_assets( request: BatchDeleteRequest, diff --git a/apps/api/app/schemas/asset.py b/apps/api/app/schemas/asset.py index 528a77f3d..2532467d0 100755 --- a/apps/api/app/schemas/asset.py +++ b/apps/api/app/schemas/asset.py @@ -58,6 +58,12 @@ class AssetResponse(BaseModel): MAX_BATCH_SIZE = 200 +class BatchGetRequest(BaseModel): + """批量获取素材详情请求。""" + + ids: list[str] = Field(..., min_length=1, max_length=MAX_BATCH_SIZE, description="素材 ID 列表") + + class BatchDeleteRequest(BaseModel): """批量删除请求(软删除)。""" -- 2.54.0