312dad7497
六边形架构分层实现:
Domain 层:
- DuplicationRecord / DuplicateSegment 实体
- 状态机生命周期 (pending→processing→completed/failed)
Ports 层:
- DuplicationRecordRepository Protocol
Adapters 层:
- SQLAlchemyDuplicationRecordRepository 完整实现
- DuplicationRecordModel / DuplicationSegmentModel ORM 模型
Application 层:
- UploadForDuplicationUseCase (上传查重)
- ListDuplicationRecordsUseCase (记录列表)
- GetDuplicationDetailUseCase (详情查询)
- DeleteDuplicationRecordUseCase (删除)
- RetryDuplicationUseCase (重新查重)
API 层:
- POST /api/v1/duplication/upload (上传视频查重)
- GET /api/v1/duplication/records (记录列表)
- GET /api/v1/duplication/records/{id} (详情含片段)
- DELETE /api/v1/duplication/records/{id} (删除)
- POST /api/v1/duplication/records/{id}/retry (重新查重)
Alembic 迁移:
- 011_add_duplication_tables.py (duplication_records + duplication_segments)
API 契约与前端 feat/phase2-duplication-ui (PR#75) 完全对齐。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
95 lines
2.7 KiB
Python
95 lines
2.7 KiB
Python
from app.api.routes.asset_diagnosis import router as asset_diagnosis_router
|
|
from app.api.routes.asset_libraries import router as asset_libraries_router
|
|
from app.api.routes.assets import router as assets_router
|
|
from app.api.routes.auth import router as auth_router
|
|
from app.api.routes.chunked_upload import router as chunked_upload_router
|
|
from app.api.routes.classification_jobs import router as classification_jobs_router
|
|
from app.api.routes.duplication import router as duplication_router
|
|
from app.api.routes.generated_videos import router as generated_videos_router
|
|
from app.api.routes.titles import router as titles_router
|
|
from app.api.routes.voices import router as voices_router
|
|
from app.api.routes.generation_tasks import router as generation_tasks_router
|
|
from app.api.routes.health import router as health_check_router
|
|
from app.api.routes.ingest_jobs import router as ingest_jobs_router
|
|
from app.api.routes.projects import router as projects_router
|
|
from app.api.routes.task_center import router as task_center_router
|
|
from app.api.routes.upload import router as upload_router
|
|
from fastapi import APIRouter
|
|
|
|
api_router = APIRouter(prefix="/api/v1")
|
|
health_router = APIRouter()
|
|
health_router.include_router(health_check_router)
|
|
|
|
api_router.include_router(
|
|
auth_router,
|
|
tags=["Auth"],
|
|
)
|
|
api_router.include_router(
|
|
projects_router,
|
|
prefix="/projects",
|
|
tags=["Project"],
|
|
)
|
|
api_router.include_router(
|
|
task_center_router,
|
|
tags=["TaskCenter"],
|
|
)
|
|
api_router.include_router(
|
|
asset_diagnosis_router,
|
|
tags=["AssetDiagnosis"],
|
|
)
|
|
api_router.include_router(
|
|
asset_libraries_router,
|
|
prefix="/asset-libraries",
|
|
tags=["AssetLibrary"],
|
|
)
|
|
api_router.include_router(
|
|
assets_router,
|
|
prefix="/assets",
|
|
tags=["Asset"],
|
|
)
|
|
api_router.include_router(
|
|
ingest_jobs_router,
|
|
prefix="/ingest-jobs",
|
|
tags=["IngestJob"],
|
|
)
|
|
api_router.include_router(
|
|
classification_jobs_router,
|
|
prefix="/classification-jobs",
|
|
tags=["ClassificationJob"],
|
|
)
|
|
api_router.include_router(
|
|
upload_router,
|
|
prefix="/upload",
|
|
tags=["Upload"],
|
|
)
|
|
api_router.include_router(
|
|
chunked_upload_router,
|
|
prefix="/upload/chunk",
|
|
tags=["ChunkedUpload"],
|
|
)
|
|
api_router.include_router(
|
|
generation_tasks_router,
|
|
prefix="/generation",
|
|
tags=["Generation"],
|
|
)
|
|
api_router.include_router(
|
|
generated_videos_router,
|
|
prefix="/generated-videos",
|
|
tags=["GeneratedVideo"],
|
|
)
|
|
api_router.include_router(
|
|
titles_router,
|
|
prefix="/titles",
|
|
tags=["TitleLibrary"],
|
|
)
|
|
api_router.include_router(
|
|
voices_router,
|
|
prefix="/voices",
|
|
tags=["VoiceLibrary"],
|
|
)
|
|
api_router.include_router(
|
|
duplication_router,
|
|
prefix="/duplication",
|
|
tags=["Duplication"],
|
|
)
|