feat(02-03): add IndexedDB accessor methods for companionAssets, styleReference, forestElements

- saveCompanionAssets/getCompanionAssets keyed by characterType
- saveStyleReference/getStyleReference singleton pattern (id: 1)
- saveForestElement (auto-increment add) / getForestElements (getAll)
- Extended type imports for CompanionAssets, CompanionType, ForestElement, StyleReference

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-29 12:04:48 +02:00
co-authored by Claude Opus 4.6
parent c268c6050e
commit a242ce1570
+68 -1
View File
@@ -1,4 +1,11 @@
import type { Progress, Settings } from "../types"; import type {
CompanionAssets,
CompanionType,
ForestElement,
Progress,
Settings,
StyleReference,
} from "../types";
const DB_NAME = "zauberwald"; const DB_NAME = "zauberwald";
const DB_VERSION = 1; const DB_VERSION = 1;
@@ -68,3 +75,63 @@ export function saveSettings(db: IDBDatabase, settings: Settings): Promise<void>
request.onerror = () => reject(request.error); request.onerror = () => reject(request.error);
}); });
} }
export function saveCompanionAssets(db: IDBDatabase, assets: CompanionAssets): Promise<void> {
return new Promise((resolve, reject) => {
const tx = db.transaction("companionAssets", "readwrite");
const store = tx.objectStore("companionAssets");
const request = store.put(assets);
request.onsuccess = () => resolve();
request.onerror = () => reject(request.error);
});
}
export function getCompanionAssets(db: IDBDatabase, characterType: CompanionType): Promise<CompanionAssets | null> {
return new Promise((resolve, reject) => {
const tx = db.transaction("companionAssets", "readonly");
const store = tx.objectStore("companionAssets");
const request = store.get(characterType);
request.onsuccess = () => resolve((request.result as CompanionAssets) ?? null);
request.onerror = () => reject(request.error);
});
}
export function saveStyleReference(db: IDBDatabase, ref: StyleReference): Promise<void> {
return new Promise((resolve, reject) => {
const tx = db.transaction("styleReference", "readwrite");
const store = tx.objectStore("styleReference");
const request = store.put(ref);
request.onsuccess = () => resolve();
request.onerror = () => reject(request.error);
});
}
export function getStyleReference(db: IDBDatabase): Promise<StyleReference | null> {
return new Promise((resolve, reject) => {
const tx = db.transaction("styleReference", "readonly");
const store = tx.objectStore("styleReference");
const request = store.get(1);
request.onsuccess = () => resolve((request.result as StyleReference) ?? null);
request.onerror = () => reject(request.error);
});
}
export function saveForestElement(db: IDBDatabase, element: ForestElement): Promise<number> {
return new Promise((resolve, reject) => {
const tx = db.transaction("forestElements", "readwrite");
const store = tx.objectStore("forestElements");
const request = store.add(element);
request.onsuccess = () => resolve(request.result as number);
request.onerror = () => reject(request.error);
});
}
export function getForestElements(db: IDBDatabase): Promise<ForestElement[]> {
return new Promise((resolve, reject) => {
const tx = db.transaction("forestElements", "readonly");
const store = tx.objectStore("forestElements");
const request = store.getAll();
request.onsuccess = () => resolve((request.result as ForestElement[]) ?? []);
request.onerror = () => reject(request.error);
});
}