From 453f33817b0b5dc09bc1754a9cce33c8f1973891 Mon Sep 17 00:00:00 2001 From: Andras Schmelczer Date: Thu, 27 Feb 2025 22:27:10 +0000 Subject: [PATCH] Add ensureConsistency to DB --- .../sync-client/src/persistence/database.ts | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/frontend/sync-client/src/persistence/database.ts b/frontend/sync-client/src/persistence/database.ts index 1ac899e..a013d9a 100644 --- a/frontend/sync-client/src/persistence/database.ts +++ b/frontend/sync-client/src/persistence/database.ts @@ -17,6 +17,7 @@ export interface StoredDatabase { export class Database { private documents = new Map(); + private lastSeenUpdateId: VaultUpdateId | undefined; public constructor( @@ -32,6 +33,8 @@ export class Database { this.documents.set(relativePath, metadata); } } + this.ensureConsistency(); + this.logger.debug(`Loaded ${this.documents.size} documents`); this.lastSeenUpdateId = initialState.lastSeenUpdateId; @@ -128,9 +131,33 @@ export class Database { } private async save(): Promise { + this.ensureConsistency(); await this.saveData({ documents: Object.fromEntries(this.documents.entries()), lastSeenUpdateId: this.lastSeenUpdateId }); } + + private ensureConsistency(): void { + const allMetadata = Array.from(this.documents.entries()); + const idToPath = new Map>(); + + allMetadata.forEach(([name, metadata]) => { + idToPath.set(metadata.documentId, [ + ...(idToPath.get(metadata.documentId) ?? []), + name + ]); + }); + + const duplicates = Array.from(idToPath.entries()) + .filter(([_, paths]) => paths.length > 1) + .map(([id, paths]) => `${id} (${paths.join(", ")})`); + + if (duplicates.length > 0) { + throw new Error( + "Document IDs are not unique, found duplicates: " + + duplicates.join("; ") + ); + } + } }