/** * 标题相关 API * Phase 1 新增:全局标题库 * 注意:后端 schema 使用 name + text 字段,前端 UI 用 content 展示 */ import apiClient from "./client" /** 标题条目(前端展示用) */ export interface TitleItem { id: string content: string category?: string source?: string word_count?: number is_favorite?: boolean created_at?: string updated_at?: string } /** 后端标题响应格式 */ interface BackendTitleResponse { id: string user_id: string name: string text: string category: string description: string tags: string[] usage_count: number is_active: boolean created_at: string updated_at: string } /** 后端创建标题请求格式 */ interface BackendCreateTitleRequest { name: string text: string category: string description?: string tags?: string[] } /** 后端更新标题请求格式 */ interface BackendUpdateTitleRequest { name?: string text?: string category?: string description?: string tags?: string[] } /** 将后端响应映射为前端 TitleItem */ const toTitleItem = (item: BackendTitleResponse): TitleItem => ({ id: item.id, content: item.text, category: item.category, word_count: item.text?.length || 0, created_at: item.created_at, updated_at: item.updated_at, }) /** 创建标题请求(前端接口,保持向后兼容) */ export interface CreateTitleRequest { content: string category?: string } /** 获取当前用户的所有标题 */ export const getTitles = async (): Promise => { const response = await apiClient.get<{ items: BackendTitleResponse[] } | BackendTitleResponse[]>( "/titles", ) // 兼容两种后端返回格式:{ items: [...] } 或直接 [...] const items = Array.isArray(response.data) ? response.data : response.data.items || [] return items.map(toTitleItem) } /** 创建标题 */ export const createTitle = async (data: CreateTitleRequest): Promise => { // 后端要求 name(≤255)和 text(≤500),name 从 content 截取 const payload: BackendCreateTitleRequest = { name: data.content.slice(0, 255), text: data.content.slice(0, 500), category: data.category || "default", } const response = await apiClient.post("/titles", payload) return toTitleItem(response.data) } /** 更新标题 */ export const updateTitle = async ( titleId: string, data: Partial, ): Promise => { const payload: BackendUpdateTitleRequest = {} if (data.content !== undefined) { payload.name = data.content.slice(0, 255) payload.text = data.content.slice(0, 500) } if (data.category !== undefined) { payload.category = data.category } // 后端用 PUT,非 PATCH const response = await apiClient.put(`/titles/${titleId}`, payload) return toTitleItem(response.data) } /** 删除标题 */ export const deleteTitle = async (titleId: string): Promise => { await apiClient.delete(`/titles/${titleId}`) } /** 批量导入标题 */ export const batchImportTitles = async (titles: string[]): Promise<{ imported_count: number }> => { const response = await apiClient.post("/titles/batch-import", { titles }) return response.data }