Files
xiaoxia-saas/apps/web/src/api/template-editor/clips.ts
T
xiaoxia be3ed6487e
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 22s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 54s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m49s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 58s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m50s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 2m33s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 46s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 50s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m48s
AI Code Review / AI Code Review (pull_request) Successful in 1m48s
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 2m26s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 16s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 46m25s
CI/CD Pipeline / Canary Release to Production (pull_request) Failing after 1246h23m49s
CI/CD Pipeline / Production Browser E2E (pull_request) Failing after 1246h23m49s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 1246h32m16s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 1246h32m20s
CI/CD Pipeline / Deploy Production (pull_request) Failing after 1246h32m22s
CI/CD Pipeline / Integration Tests (pull_request) Failing after 1246h32m24s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 1246h38m15s
CI/CD Pipeline / Build Production Web Image (pull_request) Failing after 1246h38m17s
CI/CD Pipeline / Build Production API Image (pull_request) Failing after 1246h38m19s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 1246h40m0s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 1246h38m24s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 1246h40m2s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 1247h4m57s
CI/CD Pipeline / Build Production Worker Image (pull_request) Failing after 1247h10m56s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 1247h12m37s
refactor(template-editor): API层按模块拆分(744行→88行入口, -88%)
将 template-editor.ts 单文件拆分为目录结构,按业务模块组织:

- types.ts — 所有类型定义(EditPlan/Clip/MediaAsset 等)
- constants.ts — 常量(TRANSITION_OPTIONS/QUALITY_OPTIONS 等)
- editPlans.ts — 模板草稿 CRUD + 生成 + 复制 + 取消
- clips.ts — 片段 CRUD + 批量操作(重排序/批量删除/从素材创建)
- aiFeatures.ts — AI 推荐 + AI 封面生成
- mediaAssets.ts — 素材库 API + AssetItem→MediaAsset 映射
- index.ts — 统一入口,re-export 所有类型/常量/函数

入口文件从 744 行精简到 88 行(仅 re-export),
各模块职责单一,便于维护和 tree-shaking。
导入路径 @/api/template-editor 保持向后兼容。
2026-07-26 16:31:25 +08:00

100 lines
2.7 KiB
TypeScript

/**
* 片段 CRUD + 批量操作 API
*/
import apiClient from "../client"
import type {
EditPlanClip,
EditPlanClipListParams,
EditPlanClipListResponse,
CreateEditPlanClipRequest,
UpdateEditPlanClipRequest,
ClipReorderItem,
ClipReorderResponse,
ClipBatchDeleteResponse,
ClipsFromAssetsResponse,
} from "./types"
/** 获取片段列表 */
export async function getEditPlanClips(
templateId: string,
params?: EditPlanClipListParams,
): Promise<EditPlanClipListResponse> {
const response = await apiClient.get<EditPlanClipListResponse>(
`/templates/${templateId}/editor/clips`,
{ params },
)
return response.data
}
/** 获取单个片段详情 */
export async function getEditPlanClip(templateId: string, clipId: string): Promise<EditPlanClip> {
const response = await apiClient.get<EditPlanClip>(
`/templates/${templateId}/editor/clips/${clipId}`,
)
return response.data
}
/** 创建片段 */
export async function createEditPlanClip(
templateId: string,
data: CreateEditPlanClipRequest,
): Promise<EditPlanClip> {
const response = await apiClient.post<EditPlanClip>(`/templates/${templateId}/editor/clips`, data)
return response.data
}
/** 更新片段 */
export async function updateEditPlanClip(
templateId: string,
clipId: string,
data: UpdateEditPlanClipRequest,
): Promise<EditPlanClip> {
const response = await apiClient.put<EditPlanClip>(
`/templates/${templateId}/editor/clips/${clipId}`,
data,
)
return response.data
}
/** 删除片段 */
export async function deleteEditPlanClip(templateId: string, clipId: string): Promise<void> {
await apiClient.delete(`/templates/${templateId}/editor/clips/${clipId}`)
}
/** 片段重排序(拖拽排序后一次性提交) */
export async function reorderEditPlanClips(
templateId: string,
items: ClipReorderItem[],
): Promise<ClipReorderResponse> {
const response = await apiClient.post<ClipReorderResponse>(
`/templates/${templateId}/editor/clips/reorder`,
{ items },
)
return response.data
}
/** 批量删除片段 */
export async function batchDeleteEditPlanClips(
templateId: string,
clipIds: string[],
): Promise<ClipBatchDeleteResponse> {
const response = await apiClient.post<ClipBatchDeleteResponse>(
`/templates/${templateId}/editor/clips/batch-delete`,
{ clip_ids: clipIds },
)
return response.data
}
/** 从素材批量创建片段(追加到时间线末尾) */
export async function createClipsFromAssets(
templateId: string,
assetIds: string[],
clipType = "main",
): Promise<ClipsFromAssetsResponse> {
const response = await apiClient.post<ClipsFromAssetsResponse>(
`/templates/${templateId}/editor/clips/from-assets`,
{ asset_ids: assetIds, clip_type: clipType },
)
return response.data
}