352221f199
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (push) Successful in 2s
CI/CD Pipeline / Check push changed paths (push) Successful in 16s
CI/CD Pipeline / Build Staging Web Image (push) Successful in 2m0s
CI/CD Pipeline / Frontend Unit Tests (push) Failing after 2m42s
CI/CD Pipeline / Integration Tests (push) Successful in 3m50s
CI/CD Pipeline / Build Staging API Image (push) Successful in 3m35s
CI/CD Pipeline / Validate - Style (push) Successful in 4m42s
CI/CD Pipeline / Build Staging Worker Image (push) Successful in 4m29s
CI/CD Pipeline / Validate - Python (mypy + alembic) (push) Successful in 5m0s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Successful in 43s
CI/CD Pipeline / ACR Image Cleanup (push) Successful in 1m47s
CI/CD Pipeline / Staging API Integration Tests (push) Successful in 3m5s
CI/CD Pipeline / Staging E2E Tests (push) Failing after 3m10s
CI/CD Pipeline / Validate - Security (push) Successful in 11m12s
CI/CD Pipeline / Unit Tests (push) Successful in 11m18s
CI/CD Pipeline / Production Browser E2E (push) Has been skipped
CI/CD Pipeline / CI Gate (push) Failing after 27h18m15s
CI/CD Pipeline / Build Production API Image (push) Failing after 27h18m15s
CI/CD Pipeline / Frontend Lint (push) Failing after 27h29m35s
CI/CD Pipeline / Retag skipped Staging API Image (push) Failing after 27h24m8s
CI/CD Pipeline / PR Build Worker Image (push) Failing after 27h28m58s
CI/CD Pipeline / PR Build API Image (push) Failing after 27h29m0s
CI/CD Pipeline / Deploy Production (push) Failing after 27h17m36s
CI/CD Pipeline / Build Production Worker Image (push) Failing after 27h17m38s
CI/CD Pipeline / Build Production Web Image (push) Failing after 27h17m38s
CI/CD Pipeline / Canary Release to Production (push) Failing after 27h17m36s
CI/CD Pipeline / Retag skipped Staging Worker Image (push) Failing after 27h24m7s
CI/CD Pipeline / Retag skipped Staging Web Image (push) Failing after 27h24m8s
CI/CD Pipeline / PR Build Web Image (push) Failing after 27h28m58s
CI/CD Pipeline / Check if frontend-only change (push) Failing after 27h29m0s
Co-authored-by: xiaoxia <dev@xiaoxiajianji.com> Co-committed-by: xiaoxia <dev@xiaoxiajianji.com>
69 lines
2.8 KiB
Python
69 lines
2.8 KiB
Python
"""Template 列表路由(供生成页自动选模板).
|
||
|
||
保留:
|
||
- GET /templates:列表查询(生成页使用)
|
||
- 默认模板自动创建兜底逻辑(复用 _default_template.get_or_create_default_template_id)
|
||
|
||
其他模板 CRUD / 分类 / 标签 / 收藏 / 复制 / 校验 / 使用统计等 HTTP 端点
|
||
已在 PR#1918 中删除(前端 PR#1911 已删除 my-templates / editing-planner /
|
||
templates 管理页面)。
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import logging
|
||
|
||
from app.auth import AuthenticatedUser, get_current_user
|
||
from app.dependencies import get_db_session
|
||
from app.schemas.template import (
|
||
ListTemplatesResponse,
|
||
TemplateResponse,
|
||
)
|
||
from fastapi import APIRouter, Depends, Query
|
||
from sqlalchemy.orm import Session
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
from packages.adapters.sqlalchemy_impl.template_repository import SQLAlchemyTemplateRepository
|
||
from packages.application.template.commands import ListTemplatesFilter
|
||
from packages.application.template.use_cases import CountTemplatesUseCase, ListTemplatesUseCase
|
||
|
||
from ._default_template import get_or_create_default_template_id
|
||
|
||
router = APIRouter()
|
||
|
||
|
||
def _get_template_repository(session: Session = Depends(get_db_session)) -> SQLAlchemyTemplateRepository:
|
||
return SQLAlchemyTemplateRepository(session)
|
||
|
||
|
||
@router.get("", response_model=ListTemplatesResponse, summary="获取模板列表")
|
||
def list_templates(
|
||
mode: str | None = Query(None, description="编辑模式:generic/vlog/storyboard,不传返回全部"),
|
||
category: str | None = Query(None, description="按分类筛选"),
|
||
tag: str | None = Query(None, description="按标签筛选"),
|
||
page: int = Query(1, ge=1, description="页码,从 1 开始"),
|
||
page_size: int = Query(20, ge=1, le=100, description="每页条数,默认 20"),
|
||
current_user: AuthenticatedUser = Depends(get_current_user),
|
||
repo: SQLAlchemyTemplateRepository = Depends(_get_template_repository),
|
||
db: Session = Depends(get_db_session),
|
||
):
|
||
"""获取用户可用的模板列表(仅返回 active 状态)。"""
|
||
user_id = str(current_user.user.id)
|
||
# P0 兜底:无有效模板时自动创建默认配音模板(解决新用户首次进入生成页 404)
|
||
get_or_create_default_template_id(db, user_id)
|
||
|
||
list_uc = ListTemplatesUseCase(repo)
|
||
count_uc = CountTemplatesUseCase(repo)
|
||
filters = ListTemplatesFilter(
|
||
category=category,
|
||
tag=tag,
|
||
mode=mode,
|
||
valid_only=True, # 仅返回 active + 有片段配置
|
||
)
|
||
skip = (page - 1) * page_size
|
||
templates = list_uc.execute(user_id, skip=skip, limit=page_size, filter=filters)
|
||
total = count_uc.execute(user_id, filter=filters)
|
||
items = [TemplateResponse.model_validate(tpl, from_attributes=True) for tpl in templates]
|
||
return ListTemplatesResponse(items=items, total=total)
|