/** * 素材 CRUD API */ import apiClient from "../client" import type { AssetItem, AssetMetadata } from "./types" /** 获取素材库下的所有素材 */ export const getAssets = async ( libraryId: string, options?: { status?: string page?: number page_size?: number }, ): Promise<{ items: AssetItem[]; total: number }> => { const params: Record = { library_id: libraryId } if (options?.status) params.status = options.status if (options?.page) params.page = options.page if (options?.page_size) params.page_size = options.page_size const response = await apiClient.get("/assets", { params }) const data = response.data || {} const items: AssetItem[] = data.items || [] const total: number = typeof data.total === "number" ? data.total : items.length return { items, total } } /** 按类型获取素材(如 voice/video/image),支持可选筛选 */ export const getAssetsByKind = async ( kind: string, filters?: { keyword?: string gender?: string style?: string tag_ids?: string[] limit?: number page?: number page_size?: number }, ): Promise => { const params: Record = { kind } if (filters?.keyword) params.keyword = filters.keyword if (filters?.gender) params.gender = filters.gender if (filters?.style) params.style = filters.style if (filters?.tag_ids?.length) params.tag_ids = filters.tag_ids.join(",") if (filters?.limit) params.limit = filters.limit if (filters?.page) params.page = filters.page if (filters?.page_size) params.page_size = filters.page_size const response = await apiClient.get("/assets", { params }) return response.data.items || [] } /** 创建素材(上传文件后调用,附带 metadata) */ export const createAsset = async (data: { library_id: string name: string storage_key: string mime_type: string metadata?: AssetMetadata }): Promise => { const response = await apiClient.post("/assets", data) return response.data } /** 更新素材(名称、metadata 等) */ export const updateAsset = async ( assetId: string, data: { name?: string; metadata?: AssetMetadata }, ): Promise => { const response = await apiClient.put(`/assets/${assetId}`, data) return response.data } /** 更新素材审核状态 */ export const updateAssetReviewStatus = async ( assetId: string, reviewStatus: "pending_review" | "approved" | "rejected", ): Promise => { const response = await apiClient.patch(`/assets/${assetId}/review`, { review_status: reviewStatus, }) return response.data } /** 删除素材 */ export const deleteAsset = async (assetId: string): Promise => { await apiClient.delete(`/assets/${assetId}`) }