Files
Genarrative/src/editor/shared/editorApiClient.ts
2026-04-21 09:44:17 +08:00

76 lines
2.6 KiB
TypeScript

import { fetchJson, parseApiErrorMessage, saveJsonObject } from './jsonClient';
export const EDITOR_API_BASE_PATH = '/api/editor';
export const ASSETS_API_BASE_PATH = '/api/assets';
export const EDITOR_JSON_RESOURCE_IDS = {
itemOverrides: 'item-overrides',
npcVisualOverrides: 'npc-visual-overrides',
npcLayoutConfig: 'npc-layout-config',
characterOverrides: 'character-overrides',
monsterOverrides: 'monster-overrides',
sceneOverrides: 'scene-overrides',
sceneNpcOverrides: 'scene-npc-overrides',
stateFunctionOverrides: 'state-function-overrides',
} as const;
export type EditorJsonResourceId =
(typeof EDITOR_JSON_RESOURCE_IDS)[keyof typeof EDITOR_JSON_RESOURCE_IDS];
export const ASSET_API_PATHS = {
characterWorkflowCache: `${ASSETS_API_BASE_PATH}/character-workflow-cache`,
characterVisualGenerate: `${ASSETS_API_BASE_PATH}/character-visual/generate`,
characterVisualPublish: `${ASSETS_API_BASE_PATH}/character-visual/publish`,
characterVisualJobs: `${ASSETS_API_BASE_PATH}/character-visual/jobs`,
characterAnimationGenerate: `${ASSETS_API_BASE_PATH}/character-animation/generate`,
characterAnimationPublish: `${ASSETS_API_BASE_PATH}/character-animation/publish`,
characterAnimationJobs: `${ASSETS_API_BASE_PATH}/character-animation/jobs`,
characterAnimationImportVideo: `${ASSETS_API_BASE_PATH}/character-animation/import-video`,
characterAnimationTemplates: `${ASSETS_API_BASE_PATH}/character-animation/templates`,
} as const;
export const EDITOR_ITEM_CATALOG_API_PATH =
`${EDITOR_API_BASE_PATH}/catalog/items`;
export function buildEditorJsonApiPath(resourceId: EditorJsonResourceId) {
return `${EDITOR_API_BASE_PATH}/json/${resourceId}`;
}
export function fetchEditorJsonResource<T>(
resourceId: EditorJsonResourceId,
fallbackMessage = '读取失败',
) {
return fetchJson<T>(buildEditorJsonApiPath(resourceId), fallbackMessage);
}
export function saveEditorJsonResource(
resourceId: EditorJsonResourceId,
payload: Record<string, unknown>,
fallbackMessage = '保存失败',
) {
return saveJsonObject(
buildEditorJsonApiPath(resourceId),
payload,
fallbackMessage,
);
}
export async function postApiJson<T>(
url: string,
payload: Record<string, unknown>,
fallbackMessage: string,
) {
const response = await fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload),
});
const responseText = await response.text();
if (!response.ok) {
throw new Error(parseApiErrorMessage(responseText, fallbackMessage));
}
return responseText ? (JSON.parse(responseText) as T) : ({} as T);
}