Files
xiaoxia-saas/apps/api/app/api/routes/upload.py
T
2026-06-21 02:02:55 +08:00

50 lines
1.7 KiB
Python

from fastapi import APIRouter, Depends, File, Form, UploadFile
from uuid import uuid4
from app.core.celery_app import celery_app
from app.core.storage import MinIOService, get_minio_service
from app.dependencies import get_ingest_job_repository
from app.schemas.upload import UploadAssetResponse
from typing import Any
from packages.application import SubmitIngestJobCommand, SubmitIngestJobUseCase
router = APIRouter()
@router.post("", response_model=UploadAssetResponse)
async def upload_asset(
file: UploadFile = File(..., description="要上传的文件(视频、音频、图片等)"),
workspace_id: str = Form(..., description="工作空间 ID"),
project_id: str = Form(..., description="项目 ID"),
library_id: str = Form(..., description="素材库 ID"),
ingest_job_repository: Any = Depends(get_ingest_job_repository),
storage_service: MinIOService = Depends(get_minio_service),
) -> UploadAssetResponse:
"""上传素材文件并触发导入流水线。"""
file_id = uuid4().hex[:8]
storage_key = f"uploads/{file_id}/{file.filename}"
file_url = storage_service.upload_file(
file.file,
storage_key,
content_type=file.content_type or "application/octet-stream",
)
use_case = SubmitIngestJobUseCase(ingest_job_repository)
job = use_case.execute(
SubmitIngestJobCommand(
workspace_id=workspace_id,
project_id=project_id,
library_id=library_id,
storage_key=storage_key,
)
)
celery_app.send_task("worker.ingest_asset", args=[job.id])
return UploadAssetResponse(
storage_key=storage_key,
ingest_job_id=job.id,
url=file_url,
)