feat: integrate MinIO for real file storage
Tests / test (push) Failing after 30s
Tests / lint (push) Failing after 30s

This commit is contained in:
Xiaoxia AI
2026-06-15 18:19:12 +08:00
parent 3b8ff2ddae
commit ba159549e2
4 changed files with 139 additions and 25 deletions
+26 -16
View File
@@ -1,8 +1,10 @@
from fastapi import APIRouter, Depends
from fastapi import APIRouter, Depends, UploadFile, File, Form
from uuid import uuid4
from typing import Optional
from app.dependencies import get_ingest_job_repository
from app.schemas.upload import UploadAssetRequest, UploadAssetResponse
from app.core.storage import get_minio_service, MinIOService
from app.schemas.upload import UploadAssetResponse
from packages.adapters.in_memory import InMemoryIngestJobRepository
from packages.application import SubmitIngestJobCommand, SubmitIngestJobUseCase
from apps.worker.worker_app.tasks.ingest import ingest_asset
@@ -11,35 +13,42 @@ router = APIRouter()
@router.post("", response_model=UploadAssetResponse)
def upload_asset(
request: UploadAssetRequest,
async def upload_asset(
file: UploadFile = File(...),
workspace_id: str = Form(...),
project_id: str = Form(...),
library_id: str = Form(...),
ingest_job_repository: InMemoryIngestJobRepository = Depends(get_ingest_job_repository),
storage_service: MinIOService = Depends(get_minio_service),
) -> UploadAssetResponse:
"""
Upload asset and trigger ingest pipeline.
Real implementation would:
Real implementation:
1. Accept multipart/form-data with file
2. Store file to object storage (S3, MinIO, etc.)
2. Store file to MinIO object storage
3. Generate storage_key
4. Submit ingest job
5. Enqueue worker task
Mock implementation:
1. Generate mock storage_key
2. Submit ingest job
3. Enqueue worker task
"""
# Mock storage: generate storage_key
storage_key = f"uploads/{uuid4().hex[:8]}/{request.filename}"
# Generate storage key
file_id = uuid4().hex[:8]
storage_key = f"uploads/{file_id}/{file.filename}"
# Upload file to MinIO
file_url = storage_service.upload_file(
file.file,
storage_key,
content_type=file.content_type or "application/octet-stream",
)
# Submit ingest job
use_case = SubmitIngestJobUseCase(ingest_job_repository)
job = use_case.execute(
SubmitIngestJobCommand(
workspace_id=request.workspace_id,
project_id=request.project_id,
library_id=request.library_id,
workspace_id=workspace_id,
project_id=project_id,
library_id=library_id,
storage_key=storage_key,
)
)
@@ -50,4 +59,5 @@ def upload_asset(
return UploadAssetResponse(
storage_key=storage_key,
ingest_job_id=job.id,
url=file_url,
)