fix: generation_tasks results 端点返回 OSS 预签名 URL(24h 有效期)
CI/CD Pipeline / Production Browser E2E (pull_request) Failing after 1636h2m5s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 1636h2m7s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 1636h2m7s
CI/CD Pipeline / Build Production Runtime Images (pull_request) Failing after 1636h2m8s
CI/CD Pipeline / Build & Push Staging (Watchtower auto-deploy) (pull_request) Failing after 1636h2m8s
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Failing after 1636h33m38s
CI/CD Pipeline / Production Browser E2E (pull_request) Failing after 1636h2m5s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 1636h2m7s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 1636h2m7s
CI/CD Pipeline / Build Production Runtime Images (pull_request) Failing after 1636h2m8s
CI/CD Pipeline / Build & Push Staging (Watchtower auto-deploy) (pull_request) Failing after 1636h2m8s
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Failing after 1636h33m38s
P0-2 修复:list_generation_results 端点原先直接返回原始 file_url, OSS bucket 为 private 导致前端访问视频返回 403。 改动: - 注入 storage_service 依赖(复用已有 OSSStorageService.get_download_url) - 对每个视频的 file_url 生成预签名 URL,有效期 86400 秒(24h) - _to_generated_video_response 支持 download_url 参数 - 与 generated_videos.py 中的模式保持一致 新增测试: - test_results_endpoint_generates_presigned_urls:验证预签名 URL 生成 - test_results_endpoint_handles_empty_videos:验证空结果正常返回 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -4,6 +4,7 @@ from typing import Any
|
||||
|
||||
from app.auth import AuthenticatedUser, get_current_user
|
||||
from app.core.celery_app import celery_app
|
||||
from app.core.storage import OSSStorageService, get_storage_service
|
||||
from app.dependencies import (
|
||||
get_asset_library_repository,
|
||||
get_asset_repository,
|
||||
@@ -63,7 +64,7 @@ def _to_generation_task_response(task) -> GenerationTaskResponse:
|
||||
)
|
||||
|
||||
|
||||
def _to_generated_video_response(item) -> GeneratedVideoResponse:
|
||||
def _to_generated_video_response(item, download_url: str | None = None) -> GeneratedVideoResponse:
|
||||
return GeneratedVideoResponse(
|
||||
id=item.id,
|
||||
project_id=item.project_id,
|
||||
@@ -76,6 +77,7 @@ def _to_generated_video_response(item) -> GeneratedVideoResponse:
|
||||
width=item.width,
|
||||
height=item.height,
|
||||
fps=item.fps,
|
||||
download_url=download_url,
|
||||
)
|
||||
|
||||
|
||||
@@ -265,6 +267,7 @@ def list_generation_results(
|
||||
generation_task_repository: Any = Depends(get_generation_task_repository),
|
||||
generated_video_repository: Any = Depends(get_generated_video_repository),
|
||||
project_repository: Any = Depends(get_project_repository),
|
||||
storage_service: OSSStorageService = Depends(get_storage_service),
|
||||
) -> ListGeneratedVideosResponse:
|
||||
task = generation_task_repository.get(task_id)
|
||||
if task is None:
|
||||
@@ -273,7 +276,11 @@ def list_generation_results(
|
||||
_check_project_access(task.project_id, authenticated_user.user.id, project_repository)
|
||||
use_case = ListGeneratedVideosByTaskUseCase(generated_video_repository)
|
||||
items = use_case.execute(task_id)
|
||||
return ListGeneratedVideosResponse(items=[_to_generated_video_response(item) for item in items])
|
||||
responses = []
|
||||
for item in items:
|
||||
download_url = storage_service.get_download_url(item.file_url, expires_seconds=86400)
|
||||
responses.append(_to_generated_video_response(item, download_url=download_url))
|
||||
return ListGeneratedVideosResponse(items=responses)
|
||||
|
||||
|
||||
@router.post("/tasks/{task_id}/retry", response_model=GenerationTaskResponse)
|
||||
|
||||
Reference in New Issue
Block a user