From 3ee59b0e965e45f869ba71ab5270080ccd73cb55 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 29 Nov 2023 12:34:50 +0100 Subject: [PATCH] Migrations in a queue --- packages/server/src/appMigrations/migrations.ts | 7 ++++++- packages/server/src/appMigrations/queue.ts | 15 +++++++-------- .../src/appMigrations/tests/migrations.spec.ts | 9 +++------ 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/packages/server/src/appMigrations/migrations.ts b/packages/server/src/appMigrations/migrations.ts index a39f679a17..893881e716 100644 --- a/packages/server/src/appMigrations/migrations.ts +++ b/packages/server/src/appMigrations/migrations.ts @@ -1,3 +1,8 @@ // This file should never be manually modified, use `yarn add-app-migration` in order to add a new one -export const MIGRATIONS: Record Promise }> = {} +export const MIGRATIONS: { + migrationId: string + migrationFunc: () => Promise +}[] = [ + // Migrations will be executed sorted by migrationId +] diff --git a/packages/server/src/appMigrations/queue.ts b/packages/server/src/appMigrations/queue.ts index f783b88e2a..8d05a8b89a 100644 --- a/packages/server/src/appMigrations/queue.ts +++ b/packages/server/src/appMigrations/queue.ts @@ -11,10 +11,6 @@ import environment from "../environment" const appMigrationQueue = queue.createQueue(queue.JobQueue.APP_MIGRATION) appMigrationQueue.process(processMessage) -export async function runMigration(migrationId: string) { - await MIGRATIONS[migrationId].migration() -} - // TODO export const PROCESS_MIGRATION_TIMEOUT = environment.APP_MIGRATION_TIMEOUT || 60000 @@ -34,8 +30,8 @@ async function processMessage(job: Job) { await context.doInAppContext(appId, async () => { const currentVersion = await getAppMigrationMetadata(appId) - const pendingMigrations = Object.keys(MIGRATIONS).filter( - m => m > currentVersion + const pendingMigrations = MIGRATIONS.filter( + m => m.migrationId > currentVersion ) let index = 0 @@ -45,8 +41,11 @@ async function processMessage(job: Job) { migration, appId, }) - await runMigration(migration) - await updateAppMigrationMetadata({ appId, version: migration }) + await migration.migrationFunc() + await updateAppMigrationMetadata({ + appId, + version: migration.migrationId, + }) } }) } diff --git a/packages/server/src/appMigrations/tests/migrations.spec.ts b/packages/server/src/appMigrations/tests/migrations.spec.ts index c2fddc2766..a5ceb05d69 100644 --- a/packages/server/src/appMigrations/tests/migrations.spec.ts +++ b/packages/server/src/appMigrations/tests/migrations.spec.ts @@ -1,22 +1,19 @@ import { context } from "@budibase/backend-core" import * as setup from "../../api/routes/tests/utilities" import { MIGRATIONS } from "../migrations" -import { runMigration } from "../queue" describe("migration", () => { it("each migration can rerun safely", async () => { const config = setup.getConfig() await config.init() - const migrations = Object.keys(MIGRATIONS) - await config.doInContext(config.getAppId(), async () => { const db = context.getAppDB() - for (const migration of migrations) { - await runMigration(migration) + for (const migration of MIGRATIONS) { + await migration.migrationFunc() const docs = await db.allDocs({ include_docs: true }) - await runMigration(migration) + await migration.migrationFunc() const latestDocs = await db.allDocs({ include_docs: true }) expect(docs).toEqual(latestDocs)