From 8aab451602ba25306d66f236bf14b03a0556b7ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Mon, 10 Jun 2024 13:57:09 +0200 Subject: [PATCH 1/2] remove intermediate connector MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/popular-boxes-press.md | 5 +++ .../entrypoints/database/connectors/index.ts | 6 ++-- .../entrypoints/database/connectors/mysql.ts | 35 +++++------------- .../database/connectors/postgres.ts | 36 ++++++------------- .../database/connectors/sqlite3.ts | 26 +++----------- 5 files changed, 31 insertions(+), 77 deletions(-) create mode 100644 .changeset/popular-boxes-press.md diff --git a/.changeset/popular-boxes-press.md b/.changeset/popular-boxes-press.md new file mode 100644 index 0000000000..44b50d711a --- /dev/null +++ b/.changeset/popular-boxes-press.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-defaults': patch +--- + +Internal minor refactors of the database connectors diff --git a/packages/backend-defaults/src/entrypoints/database/connectors/index.ts b/packages/backend-defaults/src/entrypoints/database/connectors/index.ts index 9d18e7460a..117f727825 100644 --- a/packages/backend-defaults/src/entrypoints/database/connectors/index.ts +++ b/packages/backend-defaults/src/entrypoints/database/connectors/index.ts @@ -14,6 +14,6 @@ * limitations under the License. */ -export * from './mysql'; -export * from './postgres'; -export * from './sqlite3'; +export { MysqlConnector } from './mysql'; +export { PgConnector } from './postgres'; +export { Sqlite3Connector } from './sqlite3'; diff --git a/packages/backend-defaults/src/entrypoints/database/connectors/mysql.ts b/packages/backend-defaults/src/entrypoints/database/connectors/mysql.ts index 2fb3545047..45368627d9 100644 --- a/packages/backend-defaults/src/entrypoints/database/connectors/mysql.ts +++ b/packages/backend-defaults/src/entrypoints/database/connectors/mysql.ts @@ -25,7 +25,7 @@ import knexFactory, { Knex } from 'knex'; import { merge, omit } from 'lodash'; import limiterFactory from 'p-limit'; import yn from 'yn'; -import { Connector, DatabaseConnector } from '../types'; +import { Connector } from '../types'; import defaultNameOverride from './defaultNameOverride'; import { mergeDatabaseConfig } from './mergeDatabaseConfig'; @@ -226,19 +226,6 @@ export async function dropMysqlDatabase( } } -/** - * MySQL database connector. - * - * Exposes database connector functionality via an immutable object. - */ -export const mysqlConnector: DatabaseConnector = Object.freeze({ - createClient: createMysqlDatabaseClient, - ensureDatabaseExists: ensureMysqlDatabaseExists, - createNameOverride: defaultNameOverride, - parseConnectionString: parseMysqlConnectionString, - dropDatabase: dropMysqlDatabase, -}); - /** * Provides a config lookup path for a plugin's config block. */ @@ -248,14 +235,13 @@ function pluginPath(pluginId: string): string { function normalizeConnection( connection: Knex.StaticConnectionConfig | JsonObject | string | undefined, - client: string, ): Partial { if (typeof connection === 'undefined' || connection === null) { return {}; } return typeof connection === 'string' || connection instanceof String - ? mysqlConnector.parseConnectionString(connection as string, client) + ? parseMysqlConnectionString(connection as string) : connection; } @@ -264,7 +250,7 @@ function createNameOverride( name: string, ): Partial { try { - return mysqlConnector.createNameOverride(name); + return defaultNameOverride(name); } catch (e) { throw new InputError( `Unable to create database name override for '${client}' connector`, @@ -281,7 +267,7 @@ export class MysqlConnector implements Connector { async getClient( pluginId: string, - deps?: { + _deps?: { lifecycle: LifecycleService; pluginMetadata: PluginMetadataService; }, @@ -293,7 +279,7 @@ export class MysqlConnector implements Connector { const databaseName = this.getDatabaseName(pluginId); if (databaseName && this.getEnsureExistsConfig(pluginId)) { try { - await mysqlConnector.ensureDatabaseExists!(pluginConfig, databaseName); + await ensureMysqlDatabaseExists(pluginConfig, databaseName); } catch (error) { throw new Error( `Failed to connect to the database to make sure that '${databaseName}' exists, ${error}`, @@ -313,10 +299,9 @@ export class MysqlConnector implements Connector { this.getDatabaseOverrides(pluginId), ); - const client = mysqlConnector.createClient( + const client = createMysqlDatabaseClient( pluginConfig, databaseClientOverrides, - deps, ); return client; @@ -418,12 +403,9 @@ export class MysqlConnector implements Connector { * unless `pluginDivisionMode` is set to `schema`. */ private getConnectionConfig(pluginId: string): Knex.StaticConnectionConfig { - const { client, overridden } = this.getClientType(pluginId); + const { overridden } = this.getClientType(pluginId); - let baseConnection = normalizeConnection( - this.config.get('connection'), - this.config.getString('client'), - ); + let baseConnection = normalizeConnection(this.config.get('connection')); // Databases cannot be shared unless the `pluginDivisionMode` is set to `schema`. The // `database` property from the base connection is omitted unless `pluginDivisionMode` @@ -435,7 +417,6 @@ export class MysqlConnector implements Connector { // get and normalize optional plugin specific database connection const connection = normalizeConnection( this.config.getOptional(`${pluginPath(pluginId)}.connection`), - client, ); return { diff --git a/packages/backend-defaults/src/entrypoints/database/connectors/postgres.ts b/packages/backend-defaults/src/entrypoints/database/connectors/postgres.ts index b81bfd5b50..4464349b16 100644 --- a/packages/backend-defaults/src/entrypoints/database/connectors/postgres.ts +++ b/packages/backend-defaults/src/entrypoints/database/connectors/postgres.ts @@ -25,7 +25,7 @@ import knexFactory, { Knex } from 'knex'; import { merge, omit } from 'lodash'; import limiterFactory from 'p-limit'; import { Client } from 'pg'; -import { Connector, DatabaseConnector } from '../types'; +import { Connector } from '../types'; import defaultNameOverride from './defaultNameOverride'; import defaultSchemaOverride from './defaultSchemaOverride'; import { mergeDatabaseConfig } from './mergeDatabaseConfig'; @@ -232,16 +232,6 @@ export async function dropPgDatabase( } } -export const pgConnector: DatabaseConnector = Object.freeze({ - createClient: createPgDatabaseClient, - ensureDatabaseExists: ensurePgDatabaseExists, - ensureSchemaExists: ensurePgSchemaExists, - createNameOverride: defaultNameOverride, - createSchemaOverride: defaultSchemaOverride, - parseConnectionString: parsePgConnectionString, - dropDatabase: dropPgDatabase, -}); - /** * Provides a config lookup path for a plugin's config block. */ @@ -251,14 +241,13 @@ function pluginPath(pluginId: string): string { function normalizeConnection( connection: Knex.StaticConnectionConfig | JsonObject | string | undefined, - client: string, ): Partial { if (typeof connection === 'undefined' || connection === null) { return {}; } return typeof connection === 'string' || connection instanceof String - ? pgConnector.parseConnectionString(connection as string, client) + ? parsePgConnectionString(connection as string) : connection; } @@ -267,7 +256,7 @@ function createSchemaOverride( name: string, ): Partial { try { - return pgConnector.createSchemaOverride?.(name); + return defaultSchemaOverride(name); } catch (e) { throw new InputError( `Unable to create database schema override for '${client}' connector`, @@ -281,7 +270,7 @@ function createNameOverride( name: string, ): Partial { try { - return pgConnector.createNameOverride(name); + return defaultNameOverride(name); } catch (e) { throw new InputError( `Unable to create database name override for '${client}' connector`, @@ -298,7 +287,7 @@ export class PgConnector implements Connector { async getClient( pluginId: string, - deps?: { + _deps?: { lifecycle: LifecycleService; pluginMetadata: PluginMetadataService; }, @@ -310,7 +299,7 @@ export class PgConnector implements Connector { const databaseName = this.getDatabaseName(pluginId); if (databaseName && this.getEnsureExistsConfig(pluginId)) { try { - await pgConnector.ensureDatabaseExists!(pluginConfig, databaseName); + await ensurePgDatabaseExists(pluginConfig, databaseName); } catch (error) { throw new Error( `Failed to connect to the database to make sure that '${databaseName}' exists, ${error}`, @@ -326,7 +315,7 @@ export class PgConnector implements Connector { this.getEnsureExistsConfig(pluginId) ) { try { - await pgConnector.ensureSchemaExists!(pluginConfig, pluginId); + await ensurePgSchemaExists(pluginConfig, pluginId); } catch (error) { throw new Error( `Failed to connect to the database to make sure that schema for plugin '${pluginId}' exists, ${error}`, @@ -341,10 +330,9 @@ export class PgConnector implements Connector { schemaOverrides, ); - const client = pgConnector.createClient( + const client = createPgDatabaseClient( pluginConfig, databaseClientOverrides, - deps, ); return client; @@ -465,12 +453,9 @@ export class PgConnector implements Connector { * unless `pluginDivisionMode` is set to `schema`. */ private getConnectionConfig(pluginId: string): Knex.StaticConnectionConfig { - const { client, overridden } = this.getClientType(pluginId); + const { overridden } = this.getClientType(pluginId); - let baseConnection = normalizeConnection( - this.config.get('connection'), - this.config.getString('client'), - ); + let baseConnection = normalizeConnection(this.config.get('connection')); // Databases cannot be shared unless the `pluginDivisionMode` is set to `schema`. The // `database` property from the base connection is omitted unless `pluginDivisionMode` @@ -482,7 +467,6 @@ export class PgConnector implements Connector { // get and normalize optional plugin specific database connection const connection = normalizeConnection( this.config.getOptional(`${pluginPath(pluginId)}.connection`), - client, ); ( diff --git a/packages/backend-defaults/src/entrypoints/database/connectors/sqlite3.ts b/packages/backend-defaults/src/entrypoints/database/connectors/sqlite3.ts index 46ff756854..a66a8981d4 100644 --- a/packages/backend-defaults/src/entrypoints/database/connectors/sqlite3.ts +++ b/packages/backend-defaults/src/entrypoints/database/connectors/sqlite3.ts @@ -26,7 +26,7 @@ import { ensureDirSync } from 'fs-extra'; import knexFactory, { Knex } from 'knex'; import { merge, omit } from 'lodash'; import path from 'path'; -import { Connector, DatabaseConnector } from '../types'; +import { Connector } from '../types'; import { mergeDatabaseConfig } from './mergeDatabaseConfig'; /** @@ -157,17 +157,6 @@ export function parseSqliteConnectionString( }; } -/** - * SQLite3 database connector. - * - * Exposes database connector functionality via an immutable object. - */ -export const sqliteConnector: DatabaseConnector = Object.freeze({ - createClient: createSqliteDatabaseClient, - createNameOverride: createSqliteNameOverride, - parseConnectionString: parseSqliteConnectionString, -}); - /** * Provides a config lookup path for a plugin's config block. */ @@ -177,14 +166,13 @@ function pluginPath(pluginId: string): string { function normalizeConnection( connection: Knex.StaticConnectionConfig | JsonObject | string | undefined, - client: string, ): Partial { if (typeof connection === 'undefined' || connection === null) { return {}; } return typeof connection === 'string' || connection instanceof String - ? sqliteConnector.parseConnectionString(connection as string, client) + ? parseSqliteConnectionString(connection as string) : connection; } @@ -193,7 +181,7 @@ function createNameOverride( name: string, ): Partial { try { - return sqliteConnector.createNameOverride(name); + return createSqliteNameOverride(name); } catch (e) { throw new InputError( `Unable to create database name override for '${client}' connector`, @@ -228,7 +216,7 @@ export class Sqlite3Connector implements Connector { this.getDatabaseOverrides(pluginId), ); - const client = sqliteConnector.createClient( + const client = createSqliteDatabaseClient( pluginConfig, databaseClientOverrides, deps, @@ -340,10 +328,7 @@ export class Sqlite3Connector implements Connector { private getConnectionConfig(pluginId: string): Knex.StaticConnectionConfig { const { client, overridden } = this.getClientType(pluginId); - let baseConnection = normalizeConnection( - this.config.get('connection'), - this.config.getString('client'), - ); + let baseConnection = normalizeConnection(this.config.get('connection')); if ( client.includes('sqlite3') && @@ -366,7 +351,6 @@ export class Sqlite3Connector implements Connector { // get and normalize optional plugin specific database connection const connection = normalizeConnection( this.config.getOptional(`${pluginPath(pluginId)}.connection`), - client, ); return { From 128f89624e772edda88f98bc2e4b6fd857215587 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Mon, 10 Jun 2024 13:59:32 +0200 Subject: [PATCH 2/2] step one of flattening overrides MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../entrypoints/database/connectors/mysql.ts | 18 +------ .../database/connectors/postgres.ts | 47 ++----------------- .../database/connectors/sqlite3.ts | 19 +------- 3 files changed, 5 insertions(+), 79 deletions(-) diff --git a/packages/backend-defaults/src/entrypoints/database/connectors/mysql.ts b/packages/backend-defaults/src/entrypoints/database/connectors/mysql.ts index 45368627d9..b11b659a6d 100644 --- a/packages/backend-defaults/src/entrypoints/database/connectors/mysql.ts +++ b/packages/backend-defaults/src/entrypoints/database/connectors/mysql.ts @@ -245,20 +245,6 @@ function normalizeConnection( : connection; } -function createNameOverride( - client: string, - name: string, -): Partial { - try { - return defaultNameOverride(name); - } catch (e) { - throw new InputError( - `Unable to create database name override for '${client}' connector`, - e, - ); - } -} - export class MysqlConnector implements Connector { constructor( private readonly config: Config, @@ -454,8 +440,6 @@ export class MysqlConnector implements Connector { */ private getDatabaseOverrides(pluginId: string): Knex.Config { const databaseName = this.getDatabaseName(pluginId); - return databaseName - ? createNameOverride(this.getClientType(pluginId).client, databaseName) - : {}; + return databaseName ? defaultNameOverride(databaseName) : {}; } } diff --git a/packages/backend-defaults/src/entrypoints/database/connectors/postgres.ts b/packages/backend-defaults/src/entrypoints/database/connectors/postgres.ts index 4464349b16..444bbc0d18 100644 --- a/packages/backend-defaults/src/entrypoints/database/connectors/postgres.ts +++ b/packages/backend-defaults/src/entrypoints/database/connectors/postgres.ts @@ -19,7 +19,7 @@ import { PluginMetadataService, } from '@backstage/backend-plugin-api'; import { Config, ConfigReader } from '@backstage/config'; -import { ForwardedError, InputError } from '@backstage/errors'; +import { ForwardedError } from '@backstage/errors'; import { JsonObject } from '@backstage/types'; import knexFactory, { Knex } from 'knex'; import { merge, omit } from 'lodash'; @@ -251,34 +251,6 @@ function normalizeConnection( : connection; } -function createSchemaOverride( - client: string, - name: string, -): Partial { - try { - return defaultSchemaOverride(name); - } catch (e) { - throw new InputError( - `Unable to create database schema override for '${client}' connector`, - e, - ); - } -} - -function createNameOverride( - client: string, - name: string, -): Partial { - try { - return defaultNameOverride(name); - } catch (e) { - throw new InputError( - `Unable to create database name override for '${client}' connector`, - e, - ); - } -} - export class PgConnector implements Connector { constructor( private readonly config: Config, @@ -309,7 +281,7 @@ export class PgConnector implements Connector { let schemaOverrides; if (this.getPluginDivisionModeConfig() === 'schema') { - schemaOverrides = this.getSchemaOverrides(pluginId); + schemaOverrides = defaultSchemaOverride(pluginId); if ( this.getEnsureSchemaExistsConfig(pluginId) || this.getEnsureExistsConfig(pluginId) @@ -500,17 +472,6 @@ export class PgConnector implements Connector { }; } - /** - * Provides a partial `Knex.Config` database schema override for a given - * plugin. - * - * @param pluginId - Target plugin to get database schema override - * @returns Partial `Knex.Config` with database schema override - */ - private getSchemaOverrides(pluginId: string): Knex.Config | undefined { - return createSchemaOverride(this.getClientType(pluginId).client, pluginId); - } - /** * Provides a partial `Knex.Config`• database name override for a given plugin. * @@ -519,8 +480,6 @@ export class PgConnector implements Connector { */ private getDatabaseOverrides(pluginId: string): Knex.Config { const databaseName = this.getDatabaseName(pluginId); - return databaseName - ? createNameOverride(this.getClientType(pluginId).client, databaseName) - : {}; + return databaseName ? defaultNameOverride(databaseName) : {}; } } diff --git a/packages/backend-defaults/src/entrypoints/database/connectors/sqlite3.ts b/packages/backend-defaults/src/entrypoints/database/connectors/sqlite3.ts index a66a8981d4..f7d55b34da 100644 --- a/packages/backend-defaults/src/entrypoints/database/connectors/sqlite3.ts +++ b/packages/backend-defaults/src/entrypoints/database/connectors/sqlite3.ts @@ -20,7 +20,6 @@ import { PluginMetadataService, } from '@backstage/backend-plugin-api'; import { Config, ConfigReader } from '@backstage/config'; -import { InputError } from '@backstage/errors'; import { JsonObject } from '@backstage/types'; import { ensureDirSync } from 'fs-extra'; import knexFactory, { Knex } from 'knex'; @@ -176,20 +175,6 @@ function normalizeConnection( : connection; } -function createNameOverride( - client: string, - name: string, -): Partial { - try { - return createSqliteNameOverride(name); - } catch (e) { - throw new InputError( - `Unable to create database name override for '${client}' connector`, - e, - ); - } -} - export class Sqlite3Connector implements Connector { constructor(private readonly config: Config) {} @@ -388,8 +373,6 @@ export class Sqlite3Connector implements Connector { */ private getDatabaseOverrides(pluginId: string): Knex.Config { const databaseName = this.getDatabaseName(pluginId); - return databaseName - ? createNameOverride(this.getClientType(pluginId).client, databaseName) - : {}; + return databaseName ? createSqliteNameOverride(databaseName) : {}; } }