Files
ReelShortWeb/src/api/admin/creatorCenter.ts
T

249 lines
6.6 KiB
TypeScript

// Author: fruit.com.cn
import request from '@/axios'
import type { PageResult } from './types'
/** 创作者主体:登录账号绑定的创作者信息 */
export interface CreatorProfile {
id: number
code: string
name: string
/** INDIVIDUAL / COMPANY */
type: string
/** pending / approved / rejected / frozen */
status: string
statusText: string
auditNote: string
auditAt?: string
contactName: string
contactEmail: string
countryCode: string
dramaTotal: number
}
/** 代看目标下拉项(后端只给 id / 名称 / 状态) */
export interface CreatorCenterTarget {
id: number
code: string
name: string
status: string
statusText: string
}
/** 我的作品 + 最近一次提交的审核进度 */
export interface CreatorDrama {
id: number
code: string
title: string
subtitle?: string
genre?: string
description?: string
cover: string
trailerUrl?: string
language?: string
status: string
statusText: string
episodes: number
views: number
updatedAt?: string
submissionId?: number | null
submissionType?: string | null
submissionStatus?: string | null
submissionStatusText?: string | null
reviewNote?: string | null
rejectCode?: string | null
submitAt?: string | null
reviewAt?: string | null
}
export interface CreatorNotice {
id: number
/** CREATOR(入驻审核)/ SUBMISSION(内容提交审核) */
bizType: string
title: string
content: string
result: string
time?: string
}
export interface CreatorSubmission {
id: number
creatorId: number
dramaId: number
/** CREATE / UPDATE / PUBLISH / OFFLINE */
type: string
/** DRAFT / SUBMITTED / REVIEWING / APPROVED / REJECTED / WITHDRAWN */
status: string
version: number
submitAt?: string
reviewAt?: string
reviewNote: string
rejectCode: string
}
export interface CreatorEpisode {
id: number
dramaId: number
number: number
title: string
duration: string
durationSec: number
cover: string
videoUrl: string
isFree: boolean
unlockCoin: number
status: string
statusText: string
views: number
sort: number
}
export interface CreatorDramaEditData {
title: string
subtitle?: string
categoryId?: number
genre?: string
description?: string
cover?: string
trailerUrl?: string
language?: string
}
export interface PriceEpisodeConfig {
episodeId: number
number: number
title: string
free: boolean
unlockCoin: number
previewSeconds: number
}
export interface PriceConfig {
dramaId: number
freeEpisodes: number
unlockCoin: number
episodeCount: number
changedCount: number
episodes: PriceEpisodeConfig[]
}
export interface CreatorDashboard {
generatedAt: string
drama: Record<string, number>
playback: Record<string, number>
interaction: Record<string, number>
/** paidOrderAmount 取不到时为 null */
revenue: Record<string, number | null>
/** 按天趋势:creator_stat_daily 无产出,恒为 null */
daily: null
notes: string[]
}
export const getCreatorProfileApi = () => {
return request.get<CreatorProfile>({ url: '/admin/creator-center/profile' })
}
/**
* 静默探测当前账号的创作者身份:不弹全局提示,直接把 Result 交给调用方判断。
* 用于「已绑定 / 可代看但没选目标 / 未绑定」三态分流,渲染引导页。
*/
export const probeCreatorAccessApi = () => {
return request.get<CreatorProfile>({ url: '/admin/creator-center/profile', silent: true })
}
/** 代看目标下拉的数据源(仅 impersonate 权限可调) */
export const listImpersonationTargetsApi = () => {
return request.get<CreatorCenterTarget[]>({ url: '/admin/creator-center/impersonation/targets' })
}
export const pageMyDramasApi = (params: Record<string, unknown>) => {
return request.get<PageResult<CreatorDrama>>({ url: '/admin/creator-center/dramas/page', params })
}
export const getMyDramaApi = (id: number) => {
return request.get<CreatorDrama>({ url: `/admin/creator-center/dramas/${id}` })
}
export const listCreatorNoticesApi = () => {
return request.get<CreatorNotice[]>({ url: '/admin/creator-center/notices' })
}
export const getCreatorDashboardApi = () => {
return request.get<CreatorDashboard>({ url: '/admin/creator-center/dashboard' })
}
export const createDramaApi = (data: CreatorDramaEditData) => {
return request.post<number>({ url: '/admin/creator-center/dramas', data })
}
export const updateDramaApi = (id: number, data: CreatorDramaEditData) => {
return request.put<void>({ url: `/admin/creator-center/dramas/${id}`, data })
}
export const listEpisodesApi = (dramaId: number) => {
return request.get<CreatorEpisode[]>({ url: `/admin/creator-center/dramas/${dramaId}/episodes` })
}
export const addEpisodeApi = (dramaId: number, data: Record<string, unknown>) => {
return request.post<number>({ url: `/admin/creator-center/dramas/${dramaId}/episodes`, data })
}
export const updateEpisodeApi = (
dramaId: number,
episodeId: number,
data: Record<string, unknown>
) => {
return request.put<void>({
url: `/admin/creator-center/dramas/${dramaId}/episodes/${episodeId}`,
data
})
}
export const deleteEpisodeApi = (dramaId: number, episodeId: number) => {
return request.delete<void>({
url: `/admin/creator-center/dramas/${dramaId}/episodes/${episodeId}`
})
}
export const sortEpisodesApi = (dramaId: number, ids: number[]) => {
return request.put<void>({
url: `/admin/creator-center/dramas/${dramaId}/episodes/sort`,
data: { ids }
})
}
/** 把上传好的媒资挂到分集(产物必须是本人上传的) */
export const attachAssetApi = (dramaId: number, episodeId: number, assetId: number) => {
return request.post<void>({
url: `/admin/creator-center/dramas/${dramaId}/episodes/${episodeId}/attach`,
data: { assetId }
})
}
export const getPricesApi = (dramaId: number) => {
return request.get<PriceConfig>({ url: `/admin/creator-center/dramas/${dramaId}/prices` })
}
export const savePricesApi = (dramaId: number, data: Record<string, unknown>) => {
return request.put<PriceConfig>({ url: `/admin/creator-center/dramas/${dramaId}/prices`, data })
}
export const submitDramaApi = (dramaId: number, type: string) => {
return request.post<CreatorSubmission>({
url: `/admin/creator-center/dramas/${dramaId}/submit`,
data: { type }
})
}
export const withdrawSubmissionApi = (submissionId: number) => {
return request.post<CreatorSubmission>({
url: `/admin/creator-center/submissions/${submissionId}/withdraw`
})
}
export const listSubmissionsApi = (dramaId: number) => {
return request.get<CreatorSubmission[]>({
url: `/admin/creator-center/dramas/${dramaId}/submissions`
})
}