Files
Genarrative/src/services/puzzle-works/puzzleWorksClient.ts
kdletters cbc27bad4a
Some checks failed
CI / verify (push) Has been cancelled
init with react+axum+spacetimedb
2026-04-26 18:06:23 +08:00

103 lines
2.4 KiB
TypeScript

import type {
PuzzleWorkDetailResponse,
PuzzleWorkMutationResponse,
PuzzleWorksResponse,
} from '../../../packages/shared/src/contracts/puzzleWorkSummary';
import { type ApiRetryOptions, requestJson } from '../apiClient';
const PUZZLE_WORKS_API_BASE = '/api/runtime/puzzle/works';
const PUZZLE_WORKS_READ_RETRY: ApiRetryOptions = {
maxRetries: 1,
baseDelayMs: 120,
maxDelayMs: 360,
};
const PUZZLE_WORKS_WRITE_RETRY: ApiRetryOptions = {
maxRetries: 1,
baseDelayMs: 120,
maxDelayMs: 360,
retryUnsafeMethods: true,
};
/**
* 读取当前用户的拼图作品列表。
*/
export async function listPuzzleWorks() {
return requestJson<PuzzleWorksResponse>(
PUZZLE_WORKS_API_BASE,
{
method: 'GET',
},
'读取拼图作品列表失败',
{
retry: PUZZLE_WORKS_READ_RETRY,
},
);
}
/**
* 读取拼图作品详情。
*/
export async function getPuzzleWorkDetail(profileId: string) {
return requestJson<PuzzleWorkDetailResponse>(
`${PUZZLE_WORKS_API_BASE}/${encodeURIComponent(profileId)}`,
{
method: 'GET',
},
'读取拼图作品详情失败',
{
retry: PUZZLE_WORKS_READ_RETRY,
},
);
}
/**
* 更新已发布或草稿态拼图作品的轻量字段。
* 只覆盖结果页约定的标题、摘要、标签与正式图。
*/
export async function updatePuzzleWork(
profileId: string,
payload: {
levelName: string;
summary: string;
themeTags: string[];
coverImageSrc?: string | null;
coverAssetId?: string | null;
},
) {
return requestJson<PuzzleWorkMutationResponse>(
`${PUZZLE_WORKS_API_BASE}/${encodeURIComponent(profileId)}`,
{
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload),
},
'更新拼图作品失败',
{
retry: PUZZLE_WORKS_WRITE_RETRY,
},
);
}
/**
* 删除当前用户的拼图作品,并返回删除后的作品列表。
*/
export async function deletePuzzleWork(profileId: string) {
return requestJson<PuzzleWorksResponse>(
`${PUZZLE_WORKS_API_BASE}/${encodeURIComponent(profileId)}`,
{
method: 'DELETE',
},
'删除拼图作品失败',
{
retry: PUZZLE_WORKS_WRITE_RETRY,
},
);
}
export const puzzleWorksClient = {
delete: deletePuzzleWork,
getDetail: getPuzzleWorkDetail,
list: listPuzzleWorks,
update: updatePuzzleWork,
};