fix(scaffolder-backend): Allow it to skip migrations

Signed-off-by: Daniel Dias Branco Arthaud <arthaud@gmail.com>
This commit is contained in:
Daniel Dias Branco Arthaud
2022-08-14 20:30:46 -03:00
parent f2ee2a5dbb
commit 08b9631a5d
6 changed files with 59 additions and 15 deletions
+1 -1
View File
@@ -504,7 +504,7 @@ export class DatabaseTaskStore implements TaskStore {
// @public
export type DatabaseTaskStoreOptions = {
database: Knex;
database: PluginDatabaseManager | Knex;
};
// @public
@@ -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 = <T>(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<DatabaseTaskStore> {
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<Knex> {
if (isPluginDatabaseManager(database)) {
return database.getClient();
}
return database;
}
private static async runMigrations(
database: PluginDatabaseManager | Knex,
client: Knex,
): Promise<void> {
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: {
@@ -32,8 +32,9 @@ async function createStore(): Promise<DatabaseTaskStore> {
},
}),
).forPlugin('scaffolder');
return await DatabaseTaskStore.create({
database: await manager.getClient(),
database: manager,
});
}
@@ -40,7 +40,7 @@ async function createStore(): Promise<DatabaseTaskStore> {
}),
).forPlugin('scaffolder');
return await DatabaseTaskStore.create({
database: await manager.getClient(),
database: manager,
});
}
@@ -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);
@@ -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;