From 08b9631a5d13549b5323789edf800fcc3dc21141 Mon Sep 17 00:00:00 2001 From: Daniel Dias Branco Arthaud Date: Sun, 14 Aug 2022 20:30:46 -0300 Subject: [PATCH] fix(scaffolder-backend): Allow it to skip migrations Signed-off-by: Daniel Dias Branco Arthaud --- plugins/scaffolder-backend/api-report.md | 2 +- .../src/scaffolder/tasks/DatabaseTaskStore.ts | 61 ++++++++++++++++--- .../tasks/StorageTaskBroker.test.ts | 3 +- .../src/scaffolder/tasks/TaskWorker.test.ts | 2 +- .../src/service/router.test.ts | 2 +- .../scaffolder-backend/src/service/router.ts | 4 +- 6 files changed, 59 insertions(+), 15 deletions(-) diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index 96a4d7b400..497e63f888 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -504,7 +504,7 @@ export class DatabaseTaskStore implements TaskStore { // @public export type DatabaseTaskStoreOptions = { - database: Knex; + database: PluginDatabaseManager | Knex; }; // @public diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts index d62e59744f..d7f105887b 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/DatabaseTaskStore.ts @@ -15,7 +15,10 @@ */ import { JsonObject } from '@backstage/types'; -import { resolvePackagePath } from '@backstage/backend-common'; +import { + PluginDatabaseManager, + resolvePackagePath, +} from '@backstage/backend-common'; import { ConflictError, NotFoundError } from '@backstage/errors'; import { Knex } from 'knex'; import { v4 as uuid } from 'uuid'; @@ -61,9 +64,20 @@ export type RawDbTaskEventRow = { * @public */ export type DatabaseTaskStoreOptions = { - database: Knex; + database: PluginDatabaseManager | Knex; }; +/** + * Typeguard to help DatabaseTaskStore understand when database is PluginDatabaseManager vs. when database is a Knex instance. + * + * * @public + */ +function isPluginDatabaseManager( + opt: PluginDatabaseManager | Knex, +): opt is PluginDatabaseManager { + return (opt as PluginDatabaseManager).getClient !== undefined; +} + const parseSqlDateToIsoString = (input: T): T | string => { if (typeof input === 'string') { return DateTime.fromSQL(input, { zone: 'UTC' }).toISO(); @@ -83,14 +97,45 @@ export class DatabaseTaskStore implements TaskStore { static async create( options: DatabaseTaskStoreOptions, ): Promise { - await options.database.migrate.latest({ - directory: migrationsDir, - }); - return new DatabaseTaskStore(options); + const { database } = options; + const client = await this.getClient(database); + + await this.runMigrations(database, client); + + return new DatabaseTaskStore(client); } - private constructor(options: DatabaseTaskStoreOptions) { - this.db = options.database; + private static async getClient( + database: PluginDatabaseManager | Knex, + ): Promise { + if (isPluginDatabaseManager(database)) { + return database.getClient(); + } + + return database; + } + + private static async runMigrations( + database: PluginDatabaseManager | Knex, + client: Knex, + ): Promise { + if (!isPluginDatabaseManager(database)) { + await client.migrate.latest({ + directory: migrationsDir, + }); + + return; + } + + if (!database.migrations?.skip) { + await client.migrate.latest({ + directory: migrationsDir, + }); + } + } + + private constructor(client: Knex) { + this.db = client; } async list(options: { diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.test.ts index 2350072806..4fc142a991 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/StorageTaskBroker.test.ts @@ -32,8 +32,9 @@ async function createStore(): Promise { }, }), ).forPlugin('scaffolder'); + return await DatabaseTaskStore.create({ - database: await manager.getClient(), + database: manager, }); } diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts index e1421486f4..ee8ae400c4 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts @@ -40,7 +40,7 @@ async function createStore(): Promise { }), ).forPlugin('scaffolder'); return await DatabaseTaskStore.create({ - database: await manager.getClient(), + database: manager, }); } diff --git a/plugins/scaffolder-backend/src/service/router.test.ts b/plugins/scaffolder-backend/src/service/router.test.ts index f769038369..e59f222e2d 100644 --- a/plugins/scaffolder-backend/src/service/router.test.ts +++ b/plugins/scaffolder-backend/src/service/router.test.ts @@ -127,7 +127,7 @@ describe('createRouter', () => { beforeEach(async () => { const logger = getVoidLogger(); const databaseTaskStore = await DatabaseTaskStore.create({ - database: await createDatabase().getClient(), + database: createDatabase(), }); taskBroker = new StorageTaskBroker(databaseTaskStore, logger); diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts index 2a8f15d967..1c6ea39443 100644 --- a/plugins/scaffolder-backend/src/service/router.ts +++ b/plugins/scaffolder-backend/src/service/router.ts @@ -97,9 +97,7 @@ export async function createRouter( let taskBroker: TaskBroker; if (!options.taskBroker) { - const databaseTaskStore = await DatabaseTaskStore.create({ - database: await database.getClient(), - }); + const databaseTaskStore = await DatabaseTaskStore.create({ database }); taskBroker = new StorageTaskBroker(databaseTaskStore, logger); } else { taskBroker = options.taskBroker;