fix(bazaar-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 14:37:58 -03:00
parent ba2e4337d1
commit 332d6bff46
3 changed files with 43 additions and 27 deletions
@@ -16,6 +16,7 @@
import { DatabaseHandler } from './DatabaseHandler';
import { TestDatabaseId, TestDatabases } from '@backstage/backend-test-utils';
import { Knex as KnexType } from 'knex';
const bazaarProject: any = {
name: 'n1',
@@ -35,11 +36,24 @@ describe('DatabaseHandler', () => {
ids: ['POSTGRES_13', 'POSTGRES_9', 'SQLITE_3'],
});
function createDatabaseManager(
client: KnexType,
skipMigrations: boolean = false,
) {
return {
getClient: async () => client,
migrations: {
skip: skipMigrations,
},
};
}
async function createDatabaseHandler(databaseId: TestDatabaseId) {
const knex = await databases.init(databaseId);
const databaseManager = createDatabaseManager(knex);
return {
knex,
dbHandler: await DatabaseHandler.create({ database: knex }),
dbHandler: await DatabaseHandler.create({ database: databaseManager }),
};
}
@@ -14,7 +14,10 @@
* limitations under the License.
*/
import { resolvePackagePath } from '@backstage/backend-common';
import {
PluginDatabaseManager,
resolvePackagePath,
} from '@backstage/backend-common';
import { Knex } from 'knex';
const migrationsDir = resolvePackagePath(
@@ -23,24 +26,27 @@ const migrationsDir = resolvePackagePath(
);
type Options = {
database: Knex;
database: PluginDatabaseManager;
};
export class DatabaseHandler {
static async create(options: Options): Promise<DatabaseHandler> {
const { database } = options;
const client = await database.getClient();
await database.migrate.latest({
directory: migrationsDir,
});
if (!database.migrations?.skip) {
await client.migrate.latest({
directory: migrationsDir,
});
}
return new DatabaseHandler(options);
return new DatabaseHandler(client);
}
private readonly database: Knex;
private readonly client: Knex;
private constructor(options: Options) {
this.database = options.database;
private constructor(client: Knex) {
this.client = client;
}
private columns = [
@@ -58,14 +64,11 @@ export class DatabaseHandler {
];
async getMembers(id: string) {
return await this.database
.select('*')
.from('members')
.where({ item_id: id });
return await this.client.select('*').from('members').where({ item_id: id });
}
async addMember(id: number, userId: string, picture?: string) {
await this.database
await this.client
.insert({
item_id: id,
user_id: userId,
@@ -75,18 +78,18 @@ export class DatabaseHandler {
}
async deleteMember(id: number, userId: string) {
return await this.database('members')
return await this.client('members')
.where({ item_id: id })
.andWhere('user_id', userId)
.del();
}
async getMetadataById(id: number) {
const coalesce = this.database.raw(
const coalesce = this.client.raw(
'coalesce(count(members.item_id), 0) as members_count',
);
return await this.database('metadata')
return await this.client('metadata')
.select([...this.columns, coalesce])
.where({ 'metadata.id': id })
.groupBy(this.columns)
@@ -94,11 +97,11 @@ export class DatabaseHandler {
}
async getMetadataByRef(entityRef: string) {
const coalesce = this.database.raw(
const coalesce = this.client.raw(
'coalesce(count(members.item_id), 0) as members_count',
);
return await this.database('metadata')
return await this.client('metadata')
.select([...this.columns, coalesce])
.where({ 'metadata.entity_ref': entityRef })
.groupBy(this.columns)
@@ -118,7 +121,7 @@ export class DatabaseHandler {
responsible,
} = bazaarProject;
await this.database
await this.client
.insert({
name,
entity_ref: entityRef,
@@ -148,7 +151,7 @@ export class DatabaseHandler {
responsible,
} = bazaarProject;
return await this.database('metadata').where({ id: id }).update({
return await this.client('metadata').where({ id: id }).update({
name,
entity_ref: entityRef,
description,
@@ -163,15 +166,15 @@ export class DatabaseHandler {
}
async deleteMetadata(id: number) {
return await this.database('metadata').where({ id: id }).del();
return await this.client('metadata').where({ id: id }).del();
}
async getProjects() {
const coalesce = this.database.raw(
const coalesce = this.client.raw(
'coalesce(count(members.item_id), 0) as members_count',
);
return await this.database('metadata')
return await this.client('metadata')
.select([...this.columns, coalesce])
.groupBy(this.columns)
.leftJoin('members', 'metadata.id', '=', 'members.item_id');
+1 -2
View File
@@ -33,9 +33,8 @@ export async function createRouter(
options: RouterOptions,
): Promise<express.Router> {
const { logger, database } = options;
const db = await database.getClient();
const dbHandler = await DatabaseHandler.create({ database: db });
const dbHandler = await DatabaseHandler.create({ database });
logger.info('Initializing Bazaar backend');