Files
xiaoxia-saas/apps/api/app/schemas/upload.py
T
xiaoxia 70dde8cbfb
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (push) Successful in 1s
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 3s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 3s
CI/CD Pipeline / Check push changed paths (push) Successful in 8s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 27s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 27s
CI/CD Pipeline / Build Staging API Image (push) Successful in 1m2s
AI Code Review / AI Code Review (pull_request) Failing after 1m43s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Validate - Style (push) Successful in 2m7s
CI/CD Pipeline / Build Staging Worker Image (push) Successful in 31s
CI/CD Pipeline / Validate - Python (mypy + alembic) (push) Successful in 2m15s
CI/CD Pipeline / Integration Tests (push) Successful in 2m47s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m45s
CI/CD Pipeline / Build Staging Web Image (push) Successful in 2m18s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m42s
CI/CD Pipeline / CI Gate (pull_request) Successful in 4s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Successful in 51s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m47s
CI/CD Pipeline / Validate - Security (push) Successful in 4m42s
CI/CD Pipeline / ACR Image Cleanup (push) Successful in 1m33s
CI/CD Pipeline / Frontend Unit Tests (push) Successful in 5m54s
CI/CD Pipeline / Staging API Integration Tests (push) Successful in 3m15s
CI/CD Pipeline / Staging E2E Tests (push) Failing after 5m12s
CI/CD Pipeline / Unit Tests (push) Successful in 10m53s
CI/CD Pipeline / Production Browser E2E (push) Has been skipped
CI/CD Pipeline / Canary Release to Production (push) Failing after 242h41m46s
CI/CD Pipeline / CI Gate (push) Failing after 242h41m50s
CI/CD Pipeline / Build Production Worker Image (push) Failing after 242h41m50s
CI/CD Pipeline / Build Production API Image (push) Failing after 242h41m50s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Failing after 242h48m45s
CI/CD Pipeline / Retag skipped Staging Worker Image (push) Failing after 242h49m48s
CI/CD Pipeline / Retag skipped Staging API Image (push) Failing after 242h49m48s
CI/CD Pipeline / Canary Release to Production (pull_request) Failing after 242h50m30s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 242h50m38s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 242h50m39s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 242h50m45s
CI/CD Pipeline / Build Production Worker Image (pull_request) Failing after 242h52m11s
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Failing after 242h52m30s
CI/CD Pipeline / Build Production Web Image (pull_request) Failing after 242h52m12s
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Failing after 242h52m30s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 242h52m40s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 242h52m41s
CI/CD Pipeline / Integration Tests (pull_request) Failing after 242h52m41s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 242h52m41s
CI/CD Pipeline / Validate - Security (pull_request) Failing after 242h52m42s
CI/CD Pipeline / Validate - Style (pull_request) Failing after 242h52m43s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 242h52m44s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 242h52m45s
CI/CD Pipeline / Frontend Lint (push) Failing after 242h52m46s
CI/CD Pipeline / PR Build Worker Image (push) Failing after 242h52m47s
CI/CD Pipeline / PR Build Web Image (push) Failing after 242h52m47s
CI/CD Pipeline / PR Build API Image (push) Failing after 242h52m47s
CI/CD Pipeline / Check push changed paths (pull_request) Failing after 242h52m47s
CI/CD Pipeline / Check if frontend-only change (push) Failing after 242h52m49s
CI/CD Pipeline / Deploy Production (push) Failing after 243h16m21s
CI/CD Pipeline / Build Production Web Image (push) Failing after 243h16m25s
CI/CD Pipeline / Retag skipped Staging Web Image (push) Failing after 243h24m23s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 243h25m12s
CI/CD Pipeline / Deploy Production (pull_request) Failing after 243h25m19s
CI/CD Pipeline / Build Production API Image (pull_request) Failing after 243h26m47s
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Failing after 243h27m4s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Failing after 243h27m16s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 243h27m19s
feat(#1714): prepare_direct_upload 去重 + 预建 PROCESSING asset 占位 (#1730)
Co-authored-by: xiaoxia <dev@xiaoxiajianji.com>
Co-committed-by: xiaoxia <dev@xiaoxiajianji.com>
2026-09-06 12:31:38 +08:00

57 lines
2.5 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 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 哈希,用于去重检测")
client_upload_id: str = Field(default="", max_length=64, description="客户端幂等 token(同一次上传的重试保持一致)")
class DirectUploadPrepareResponse(BaseModel):
upload_url: str
method: str
storage_key: str
expires_at: str
fields: dict[str, str]
max_size_bytes: int
duplicated: bool = False
skip_transfer: bool = False
asset_id: str = ""
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="文件哈希,用于去重检测")
client_upload_id: str = Field(default="", max_length=64, description="客户端幂等 token(同一次上传的重试保持一致)")
file_size: int = Field(default=0, ge=0, description="文件大小(字节),用于无 hash 时的兜底去重")
class DirectUploadCompleteResponse(BaseModel):
storage_key: str
ingest_job_id: str
duplicated: bool = Field(default=False, description="是否为重复素材/重复 complete(命中幂等去重)")
asset_id: str = Field(default="", description="素材 asset_id(重复 complete 时返回已存在记录)")
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(重复提交时返回已存在记录)")