Files
xiaoxia-saas/apps/web/src/api/titles/titles.ts
T

66 lines
2.1 KiB
TypeScript

/**
* 标题相关 API 函数
* Phase 1 新增:全局标题库
* 注意:后端 schema 使用 name + text 字段,前端 UI 用 content 展示
*/
import apiClient from "../client"
import type {
BackendCreateTitleRequest,
BackendTitleResponse,
BackendUpdateTitleRequest,
CreateTitleRequest,
TitleItem,
} from "./types"
import { toTitleItem } from "./utils"
/** 获取当前用户的所有标题 */
export const getTitles = async (): Promise<TitleItem[]> => {
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<TitleItem> => {
// 后端要求 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<BackendTitleResponse>("/titles", payload)
return toTitleItem(response.data)
}
/** 更新标题 */
export const updateTitle = async (
titleId: string,
data: Partial<CreateTitleRequest>,
): Promise<TitleItem> => {
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<BackendTitleResponse>(`/titles/${titleId}`, payload)
return toTitleItem(response.data)
}
/** 删除标题 */
export const deleteTitle = async (titleId: string): Promise<void> => {
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
}