feat: 新增皮肤站管理台玩家审核页
Sync source to CNB / Sync Git ref (push) Skipped

This commit is contained in:
AxTps committed 2026-10-17 22:50:21 +08:00
1 parent eef7d02f45
commit 1c671943b7
6 files changed
+667 -2

No files matched your search

@@ -1032,3 +1032,113 @@ export function skinSiteAdminUserFrequencyLimit(
'admin/users/' + encodeURIComponent(uuid) + '/frequency-limit',
)
}
export type SkinSiteReviewResult = 'PENDING' | 'PASSED' | 'REJECTED'
export type SkinSiteReviewMode = 'AUTO' | 'MANUAL'
export interface SkinSiteReviewAnswer {
id: string
questionId?: string
values?: string[]
text?: string
score?: number | null
[key: string]: unknown
}
export interface SkinSiteReviewSubmission {
id: number
reviewVersion: number
revision: number
applicantName: string
username?: string | null
qq?: string | null
userUuid?: string | null
registeredAt?: number | null
mode: SkinSiteReviewMode
result: SkinSiteReviewResult
score?: number | null
targetPermissions: string[]
automaticResults: Record<string, boolean>
inviteCode?: string | null
inviteUsed: boolean
reviewerUuid?: string | null
reviewerName?: string | null
createdAt: number
reviewedAt?: number | null
answers: SkinSiteReviewAnswer[]
decisionHistory?: Array<{
previousResult: SkinSiteReviewResult
result: SkinSiteReviewResult
reviewer: string
reason: string
at: number
permissionNote: string
}>
context?: {
ip: string | null
ipSource: string
userAgent: string
activity?: {
durationMs: number
hiddenMs: number
screenSwitches: number
} | null
} | null
}
export function skinSiteReviewSubmissions(params?: {
result?: SkinSiteReviewResult | 'COMPLETED'
limit?: number
offset?: number
paperId?: string
}): Promise<SkinSiteResponse<SkinSiteReviewSubmission[]>> {
const query = new URLSearchParams({
limit: String(params?.limit ?? 20),
offset: String(params?.offset ?? 0),
})
if (params?.result) query.set('result', params.result)
if (params?.paperId) query.set('paperId', params.paperId)
return skinSiteRequest<SkinSiteReviewSubmission[]>('review/admin/submissions?' + query.toString())
}
export function skinSiteReviewSubmissionCount(params?: {
result?: SkinSiteReviewResult | 'COMPLETED'
paperId?: string
}): Promise<SkinSiteResponse<number>> {
const query = new URLSearchParams()
if (params?.result) query.set('result', params.result)
if (params?.paperId) query.set('paperId', params.paperId)
const suffix = query.toString() ? '?' + query.toString() : ''
return skinSiteRequest<number>('review/admin/submissions/count' + suffix)
}
export function skinSiteDecideReviewSubmission(
id: number,
accepted: boolean,
manualScores: Record<string, number> = {},
expectedRevision?: number,
reason = '',
): Promise<SkinSiteResponse<SkinSiteReviewSubmission>> {
const body: Record<string, unknown> = { accepted, manualScores, reason }
if (expectedRevision !== undefined) body.expectedRevision = expectedRevision
return skinSiteRequest<SkinSiteReviewSubmission>('review/admin/submissions/' + id + '/decision', {
method: 'POST',
body,
})
}
export interface SkinSiteReviewInviteDelivery {
email: string
inviteCode: string
emailSent: boolean
emailAttempted: boolean
}
export function skinSiteRegenerateReviewInvite(
id: number,
): Promise<SkinSiteResponse<SkinSiteReviewInviteDelivery>> {
return skinSiteRequest<SkinSiteReviewInviteDelivery>(
'review/admin/submissions/' + id + '/invite/regenerate',
{ method: 'POST' },
)
}