249 lines
6.6 KiB
TypeScript
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`
|
|
})
|
|
}
|