diff --git a/apps/web/e2e/core-generation.spec.ts b/apps/web/e2e/core-generation.spec.ts index c86a54a0f..bd33efec8 100755 --- a/apps/web/e2e/core-generation.spec.ts +++ b/apps/web/e2e/core-generation.spec.ts @@ -227,7 +227,7 @@ test.describe("Core generation flow", () => { const path = new URL(url).pathname return ( response.request().method() === "POST" && - (path.endsWith("/template-editors") || path.endsWith("/template-editors/")) + (path.endsWith("/templates/drafts") || path.endsWith("/templates/drafts/")) ) }, { timeout: 30_000 }, diff --git a/apps/web/src/api/editPlans.ts b/apps/web/src/api/templateEditor.ts similarity index 87% rename from apps/web/src/api/editPlans.ts rename to apps/web/src/api/templateEditor.ts index 1b5ff8127..d9409a596 100644 --- a/apps/web/src/api/editPlans.ts +++ b/apps/web/src/api/templateEditor.ts @@ -345,71 +345,71 @@ export interface EditPlanListResponse { /** 获取模板草稿列表(支持分页和筛选) */ export async function getEditPlans(params?: EditPlanListParams): Promise { - const response = await apiClient.get("/template-editors", { + const response = await apiClient.get("/templates/drafts", { params, }) return response.data } /** 获取单个模板草稿 */ -export async function getEditPlan(planId: string): Promise { - const response = await apiClient.get(`/template-editors/${planId}`) +export async function getEditPlan(templateId: string): Promise { + const response = await apiClient.get(`/templates/${templateId}/editor`) return response.data } /** 创建模板草稿 */ export async function createEditPlan(data: CreateEditPlanRequest): Promise { - const response = await apiClient.post("/template-editors", data) + const response = await apiClient.post("/templates/drafts", data) return response.data } /** 更新模板草稿 */ export async function updateEditPlan( - planId: string, + templateId: string, data: UpdateEditPlanRequest, ): Promise { - const response = await apiClient.put(`/template-editors/${planId}`, data) + const response = await apiClient.put(`/templates/${templateId}/editor`, data) return response.data } /** 删除模板草稿 */ -export async function deleteEditPlan(planId: string): Promise { - await apiClient.delete(`/template-editors/${planId}`) +export async function deleteEditPlan(templateId: string): Promise { + await apiClient.delete(`/templates/${templateId}/editor`) } /** 触发生成 */ -export async function generateEditPlan(planId: string): Promise { - const response = await apiClient.post(`/template-editors/${planId}/generate`) +export async function generateEditPlan(templateId: string): Promise { + const response = await apiClient.post(`/templates/${templateId}/editor/generate`) return response.data } /** 获取生成状态(轮询用) */ -export async function getGenerationStatus(planId: string): Promise { - const response = await apiClient.get(`/template-editors/${planId}/generation-status`) +export async function getGenerationStatus(templateId: string): Promise { + const response = await apiClient.get(`/templates/${templateId}/editor/generation-status`) return response.data } /** AI 推荐片段方案 */ export async function aiRecommendClips( - planId: string, + templateId: string, data: AIRecommendRequest, ): Promise { - const response = await apiClient.post(`/template-editors/${planId}/ai-recommend`, data) + const response = await apiClient.post(`/templates/${templateId}/editor/ai-recommend`, data) return response.data } /** AI 生成封面 */ export async function generateCover( - planId: string, + templateId: string, data: GenerateCoverRequest, ): Promise { - const response = await apiClient.post(`/template-editors/${planId}/generate-cover`, data) + const response = await apiClient.post(`/templates/${templateId}/editor/generate-cover`, data) return response.data } /** 获取模板草稿关联的生成记录 */ -export async function getEditPlanGenerations(planId: string): Promise { - const response = await apiClient.get(`/template-editors/${planId}/generations`) +export async function getEditPlanGenerations(templateId: string): Promise { + const response = await apiClient.get(`/templates/${templateId}/editor/generations`) return response.data.items || [] } @@ -420,8 +420,8 @@ export async function getGenerationTaskResults(taskId: string): Promise { - await apiClient.post(`/template-editors/${planId}/cancel`) +export async function cancelGeneration(templateId: string): Promise { + await apiClient.post(`/templates/${templateId}/editor/cancel`) } /* ============================================================ @@ -493,11 +493,11 @@ export interface EditPlanClipListParams { /** 获取片段列表 */ export async function getEditPlanClips( - planId: string, + templateId: string, params?: EditPlanClipListParams, ): Promise { const response = await apiClient.get( - `/template-editors/${planId}/clips`, + `/templates/${templateId}/editor/clips`, { params, }, @@ -506,36 +506,38 @@ export async function getEditPlanClips( } /** 获取单个片段详情 */ -export async function getEditPlanClip(planId: string, clipId: string): Promise { - const response = await apiClient.get(`/template-editors/${planId}/clips/${clipId}`) +export async function getEditPlanClip(templateId: string, clipId: string): Promise { + const response = await apiClient.get( + `/templates/${templateId}/editor/clips/${clipId}`, + ) return response.data } /** 创建片段 */ export async function createEditPlanClip( - planId: string, + templateId: string, data: CreateEditPlanClipRequest, ): Promise { - const response = await apiClient.post(`/template-editors/${planId}/clips`, data) + const response = await apiClient.post(`/templates/${templateId}/editor/clips`, data) return response.data } /** 更新片段 */ export async function updateEditPlanClip( - planId: string, + templateId: string, clipId: string, data: UpdateEditPlanClipRequest, ): Promise { const response = await apiClient.put( - `/template-editors/${planId}/clips/${clipId}`, + `/templates/${templateId}/editor/clips/${clipId}`, data, ) return response.data } /** 删除片段 */ -export async function deleteEditPlanClip(planId: string, clipId: string): Promise { - await apiClient.delete(`/template-editors/${planId}/clips/${clipId}`) +export async function deleteEditPlanClip(templateId: string, clipId: string): Promise { + await apiClient.delete(`/templates/${templateId}/editor/clips/${clipId}`) } /* ============================================================ @@ -572,11 +574,11 @@ export interface ClipsFromAssetsResponse { /** 片段重排序(拖拽排序后一次性提交) */ export async function reorderEditPlanClips( - planId: string, + templateId: string, items: ClipReorderItem[], ): Promise { const response = await apiClient.post( - `/template-editors/${planId}/clips/reorder`, + `/templates/${templateId}/editor/clips/reorder`, { items }, ) return response.data @@ -584,11 +586,11 @@ export async function reorderEditPlanClips( /** 批量删除片段 */ export async function batchDeleteEditPlanClips( - planId: string, + templateId: string, clipIds: string[], ): Promise { const response = await apiClient.post( - `/template-editors/${planId}/clips/batch-delete`, + `/templates/${templateId}/editor/clips/batch-delete`, { clip_ids: clipIds }, ) return response.data @@ -596,12 +598,12 @@ export async function batchDeleteEditPlanClips( /** 从素材批量创建片段(追加到时间线末尾) */ export async function createClipsFromAssets( - planId: string, + templateId: string, assetIds: string[], clipType = "main", ): Promise { const response = await apiClient.post( - `/template-editors/${planId}/clips/from-assets`, + `/templates/${templateId}/editor/clips/from-assets`, { asset_ids: assetIds, clip_type: clipType }, ) return response.data @@ -618,8 +620,14 @@ export interface CopyEditPlanRequest { } /** 复制模板草稿(含所有片段配置) */ -export async function copyEditPlan(planId: string, data?: CopyEditPlanRequest): Promise { - const response = await apiClient.post(`/template-editors/${planId}/copy`, data || {}) +export async function copyEditPlan( + templateId: string, + data?: CopyEditPlanRequest, +): Promise { + const response = await apiClient.post( + `/templates/${templateId}/editor/copy`, + data || {}, + ) return response.data } diff --git a/apps/web/src/api/templates.ts b/apps/web/src/api/templates.ts index 5bcd3e69b..a4b99d0ee 100644 --- a/apps/web/src/api/templates.ts +++ b/apps/web/src/api/templates.ts @@ -9,7 +9,7 @@ */ import apiClient from "./client" import type { TitleConfig, SubtitleConfig, BgmConfig } from "./editingPlanner" -import type { EditPlanConfig } from "./editPlans" +import type { EditPlanConfig } from "./templateEditor" /* ──────────── 类型定义 ──────────── */ diff --git a/apps/web/src/components/AssetSelector/AssetSelector.tsx b/apps/web/src/components/AssetSelector/AssetSelector.tsx index e83afc998..1dbbd70b9 100644 --- a/apps/web/src/components/AssetSelector/AssetSelector.tsx +++ b/apps/web/src/components/AssetSelector/AssetSelector.tsx @@ -12,8 +12,8 @@ import React, { useState, useMemo, useCallback, useRef, useEffect } from "react" import "./AssetSelector.css" import { Input, Select, Button } from "@/components/ui" -import type { MediaAsset } from "@/api/editPlans" -import { MATERIAL_TYPE_LABELS, MATERIAL_TYPE_ICONS, QUALITY_OPTIONS } from "@/api/editPlans" +import type { MediaAsset } from "@/api/templateEditor" +import { MATERIAL_TYPE_LABELS, MATERIAL_TYPE_ICONS, QUALITY_OPTIONS } from "@/api/templateEditor" /* ──────────── 类型 ──────────── */ diff --git a/apps/web/src/pages/editing-planner/EditingPlanner.tsx b/apps/web/src/pages/editing-planner/EditingPlanner.tsx index 4ea24fdbc..789e21860 100644 --- a/apps/web/src/pages/editing-planner/EditingPlanner.tsx +++ b/apps/web/src/pages/editing-planner/EditingPlanner.tsx @@ -20,8 +20,8 @@ import { getTemplateCategories, MODE_LABELS, } from "@/api/editingPlanner" -import type { MediaAsset, TransitionEffect, TitleConfig } from "@/api/editPlans" -import { getMediaAssets, getEditPlan, getEditPlanClips } from "@/api/editPlans" +import type { MediaAsset, TransitionEffect, TitleConfig } from "@/api/templateEditor" +import { getMediaAssets, getEditPlan, getEditPlanClips } from "@/api/templateEditor" import { useUndoRedo } from "./hooks/useUndoRedo" import type { ClipData, diff --git a/apps/web/src/pages/editing-planner/components/ClipPropertiesPanel.tsx b/apps/web/src/pages/editing-planner/components/ClipPropertiesPanel.tsx old mode 100755 new mode 100644 index 621cc7703..00f6f82c3 --- a/apps/web/src/pages/editing-planner/components/ClipPropertiesPanel.tsx +++ b/apps/web/src/pages/editing-planner/components/ClipPropertiesPanel.tsx @@ -6,7 +6,7 @@ import React, { useRef, useState, useCallback } from "react" import { useNavigate } from "react-router-dom" import type { TemplateMode } from "@/api/editingPlanner" import type { ClipData, ClipType } from "../types" -import { TRANSITION_OPTIONS } from "@/api/editPlans" +import { TRANSITION_OPTIONS } from "@/api/templateEditor" import type { AssetItem } from "@/api/assets" interface SubtitleSettings { diff --git a/apps/web/src/pages/editing-planner/components/GenerationHistoryModal.tsx b/apps/web/src/pages/editing-planner/components/GenerationHistoryModal.tsx index 611744a5a..0a89d6345 100644 --- a/apps/web/src/pages/editing-planner/components/GenerationHistoryModal.tsx +++ b/apps/web/src/pages/editing-planner/components/GenerationHistoryModal.tsx @@ -4,8 +4,8 @@ */ import React from "react" import { CloseOutlined, InboxOutlined } from "@ant-design/icons" -import type { EditPlanGeneration } from "@/api/editPlans" -import { PLAN_STATUS_LABELS } from "@/api/editPlans" +import type { EditPlanGeneration } from "@/api/templateEditor" +import { PLAN_STATUS_LABELS } from "@/api/templateEditor" interface GenerationHistoryModalProps { open: boolean diff --git a/apps/web/src/pages/editing-planner/components/IntroOutroPanel.tsx b/apps/web/src/pages/editing-planner/components/IntroOutroPanel.tsx index 84fc8968f..9bb9739d6 100644 --- a/apps/web/src/pages/editing-planner/components/IntroOutroPanel.tsx +++ b/apps/web/src/pages/editing-planner/components/IntroOutroPanel.tsx @@ -7,7 +7,7 @@ import React, { useCallback } from "react" import { Drawer } from "antd" import type { IntroOutroConfig, IntroOutroItem, IntroOutroKind, TransitionType } from "../types" import { DEFAULT_INTRO_OUTRO } from "../types" -import { TRANSITION_OPTIONS } from "@/api/editPlans" +import { TRANSITION_OPTIONS } from "@/api/templateEditor" /* ──────────── 常量 ──────────── */ diff --git a/apps/web/src/pages/editing-planner/components/MediaPanel.tsx b/apps/web/src/pages/editing-planner/components/MediaPanel.tsx old mode 100755 new mode 100644 index ed4172647..98787f3f3 --- a/apps/web/src/pages/editing-planner/components/MediaPanel.tsx +++ b/apps/web/src/pages/editing-planner/components/MediaPanel.tsx @@ -5,7 +5,7 @@ import React, { useState } from "react" import type { EditingTemplate } from "@/api/editingPlanner" import { MODE_LABELS } from "@/api/editingPlanner" -import type { MediaAsset } from "@/api/editPlans" +import type { MediaAsset } from "@/api/templateEditor" import AssetSelector from "@/components/AssetSelector/AssetSelector" interface MediaPanelProps { diff --git a/apps/web/src/pages/editing-planner/components/PreviewPlayer.tsx b/apps/web/src/pages/editing-planner/components/PreviewPlayer.tsx old mode 100755 new mode 100644 index 9d86531c6..9b0b92695 --- a/apps/web/src/pages/editing-planner/components/PreviewPlayer.tsx +++ b/apps/web/src/pages/editing-planner/components/PreviewPlayer.tsx @@ -5,7 +5,7 @@ */ import React from "react" import type { ClipData, ClipType } from "../types" -import type { TitleConfig } from "@/api/editPlans" +import type { TitleConfig } from "@/api/templateEditor" import type { CoverConfig } from "../types" interface SubtitleSettings { diff --git a/apps/web/src/pages/editing-planner/components/TimelinePanel.tsx b/apps/web/src/pages/editing-planner/components/TimelinePanel.tsx old mode 100755 new mode 100644 index d561ecb52..deec2e686 --- a/apps/web/src/pages/editing-planner/components/TimelinePanel.tsx +++ b/apps/web/src/pages/editing-planner/components/TimelinePanel.tsx @@ -10,7 +10,7 @@ */ import React, { useState, useRef, useCallback, useEffect, useLayoutEffect, useMemo } from "react" import type { ClipData, ClipType, TrimConfig } from "../types" -import { TRANSITION_OPTIONS } from "@/api/editPlans" +import { TRANSITION_OPTIONS } from "@/api/templateEditor" interface TimelinePanelProps { clips: ClipData[] diff --git a/apps/web/src/pages/editing-planner/components/TransitionSelector.tsx b/apps/web/src/pages/editing-planner/components/TransitionSelector.tsx index 5a423f468..c58b26bef 100644 --- a/apps/web/src/pages/editing-planner/components/TransitionSelector.tsx +++ b/apps/web/src/pages/editing-planner/components/TransitionSelector.tsx @@ -5,7 +5,7 @@ */ import React, { useCallback } from "react" import { Drawer, Slider } from "antd" -import { TRANSITION_OPTIONS } from "@/api/editPlans" +import { TRANSITION_OPTIONS } from "@/api/templateEditor" import type { TransitionConfig, TransitionType } from "../types" import { DEFAULT_TRANSITION } from "../types" diff --git a/apps/web/src/pages/editing-planner/hooks/useEditPlanClips.ts b/apps/web/src/pages/editing-planner/hooks/useEditPlanClips.ts index caab366c1..901454826 100644 --- a/apps/web/src/pages/editing-planner/hooks/useEditPlanClips.ts +++ b/apps/web/src/pages/editing-planner/hooks/useEditPlanClips.ts @@ -18,7 +18,7 @@ import type { CreateEditPlanClipRequest, UpdateEditPlanClipRequest, ClipReorderItem, -} from "@/api/editPlans" +} from "@/api/templateEditor" import { getEditPlanClips, createEditPlanClip, @@ -27,7 +27,7 @@ import { reorderEditPlanClips, batchDeleteEditPlanClips, createClipsFromAssets, -} from "@/api/editPlans" +} from "@/api/templateEditor" import { useUndoRedo } from "./useUndoRedo" const QUERY_KEY = "editPlanClips" diff --git a/apps/web/src/pages/generate/GeneratePage.tsx b/apps/web/src/pages/generate/GeneratePage.tsx old mode 100755 new mode 100644 index 592f59408..94207ff9a --- a/apps/web/src/pages/generate/GeneratePage.tsx +++ b/apps/web/src/pages/generate/GeneratePage.tsx @@ -30,8 +30,8 @@ import { updateEditPlan, getGenerationTaskResults, getGenerationStatus, -} from "@/api/editPlans" -import type { GeneratedVideo, EditPlanConfig, TitleConfig } from "@/api/editPlans" +} from "@/api/templateEditor" +import type { GeneratedVideo, EditPlanConfig, TitleConfig } from "@/api/templateEditor" import type { CoverConfig } from "../editing-planner/types" import { getEditingTemplates } from "@/api/editingPlanner" import { getTitles } from "@/api/titles" @@ -44,7 +44,7 @@ import { synthesizeSpeech, getTTSJobStatus, saveTtsToLibrary } from "@/api/tts" import { getTags, createTag } from "@/api/tags" import { useCloneProgress } from "@/hooks/useCloneProgress" import { useSearchParams, useNavigate } from "react-router-dom" -import { getEditPlan } from "@/api/editPlans" +import { getEditPlan } from "@/api/templateEditor" import "./generate.css" const { Text } = Typography diff --git a/apps/web/src/test/api/editPlans.test.ts b/apps/web/src/test/api/editPlans.test.ts index 10e287dc7..4f7953063 100644 --- a/apps/web/src/test/api/editPlans.test.ts +++ b/apps/web/src/test/api/editPlans.test.ts @@ -23,7 +23,7 @@ import { copyEditPlan, getMediaAssets, getMediaAsset, -} from "@/api/editPlans" +} from "@/api/templateEditor" const mockGet = vi.fn() const mockPost = vi.fn() diff --git a/apps/web/src/test/components/AssetSelector/AssetSelector.test.tsx b/apps/web/src/test/components/AssetSelector/AssetSelector.test.tsx index 84621d6f8..6eef23629 100644 --- a/apps/web/src/test/components/AssetSelector/AssetSelector.test.tsx +++ b/apps/web/src/test/components/AssetSelector/AssetSelector.test.tsx @@ -2,7 +2,7 @@ import React from "react" import { describe, it, expect, vi } from "vitest" import { render, screen } from "@testing-library/react" import AssetSelector from "@/components/AssetSelector/AssetSelector" -import type { MediaAsset } from "@/api/editPlans" +import type { MediaAsset } from "@/api/templateEditor" vi.mock("@/components/ui", () => ({ Input: ({ placeholder }: any) => , diff --git a/apps/web/src/test/pages/EditingPlanner.test.tsx b/apps/web/src/test/pages/EditingPlanner.test.tsx index adc680626..2b94a7efd 100644 --- a/apps/web/src/test/pages/EditingPlanner.test.tsx +++ b/apps/web/src/test/pages/EditingPlanner.test.tsx @@ -146,7 +146,7 @@ vi.mock("@/api/editingPlanner", () => ({ MODE_LABELS: { pip: "画中画", intro_outro: "片头片尾", watermark: "水印" }, })) -vi.mock("@/api/editPlans", () => ({ +vi.mock("@/api/templateEditor", () => ({ getMediaAssets: vi.fn().mockResolvedValue({ items: [] }), getEditPlanGenerations: vi.fn().mockResolvedValue({ items: [] }), generateCover: vi.fn().mockResolvedValue({}), diff --git a/apps/web/src/test/pages/GeneratePage.test.tsx b/apps/web/src/test/pages/GeneratePage.test.tsx index 4cabcdbfe..f85c14af8 100644 --- a/apps/web/src/test/pages/GeneratePage.test.tsx +++ b/apps/web/src/test/pages/GeneratePage.test.tsx @@ -213,7 +213,7 @@ vi.mock("@/api/titles", () => ({ getTitles: vi.fn().mockResolvedValue({ items: [] }), })) -vi.mock("@/api/editPlans", () => ({ +vi.mock("@/api/templateEditor", () => ({ createEditPlan: vi.fn().mockResolvedValue({ id: "test-plan" }), generateEditPlan: vi.fn().mockResolvedValue({ task_id: "test-task" }), updateEditPlan: vi.fn().mockResolvedValue({}), diff --git a/apps/web/src/test/pages/editing-planner/hooks/useEditPlanClips.test.ts b/apps/web/src/test/pages/editing-planner/hooks/useEditPlanClips.test.ts index bed4f6bd1..ae0e563af 100644 --- a/apps/web/src/test/pages/editing-planner/hooks/useEditPlanClips.test.ts +++ b/apps/web/src/test/pages/editing-planner/hooks/useEditPlanClips.test.ts @@ -32,7 +32,7 @@ vi.mock("antd", () => ({ }, })) -vi.mock("@/api/editPlans", () => ({ +vi.mock("@/api/templateEditor", () => ({ getEditPlanClips: vi.fn().mockResolvedValue({ items: [], total: 0 }), createEditPlanClip: vi.fn().mockResolvedValue({}), updateEditPlanClip: vi.fn().mockResolvedValue({}),