From f1a9108c53a9c1ff3cdf9a09e226dd556f6930b8 Mon Sep 17 00:00:00 2001 From: Minn Soe Date: Mon, 7 Jun 2021 13:07:24 +0100 Subject: [PATCH] refactor: add defaultNameOverride and reorganize Signed-off-by: Minn Soe --- packages/backend-common/api-report.md | 8 +++++ .../backend-common/src/database/connection.ts | 4 +-- .../connectors/defaultNameOverride.test.ts | 26 ++++++++++++++ .../connectors/defaultNameOverride.ts | 34 +++++++++++++++++++ .../src/database/connectors/index.ts | 18 ++++++++++ .../database/{ => connectors}/mysql.test.ts | 0 .../src/database/{ => connectors}/mysql.ts | 22 +++++------- .../{ => connectors}/postgres.test.ts | 0 .../src/database/{ => connectors}/postgres.ts | 16 +++------ .../database/{ => connectors}/sqlite3.test.ts | 0 .../src/database/{ => connectors}/sqlite3.ts | 21 ++++++++---- 11 files changed, 114 insertions(+), 35 deletions(-) create mode 100644 packages/backend-common/src/database/connectors/defaultNameOverride.test.ts create mode 100644 packages/backend-common/src/database/connectors/defaultNameOverride.ts create mode 100644 packages/backend-common/src/database/connectors/index.ts rename packages/backend-common/src/database/{ => connectors}/mysql.test.ts (100%) rename packages/backend-common/src/database/{ => connectors}/mysql.ts (93%) rename packages/backend-common/src/database/{ => connectors}/postgres.test.ts (100%) rename packages/backend-common/src/database/{ => connectors}/postgres.ts (93%) rename packages/backend-common/src/database/{ => connectors}/sqlite3.test.ts (100%) rename packages/backend-common/src/database/{ => connectors}/sqlite3.ts (90%) diff --git a/packages/backend-common/api-report.md b/packages/backend-common/api-report.md index ed78157810..1cf1f4f21b 100644 --- a/packages/backend-common/api-report.md +++ b/packages/backend-common/api-report.md @@ -104,6 +104,14 @@ export function createServiceBuilder(_module: NodeModule): ServiceBuilderImpl; // @public (undocumented) export function createStatusCheckRouter(options: StatusCheckRouterOptions): Promise; +// @public +export interface DatabaseConnector { + createClient(dbConfig: Config, overrides?: Partial): Knex; + createNameOverride(name: string): Partial; + ensureDatabaseExists?(dbConfig: Config, ...databases: Array): Promise; + parseConnectionString(connectionString: string, client?: string): Knex.StaticConnectionConfig; +} + // @public (undocumented) export class DatabaseManager { forPlugin(pluginId: string): PluginDatabaseManager; diff --git a/packages/backend-common/src/database/connection.ts b/packages/backend-common/src/database/connection.ts index 2c2bba28ec..46f040d9d0 100644 --- a/packages/backend-common/src/database/connection.ts +++ b/packages/backend-common/src/database/connection.ts @@ -20,9 +20,7 @@ import knexFactory, { Knex } from 'knex'; import { mergeDatabaseConfig } from './config'; import { DatabaseConnector } from './types'; -import { mysqlConnector } from './mysql'; -import { pgConnector } from './postgres'; -import { sqlite3Connector } from './sqlite3'; +import { mysqlConnector, pgConnector, sqlite3Connector } from './connectors'; type DatabaseClient = 'pg' | 'sqlite3' | 'mysql' | 'mysql2' | string; diff --git a/packages/backend-common/src/database/connectors/defaultNameOverride.test.ts b/packages/backend-common/src/database/connectors/defaultNameOverride.test.ts new file mode 100644 index 0000000000..b41736153a --- /dev/null +++ b/packages/backend-common/src/database/connectors/defaultNameOverride.test.ts @@ -0,0 +1,26 @@ +/* + * Copyright 2021 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import defaultNameOverride from './defaultNameOverride'; + +describe('defaultNameOverride()', () => { + it('returns a partial knex static connection config with database name', () => { + const testDatabaseName = 'testdatabase'; + expect(defaultNameOverride(testDatabaseName)).toHaveProperty( + 'connection.database', + testDatabaseName, + ); + }); +}); diff --git a/packages/backend-common/src/database/connectors/defaultNameOverride.ts b/packages/backend-common/src/database/connectors/defaultNameOverride.ts new file mode 100644 index 0000000000..6296010c76 --- /dev/null +++ b/packages/backend-common/src/database/connectors/defaultNameOverride.ts @@ -0,0 +1,34 @@ +/* + * Copyright 2021 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Knex } from 'knex'; + +/** + * Provides a partial knex config with database name override. + * + * Default override for knex database drivers which accept ConnectionConfig + * with `connection.database` as the database name field. + * + * @param name database name to get config override for + */ +export default function defaultNameOverride( + name: string, +): Partial { + return { + connection: { + database: name, + }, + }; +} diff --git a/packages/backend-common/src/database/connectors/index.ts b/packages/backend-common/src/database/connectors/index.ts new file mode 100644 index 0000000000..f314bb5004 --- /dev/null +++ b/packages/backend-common/src/database/connectors/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright 2021 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export * from './mysql'; +export * from './postgres'; +export * from './sqlite3'; diff --git a/packages/backend-common/src/database/mysql.test.ts b/packages/backend-common/src/database/connectors/mysql.test.ts similarity index 100% rename from packages/backend-common/src/database/mysql.test.ts rename to packages/backend-common/src/database/connectors/mysql.test.ts diff --git a/packages/backend-common/src/database/mysql.ts b/packages/backend-common/src/database/connectors/mysql.ts similarity index 93% rename from packages/backend-common/src/database/mysql.ts rename to packages/backend-common/src/database/connectors/mysql.ts index 0769ad64fc..60f1e09ce0 100644 --- a/packages/backend-common/src/database/mysql.ts +++ b/packages/backend-common/src/database/connectors/mysql.ts @@ -14,12 +14,14 @@ * limitations under the License. */ +import knexFactory, { Knex } from 'knex'; +import yn from 'yn'; + import { Config } from '@backstage/config'; import { InputError } from '@backstage/errors'; -import knexFactory, { Knex } from 'knex'; -import { mergeDatabaseConfig } from './config'; -import { DatabaseConnector } from './types'; -import yn from 'yn'; +import { mergeDatabaseConfig } from '../config'; +import { DatabaseConnector } from '../types'; +import defaultNameOverride from './defaultNameOverride'; /** * Creates a knex mysql database connection @@ -161,22 +163,14 @@ export async function ensureMysqlDatabaseExists( } } -export function createMysqlNameOverride(name: string): Partial { - return { - connection: { - database: name, - }, - }; -} - /** - * MySql database connector. + * MySQL database connector. * * Exposes database connector functionality via an immutable object. */ export const mysqlConnector: DatabaseConnector = Object.freeze({ createClient: createMysqlDatabaseClient, ensureDatabaseExists: ensureMysqlDatabaseExists, - createNameOverride: createMysqlNameOverride, + createNameOverride: defaultNameOverride, parseConnectionString: parseMysqlConnectionString, }); diff --git a/packages/backend-common/src/database/postgres.test.ts b/packages/backend-common/src/database/connectors/postgres.test.ts similarity index 100% rename from packages/backend-common/src/database/postgres.test.ts rename to packages/backend-common/src/database/connectors/postgres.test.ts diff --git a/packages/backend-common/src/database/postgres.ts b/packages/backend-common/src/database/connectors/postgres.ts similarity index 93% rename from packages/backend-common/src/database/postgres.ts rename to packages/backend-common/src/database/connectors/postgres.ts index 5662028113..011e40579b 100644 --- a/packages/backend-common/src/database/postgres.ts +++ b/packages/backend-common/src/database/connectors/postgres.ts @@ -15,9 +15,11 @@ */ import knexFactory, { Knex } from 'knex'; + import { Config } from '@backstage/config'; -import { mergeDatabaseConfig } from './config'; -import { DatabaseConnector } from './types'; +import { mergeDatabaseConfig } from '../config'; +import { DatabaseConnector } from '../types'; +import defaultNameOverride from './defaultNameOverride'; /** * Creates a knex postgres database connection @@ -133,14 +135,6 @@ export async function ensurePgDatabaseExists( } } -export function createPgNameOverride(name: string): Partial { - return { - connection: { - database: name, - }, - }; -} - /** * PostgreSQL database connector. * @@ -149,6 +143,6 @@ export function createPgNameOverride(name: string): Partial { export const pgConnector: DatabaseConnector = Object.freeze({ createClient: createPgDatabaseClient, ensureDatabaseExists: ensurePgDatabaseExists, - createNameOverride: createPgNameOverride, + createNameOverride: defaultNameOverride, parseConnectionString: parsePgConnectionString, }); diff --git a/packages/backend-common/src/database/sqlite3.test.ts b/packages/backend-common/src/database/connectors/sqlite3.test.ts similarity index 100% rename from packages/backend-common/src/database/sqlite3.test.ts rename to packages/backend-common/src/database/connectors/sqlite3.test.ts diff --git a/packages/backend-common/src/database/sqlite3.ts b/packages/backend-common/src/database/connectors/sqlite3.ts similarity index 90% rename from packages/backend-common/src/database/sqlite3.ts rename to packages/backend-common/src/database/connectors/sqlite3.ts index 2499415bef..c9e86c80da 100644 --- a/packages/backend-common/src/database/sqlite3.ts +++ b/packages/backend-common/src/database/connectors/sqlite3.ts @@ -13,16 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import path from 'path'; -import { Config } from '@backstage/config'; import { ensureDirSync } from 'fs-extra'; import knexFactory, { Knex } from 'knex'; -import path from 'path'; -import { mergeDatabaseConfig } from './config'; -import { DatabaseConnector } from './types'; + +import { Config } from '@backstage/config'; +import { mergeDatabaseConfig } from '../config'; +import { DatabaseConnector } from '../types'; /** - * Creates a knex sqlite3 database connection + * Creates a knex SQLite3 database connection * * @param dbConfig The database config * @param overrides Additional options to merge with the config @@ -55,7 +56,7 @@ export function createSqliteDatabaseClient( } /** - * Builds a knex sqlite3 connection config + * Builds a knex SQLite3 connection config * * @param dbConfig The database config * @param overrides Additional options to merge with the config @@ -101,12 +102,18 @@ export function buildSqliteDatabaseConfig( return config; } +/** + * Provides a partial knex SQLite3 config to override database name. + */ export function createSqliteNameOverride(name: string): Partial { return { connection: parseSqliteConnectionString(name), }; } +/** + * Produces a partial knex SQLite3 connection config with database name. + */ export function parseSqliteConnectionString( name: string, ): Knex.Sqlite3ConnectionConfig { @@ -116,7 +123,7 @@ export function parseSqliteConnectionString( } /** - * Sqlite3 database connector. + * SQLite3 database connector. * * Exposes database connector functionality via an immutable object. */