Add ensureConsistency to DB

This commit is contained in:
Andras Schmelczer 2025-02-27 22:27:10 +00:00
commit 453f33817b
No known key found for this signature in database
GPG key ID: FC8F2C3D3D1A718C

View file

@ -17,6 +17,7 @@ export interface StoredDatabase {
export class Database { export class Database {
private documents = new Map<RelativePath, DocumentMetadata>(); private documents = new Map<RelativePath, DocumentMetadata>();
private lastSeenUpdateId: VaultUpdateId | undefined; private lastSeenUpdateId: VaultUpdateId | undefined;
public constructor( public constructor(
@ -32,6 +33,8 @@ export class Database {
this.documents.set(relativePath, metadata); this.documents.set(relativePath, metadata);
} }
} }
this.ensureConsistency();
this.logger.debug(`Loaded ${this.documents.size} documents`); this.logger.debug(`Loaded ${this.documents.size} documents`);
this.lastSeenUpdateId = initialState.lastSeenUpdateId; this.lastSeenUpdateId = initialState.lastSeenUpdateId;
@ -128,9 +131,33 @@ export class Database {
} }
private async save(): Promise<void> { private async save(): Promise<void> {
this.ensureConsistency();
await this.saveData({ await this.saveData({
documents: Object.fromEntries(this.documents.entries()), documents: Object.fromEntries(this.documents.entries()),
lastSeenUpdateId: this.lastSeenUpdateId lastSeenUpdateId: this.lastSeenUpdateId
}); });
} }
private ensureConsistency(): void {
const allMetadata = Array.from(this.documents.entries());
const idToPath = new Map<string, Array<string>>();
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("; ")
);
}
}
} }