88 lines
2.7 KiB
TypeScript
88 lines
2.7 KiB
TypeScript
/**
|
|
* 素材 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<string, string | number> = { 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<AssetItem[]> => {
|
|
const params: Record<string, string | number> = { 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<AssetItem> => {
|
|
const response = await apiClient.post("/assets", data)
|
|
return response.data
|
|
}
|
|
|
|
/** 更新素材(名称、metadata 等) */
|
|
export const updateAsset = async (
|
|
assetId: string,
|
|
data: { name?: string; metadata?: AssetMetadata },
|
|
): Promise<AssetItem> => {
|
|
const response = await apiClient.put(`/assets/${assetId}`, data)
|
|
return response.data
|
|
}
|
|
|
|
/** 更新素材审核状态 */
|
|
export const updateAssetReviewStatus = async (
|
|
assetId: string,
|
|
reviewStatus: "pending_review" | "approved" | "rejected",
|
|
): Promise<AssetItem> => {
|
|
const response = await apiClient.patch(`/assets/${assetId}/review`, {
|
|
review_status: reviewStatus,
|
|
})
|
|
return response.data
|
|
}
|
|
|
|
/** 删除素材 */
|
|
export const deleteAsset = async (assetId: string): Promise<void> => {
|
|
await apiClient.delete(`/assets/${assetId}`)
|
|
}
|