import { IndexedDBAdapter } from "@/services/storage/indexeddb-adapter"; import type { ProjectVersion } from "./types"; /** * Persistence backend for project versions. The IndexedDB implementation is * the production store (its own database, created lazily — the v31→v32 * migration stamps project records); the in-memory implementation backs * unit tests. */ export interface VersionStore { put({ version }: { version: ProjectVersion }): Promise; getAllForProject({ projectId, }: { projectId: string; }): Promise; delete({ id }: { id: string }): Promise; deleteForProject({ projectId }: { projectId: string }): Promise; } export class IndexedDBVersionStore implements VersionStore { private adapter = new IndexedDBAdapter({ dbName: "video-editor-project-versions", storeName: "project-versions", version: 1, }); async put({ version }: { version: ProjectVersion }): Promise { await this.adapter.set({ key: version.id, value: version }); } async getAllForProject({ projectId, }: { projectId: string; }): Promise { const all = await this.adapter.getAll(); return all.filter( (version) => typeof version === "object" && version !== null && version.projectId === projectId, ); } async delete({ id }: { id: string }): Promise { await this.adapter.remove(id); } async deleteForProject({ projectId }: { projectId: string }): Promise { const versions = await this.getAllForProject({ projectId }); await Promise.all( versions.map((version) => this.adapter.remove(version.id)), ); } } export class InMemoryVersionStore implements VersionStore { private versions = new Map(); async put({ version }: { version: ProjectVersion }): Promise { this.versions.set(version.id, version); } async getAllForProject({ projectId, }: { projectId: string; }): Promise { return [...this.versions.values()].filter( (version) => version.projectId === projectId, ); } async delete({ id }: { id: string }): Promise { this.versions.delete(id); } async deleteForProject({ projectId }: { projectId: string }): Promise { for (const version of this.versions.values()) { if (version.projectId === projectId) { this.versions.delete(version.id); } } } }