fix(scaffolder-backend): Allow it to skip migrations
Signed-off-by: Daniel Dias Branco Arthaud <arthaud@gmail.com>
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user