From e8c614ae3f8aa61e70ce56b2fc4dad0a8ecd50df Mon Sep 17 00:00:00 2001 From: Bernd Storath <999999bst@gmail.com> Date: Tue, 3 Sep 2024 10:27:44 +0200 Subject: [PATCH] improve migration runner --- src/services/database/lowdb.ts | 11 ++++----- src/services/database/migrations/1.ts | 2 +- src/services/database/migrations/index.ts | 28 ++++++++++++++++++++--- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src/services/database/lowdb.ts b/src/services/database/lowdb.ts index 7311800d..018ee55a 100644 --- a/src/services/database/lowdb.ts +++ b/src/services/database/lowdb.ts @@ -26,6 +26,9 @@ export default class LowDB extends DatabaseProvider { this.#db = await JSONFilePreset(dbFilePath, DEFAULT_DATABASE); } + /** + * @throws + */ async connect() { try { // load file db @@ -36,12 +39,8 @@ export default class LowDB extends DatabaseProvider { DEBUG('Database does not exist : ', error); } - try { - await this.__init(); - await migrationRunner(this.#db); - } catch { - throw new DatabaseError(DatabaseError.ERROR_INIT); - } + await this.__init(); + await migrationRunner(this.#db); DEBUG('Connected successfully'); } diff --git a/src/services/database/migrations/1.ts b/src/services/database/migrations/1.ts index d41197ac..7da1a511 100644 --- a/src/services/database/migrations/1.ts +++ b/src/services/database/migrations/1.ts @@ -30,7 +30,7 @@ export async function run1(db: Low) { log: 'echo ***hidden*** | wg pubkey', }); const database: Database = { - migrations: ['1'], + migrations: [], system: { release: packageJson.release.version, interface: { diff --git a/src/services/database/migrations/index.ts b/src/services/database/migrations/index.ts index 2dec27a7..00161a7c 100644 --- a/src/services/database/migrations/index.ts +++ b/src/services/database/migrations/index.ts @@ -2,9 +2,31 @@ import type { Low } from 'lowdb'; import type { Database } from '../repositories/database'; import { run1 } from './1'; +export type MIGRATION_FN = (db: Low) => Promise; + +const MIGRATION_LIST = { + '1': run1, +} satisfies Record; + +/** + * Runs all migrations + * @throws + */ export async function migrationRunner(db: Low) { - const migrations = db.data.migrations; - if (!migrations.includes('1')) { - await run1(db); + const ranMigrations = db.data.migrations; + const runMigrations = Object.keys( + MIGRATION_LIST + ) as (keyof typeof MIGRATION_LIST)[]; + for (const migrationId of runMigrations) { + if (ranMigrations.includes(migrationId)) { + continue; + } + try { + await MIGRATION_LIST[migrationId](db); + db.data.migrations.push(migrationId); + } catch { + throw new Error(`Failed to run Migration $`); + } } + await db.write(); }