66 lines
2.1 KiB
TypeScript
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
|
|
}
|