import type { PutSquareHoleWorkRequest, SquareHoleWorkDetailResponse, SquareHoleWorkMutationResponse, SquareHoleWorksResponse, } from '../../../packages/shared/src/contracts/squareHoleWorks'; import { type ApiRetryOptions, requestJson } from '../apiClient'; const SQUARE_HOLE_WORKS_API_BASE = '/api/creation/square-hole/works'; const SQUARE_HOLE_GALLERY_API_BASE = '/api/runtime/square-hole/gallery'; const SQUARE_HOLE_WORKS_READ_RETRY: ApiRetryOptions = { maxRetries: 1, baseDelayMs: 120, maxDelayMs: 360, }; const SQUARE_HOLE_WORKS_WRITE_RETRY: ApiRetryOptions = { maxRetries: 1, baseDelayMs: 120, maxDelayMs: 360, retryUnsafeMethods: true, }; /** * 读取当前用户的方洞挑战作品列表。 */ export function listSquareHoleWorks() { return requestJson( SQUARE_HOLE_WORKS_API_BASE, { method: 'GET' }, '读取方洞挑战作品列表失败', { retry: SQUARE_HOLE_WORKS_READ_RETRY }, ); } /** * 读取公开方洞挑战作品列表。 */ export function listSquareHoleGallery() { return requestJson( SQUARE_HOLE_GALLERY_API_BASE, { method: 'GET' }, '读取方洞挑战广场失败', { retry: SQUARE_HOLE_WORKS_READ_RETRY, skipAuth: true, skipRefresh: true, }, ); } /** * 读取方洞挑战作品详情。 */ export function getSquareHoleWorkDetail(profileId: string) { return requestJson( `${SQUARE_HOLE_WORKS_API_BASE}/${encodeURIComponent(profileId)}`, { method: 'GET' }, '读取方洞挑战作品详情失败', { retry: SQUARE_HOLE_WORKS_READ_RETRY }, ); } /** * 保存结果页可编辑字段。 */ export function updateSquareHoleWork( profileId: string, payload: PutSquareHoleWorkRequest, ) { return requestJson( `${SQUARE_HOLE_WORKS_API_BASE}/${encodeURIComponent(profileId)}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload), }, '更新方洞挑战作品失败', { retry: SQUARE_HOLE_WORKS_WRITE_RETRY }, ); } /** * 发布方洞挑战作品。发布门槛由后端最终确认。 */ export function publishSquareHoleWork(profileId: string) { return requestJson( `${SQUARE_HOLE_WORKS_API_BASE}/${encodeURIComponent(profileId)}/publish`, { method: 'POST' }, '发布方洞挑战作品失败', { retry: SQUARE_HOLE_WORKS_WRITE_RETRY }, ); } /** * 删除当前用户的方洞挑战作品,并返回删除后的列表。 */ export function deleteSquareHoleWork(profileId: string) { return requestJson( `${SQUARE_HOLE_WORKS_API_BASE}/${encodeURIComponent(profileId)}`, { method: 'DELETE' }, '删除方洞挑战作品失败', { retry: SQUARE_HOLE_WORKS_WRITE_RETRY }, ); } export const squareHoleWorksClient = { delete: deleteSquareHoleWork, getDetail: getSquareHoleWorkDetail, listGallery: listSquareHoleGallery, list: listSquareHoleWorks, publish: publishSquareHoleWork, update: updateSquareHoleWork, };