Files
Genarrative/src/editor/shared/editorApiClient.ts
T
kdletters 071faa482c 统一 Rust 与 TypeScript 格式化门禁
纳入 AGC Cargo workspace 的统一 rustfmt 检查与格式化入口

完成项目 TypeScript/Prettier 与 Rust 全量格式化

修复 Pingora expected executable 门禁的空白敏感误报

同步开发运维文档与 AGC skill pack 格式化忽略规则
2026-09-01 16:28:34 +08:00

86 lines
2.8 KiB
TypeScript

import {
appendApiErrorRequestId,
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 = {
assetHistory: `${ASSETS_API_BASE_PATH}/history`,
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(
appendApiErrorRequestId(
parseApiErrorMessage(responseText, fallbackMessage),
response.headers.get('x-request-id'),
),
);
}
return responseText ? (JSON.parse(responseText) as T) : ({} as T);
}