Files
xiaoxia-saas/apps/api/app/api/router.py
T
灵应 2d83b9385c
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 8s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 8s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m33s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 3m26s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 49s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 1m13s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 3m37s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m54s
CI/CD Pipeline / Validate - Style (pull_request) Has been cancelled
CI/CD Pipeline / Validate - Security (pull_request) Has been cancelled
CI/CD Pipeline / Unit Tests (pull_request) Has been cancelled
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been cancelled
CI/CD Pipeline / Build Production API Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Web Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been cancelled
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Has been cancelled
AI Code Review / AI Code Review (pull_request) Has been cancelled
PR Automation / Auto Merge on CI Green + Approved (pull_request) Has been cancelled
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 29h56m48s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 29h59m14s
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Failing after 29h58m34s
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Failing after 29h58m35s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 29h58m38s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 29h58m38s
CI/CD Pipeline / Check push changed paths (pull_request) Failing after 29h58m42s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 29h55m10s
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 29h55m52s
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Failing after 29h58m34s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 29h55m9s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 29h55m50s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 29h56m13s
fix(p0): #1919 from-assets空templateId双斜杠404兜底
根因:
1. PR#1918清理模板API时误删了GET /templates中自动创建默认模板的兜底逻辑
2. 前端PR#1913去掉空tid拦截后,首次进入生成页templateId为空,导致URL出现双斜杠
   /templates//editor/clips/from-assets → FastAPI返回404

修复:
1. 新增 routes/_default_template.py 共享 get_or_create_default_template_id()
2. GET /templates 在列表查询前调用兜底逻辑,保证新用户总能拿到默认模板
3. dependencies.py 抽出纯函数 resolve_draft_plan_id(),支持空tid自动兜底
4. 新增独立端点 POST /api/v1/clips/from-assets,template_id从body传入(可选)
   空时后端自动兜底,彻底规避双斜杠URL问题
5. 保留原 /templates/{template_id}/editor/clips/from-assets 路径兼容旧调用

前端改造指引:useStep2Materials 发from-assets请求时,空tid直接调用新端点
POST /api/v1/clips/from-assets,body中可选传template_id字段。
2026-09-15 09:22:01 +08:00

197 lines
5.5 KiB
Python
Executable File

from app.api.routes.ai import router as ai_router
from app.api.routes.ai_avatar_render import router as ai_avatar_render_router
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.cover_templates import router as cover_templates_router
from app.api.routes.duplication import router as duplication_router
from app.api.routes.feature_flags import router as feature_flags_router
from app.api.routes.generation_cover import router as generation_cover_router
from app.api.routes.generation_preview import router as generation_preview_router
from app.api.routes.generation_tasks import router as generation_tasks_router
from app.api.routes.generation_variant_plans import router as generation_variant_plans_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.internal_render import router as internal_render_router
from app.api.routes.lipsync import router as lipsync_router
from app.api.routes.projects import router as projects_router
from app.api.routes.scripts import router as scripts_router
from app.api.routes.share import router as share_router
from app.api.routes.subscription import router as subscription_router
from app.api.routes.tags import router as tags_router
from app.api.routes.task_center import router as task_center_router
from app.api.routes.templates import router as templates_router
from app.api.routes.clips_standalone import router as clips_standalone_router
from app.api.routes.templates_editor import router as templates_editor_router
from app.api.routes.titles import router as titles_router
from app.api.routes.tts import router as tts_router
from app.api.routes.upload import router as upload_router
from app.api.routes.videos import router as videos_router
from app.api.routes.voice_clones import router as voice_clones_router
from app.api.routes.voices import router as voices_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(
lipsync_router,
prefix="/lipsync",
tags=["Lipsync"],
)
api_router.include_router(
projects_router,
prefix="/projects",
tags=["Project"],
)
api_router.include_router(
tags_router,
prefix="/tags",
tags=["Tag"],
)
api_router.include_router(
cover_templates_router,
tags=["CoverTemplate"],
)
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(
generation_preview_router,
prefix="/generation",
tags=["Generation"],
)
api_router.include_router(
generation_variant_plans_router,
prefix="/generation",
tags=["Generation"],
)
api_router.include_router(
generation_cover_router,
prefix="/generation",
tags=["Generation"],
)
api_router.include_router(
titles_router,
prefix="/titles",
tags=["TitleLibrary"],
)
api_router.include_router(
voices_router,
prefix="/voices",
tags=["VoiceLibrary"],
)
api_router.include_router(
voice_clones_router,
prefix="/voice-clones",
tags=["VoiceClone"],
)
api_router.include_router(
videos_router,
tags=["VideoCenter"],
)
api_router.include_router(
share_router,
tags=["Share"],
)
api_router.include_router(
duplication_router,
prefix="/duplication",
tags=["Duplication"],
)
api_router.include_router(
subscription_router,
prefix="/subscription",
tags=["Subscription"],
)
api_router.include_router(
templates_router,
prefix="/templates",
tags=["Template"],
)
api_router.include_router(
clips_standalone_router,
tags=["Clips"],
)
api_router.include_router(
templates_editor_router,
prefix="/templates/{template_id}/editor",
tags=["TemplateEditor"],
)
api_router.include_router(
tts_router,
prefix="/tts",
tags=["TTS"],
)
api_router.include_router(
ai_router,
prefix="/ai",
tags=["AI"],
)
api_router.include_router(
feature_flags_router,
tags=["Internal"],
)
api_router.include_router(
internal_render_router,
tags=["Internal"],
)
api_router.include_router(
scripts_router,
prefix="/scripts",
tags=["ScriptLibrary"],
)
api_router.include_router(
ai_avatar_render_router,
prefix="/ai-avatar/render",
tags=["AI Avatar Render"],
)