665228a58f
CI/CD Pipeline / Check if frontend-only change (push) Has been skipped
CI/CD Pipeline / Frontend Lint (push) Has been skipped
CI/CD Pipeline / PR Build API Image (push) Has been skipped
CI/CD Pipeline / PR Build Web Image (push) Has been skipped
CI/CD Pipeline / PR Build Worker Image (push) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (push) Successful in 56s
CI/CD Pipeline / Validate - Migration (alembic) (push) Successful in 2m49s
CI/CD Pipeline / Build Staging API Image (push) Successful in 3m36s
CI/CD Pipeline / Validate - Type Check (mypy) (push) Successful in 3m37s
CI/CD Pipeline / Build Staging Web Image (push) Successful in 6m21s
CI/CD Pipeline / Frontend Unit Tests (push) Successful in 6m20s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Successful in 1m10s
CI/CD Pipeline / ACR Image Cleanup (push) Successful in 54s
CI/CD Pipeline / Staging E2E Tests (push) Failing after 1m49s
CI/CD Pipeline / Validate - Code Quality (push) Successful in 10m53s
CI/CD Pipeline / Staging API Integration Tests (push) Failing after 3m38s
CI/CD Pipeline / Unit Tests (push) Failing after 14m29s
CI/CD Pipeline / Build Production API Image (push) Has been skipped
CI/CD Pipeline / Build Production Web Image (push) Has been skipped
CI/CD Pipeline / Build Production Worker Image (push) Has been skipped
CI/CD Pipeline / Deploy Production (push) Has been skipped
CI/CD Pipeline / Canary Release to Production (push) Has been skipped
CI/CD Pipeline / Production Browser E2E (push) Has been skipped
CI/CD Pipeline / Integration Tests (push) Failing after 7m28s
CI/CD Pipeline / CI Gate (push) Has been skipped
前端: - 删除 uploadAsset 函数(upload.ts)和 export(index.ts) - 删除 UploadResult type export - CloneModal/useCloneSubmit 改用 uploadAssetDirect - DirectUploadCompleteResult 新增 url 字段 - 清理测试文件中 uploadAsset 引用 后端: - DirectUploadCompleteResponse 新增 url 字段 - complete_direct_upload 返回 OSS 文件 URL - 修复 FFmpeg 超时日志 300s → 900s
51 lines
2.0 KiB
Python
51 lines
2.0 KiB
Python
from pydantic import BaseModel, Field
|
||
|
||
|
||
class UploadAssetRequest(BaseModel):
|
||
"""素材上传请求(multipart form)"""
|
||
|
||
project_id: str = Field(..., min_length=1, description="项目 ID")
|
||
library_id: str = Field(..., min_length=1, description="素材库 ID")
|
||
file_hash: str = Field(default="", max_length=64, description="文件 MD5 哈希,用于去重检测")
|
||
|
||
|
||
class DirectUploadPrepareRequest(BaseModel):
|
||
project_id: str = Field(..., min_length=1)
|
||
library_id: str = Field(..., min_length=1)
|
||
filename: str = Field(..., min_length=1, max_length=255)
|
||
content_type: str = Field(default="application/octet-stream", min_length=1, max_length=100)
|
||
file_size: int = Field(..., gt=0)
|
||
file_hash: str = Field(default="", max_length=64, description="文件 MD5 哈希,用于去重检测")
|
||
|
||
|
||
class DirectUploadPrepareResponse(BaseModel):
|
||
upload_url: str
|
||
method: str
|
||
storage_key: str
|
||
expires_at: str
|
||
fields: dict[str, str]
|
||
max_size_bytes: int
|
||
|
||
|
||
class DirectUploadCompleteRequest(BaseModel):
|
||
project_id: str = Field(..., min_length=1)
|
||
library_id: str = Field(..., min_length=1)
|
||
storage_key: str = Field(..., min_length=1, max_length=255)
|
||
file_hash: str = Field(default="", max_length=64, description="文件 MD5 哈希,用于去重检测")
|
||
|
||
|
||
class DirectUploadCompleteResponse(BaseModel):
|
||
storage_key: str
|
||
ingest_job_id: str
|
||
duplicated: bool = Field(default=False, description="是否为重复素材(命中去重)")
|
||
asset_id: str = Field(default="", description="重复素材的 asset_id(duplicated=true 时返回)")
|
||
url: str = Field(default="", description="Public URL of uploaded file")
|
||
|
||
|
||
class UploadAssetResponse(BaseModel):
|
||
storage_key: str
|
||
ingest_job_id: str
|
||
url: str = Field(..., description="Public URL of uploaded file")
|
||
duplicated: bool = Field(default=False, description="是否为重复素材(命中去重)")
|
||
asset_id: str = Field(default="", description="重复素材的 asset_id(duplicated=true 时返回)")
|