Files
Epicnabbo-Catalogus-Updated…/src/lib/services/figuremap.ts
T
2026-07-13 21:57:41 +02:00

56 lines
1.6 KiB
TypeScript

import { resolveGamedataFile } from "@/lib/services/import/core/asset-paths";
import {
readGamedataJson,
withGamedataLock,
writeGamedataJsonAtomic,
} from "@/lib/services/import/core/gamedata-json";
import { siteSettings } from "@/lib/services/site-settings";
export interface FigureLibrary {
id: string;
revision: number;
parts?: Array<{ id: number; type: string }>;
}
interface FigureMapFile {
libraries: FigureLibrary[];
}
let pathOverride: string | null = null;
export function __setFigureMapPathForTests(p: string | null): void {
pathOverride = p;
}
export async function getFigureMapPath(): Promise<string> {
if (pathOverride) return pathOverride;
const url = await siteSettings.get(
"figuremap_url",
"/nitro-assets/gamedata/FigureMap.json",
);
return resolveGamedataFile(
url ?? "/nitro-assets/gamedata/FigureMap.json",
"FigureMap.json",
);
}
export async function listFigureLibraries(): Promise<FigureLibrary[]> {
const file = await getFigureMapPath();
const data = await readGamedataJson<Partial<FigureMapFile>>(file);
return Array.isArray(data.libraries) ? data.libraries : [];
}
export async function mergeLibrary(lib: FigureLibrary): Promise<void> {
const file = await getFigureMapPath();
await withGamedataLock(file, async () => {
const data = await readGamedataJson<{ libraries?: FigureLibrary[] }>(file);
const libraries = Array.isArray(data.libraries) ? data.libraries : [];
const idx = libraries.findIndex((l) => l.id === lib.id);
if (idx >= 0) {
libraries[idx] = lib;
} else {
libraries.push(lib);
}
await writeGamedataJsonAtomic(file, { ...data, libraries });
});
}