From ad0f2169d697d8dd5ff0fb3a80bf7b3151e1dd24 Mon Sep 17 00:00:00 2001 From: Joep Peeters Date: Fri, 17 Feb 2023 10:10:21 +0100 Subject: [PATCH 01/16] extend definition with `setOwner` Signed-off-by: Joep Peeters --- packages/backend-common/config.d.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/backend-common/config.d.ts b/packages/backend-common/config.d.ts index 6c473af3c0..ad83bde485 100644 --- a/packages/backend-common/config.d.ts +++ b/packages/backend-common/config.d.ts @@ -96,6 +96,8 @@ export interface Config { * @default database */ pluginDivisionMode?: 'database' | 'schema'; + /** Configures the ownership of newly created schemas in pg databases. */ + setOwner?: string; /** * Arbitrary config object to pass to knex when initializing * (https://knexjs.org/#Installation-client). Most notable is the debug @@ -125,6 +127,8 @@ export interface Config { * This is merged recursively into the base knexConfig */ knexConfig?: object; + /** Configures the ownership of newly created schemas in pg databases. */ + setOwner?: string; }; }; }; From 8f50a807328e05537d1482415b1286505a3eb855 Mon Sep 17 00:00:00 2001 From: Joep Peeters Date: Fri, 17 Feb 2023 10:11:18 +0100 Subject: [PATCH 02/16] add `setOwner` to pluginConfig Signed-off-by: Joep Peeters --- packages/backend-common/src/database/DatabaseManager.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/backend-common/src/database/DatabaseManager.ts b/packages/backend-common/src/database/DatabaseManager.ts index 08979a92f8..7e16dd3787 100644 --- a/packages/backend-common/src/database/DatabaseManager.ts +++ b/packages/backend-common/src/database/DatabaseManager.ts @@ -186,6 +186,13 @@ export class DatabaseManager { }; } + private getSetOwnerConfig(pluginId: string): string | undefined { + return ( + this.config.getOptionalString(`${pluginPath(pluginId)}.setOwner`) ?? + this.config.getOptionalString('setOwner') + ); + } + /** * Provides the knexConfig which should be used for a given plugin. * @@ -283,6 +290,7 @@ export class DatabaseManager { ...this.getAdditionalKnexConfig(pluginId), client, connection: this.getConnectionConfig(pluginId), + setOwner: this.getSetOwnerConfig(pluginId), }; } From a9f4698a29d172f13e9c4716393af464a6f9b644 Mon Sep 17 00:00:00 2001 From: Joep Peeters Date: Fri, 17 Feb 2023 10:15:19 +0100 Subject: [PATCH 03/16] set ownership if configured Signed-off-by: Joep Peeters --- .../src/database/connectors/postgres.ts | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/packages/backend-common/src/database/connectors/postgres.ts b/packages/backend-common/src/database/connectors/postgres.ts index c780fb829b..fccd8ac48e 100644 --- a/packages/backend-common/src/database/connectors/postgres.ts +++ b/packages/backend-common/src/database/connectors/postgres.ts @@ -35,6 +35,14 @@ export function createPgDatabaseClient( ) { const knexConfig = buildPgDatabaseConfig(dbConfig, overrides); const database = knexFactory(knexConfig); + + const owner = dbConfig.getOptionalString('setOwner') + + if (owner) { + database.client.pool.on('createSuccess', (_event: any, pgClient: any) => { + pgClient.query(`SET ROLE ${owner}`, () => { }); + }); + } return database; } @@ -147,10 +155,18 @@ export async function ensurePgSchemaExists( ...schemas: Array ): Promise { const admin = createPgDatabaseClient(dbConfig); + const setOwner = dbConfig.getOptionalString('setOwner'); try { const ensureSchema = async (database: string) => { - await admin.raw(`CREATE SCHEMA IF NOT EXISTS ??`, [database]); + if (setOwner) { + await admin.raw(`CREATE SCHEMA IF NOT EXISTS ?? AUTHORIZATION ??`, [ + database, + setOwner, + ]); + } else { + await admin.raw(`CREATE SCHEMA IF NOT EXISTS ??`, [database]); + } }; await Promise.all(schemas.map(ensureSchema)); From 64560a55c2a6e730f755f20b569d5ee75e2e3783 Mon Sep 17 00:00:00 2001 From: Joep Peeters Date: Fri, 17 Feb 2023 14:57:09 +0100 Subject: [PATCH 04/16] test config handling Signed-off-by: Joep Peeters --- .../src/database/DatabaseManager.test.ts | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/packages/backend-common/src/database/DatabaseManager.test.ts b/packages/backend-common/src/database/DatabaseManager.test.ts index 95511d5aba..878fe62e4f 100644 --- a/packages/backend-common/src/database/DatabaseManager.test.ts +++ b/packages/backend-common/src/database/DatabaseManager.test.ts @@ -687,5 +687,59 @@ describe('DatabaseManager', () => { }), ); }); + + it('sets the owner config for plugin using default config', async () => { + const testManager = DatabaseManager.fromConfig( + new ConfigReader({ + backend: { + database: { + client: 'pg', + connection: { + host: 'localhost', + database: 'foodb', + }, + setOwner: 'backstage', + plugin: { + testowner: {}, + }, + }, + }, + }), + ); + await testManager.forPlugin('testowner').getClient(); + + const mockCalls = mocked(createDatabaseClient).mock.calls.splice(-1); + const [baseConfig] = mockCalls[0]; + + expect(baseConfig.data.setOwner).toEqual('backstage'); + }); + + it('sets the owner config for plugin using plugin config', async () => { + const testManager = DatabaseManager.fromConfig( + new ConfigReader({ + backend: { + database: { + client: 'pg', + connection: { + host: 'localhost', + database: 'foodb', + }, + setOwner: 'backstage', + plugin: { + testowner: { + setOwner: 'backstage-plugin', + }, + }, + }, + }, + }), + ); + await testManager.forPlugin('testowner').getClient(); + + const mockCalls = mocked(createDatabaseClient).mock.calls.splice(-1); + const [baseConfig] = mockCalls[0]; + + expect(baseConfig.data.setOwner).toEqual('backstage-plugin'); + }); }); }); From f75097868a7fb252ccd142e629b8d4b814b5dfe6 Mon Sep 17 00:00:00 2001 From: Joep Peeters Date: Fri, 17 Feb 2023 14:57:36 +0100 Subject: [PATCH 05/16] add changeset Signed-off-by: Joep Peeters --- .changeset/mean-toys-itch.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/mean-toys-itch.md diff --git a/.changeset/mean-toys-itch.md b/.changeset/mean-toys-itch.md new file mode 100644 index 0000000000..dc0d7b1155 --- /dev/null +++ b/.changeset/mean-toys-itch.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-common': patch +--- + +Adds config option to set ownership for newly created schema's and tables in Postgres From 53cd08bca29136cc1b117517dc68d453a214085d Mon Sep 17 00:00:00 2001 From: Joep Peeters Date: Fri, 17 Feb 2023 15:01:47 +0100 Subject: [PATCH 06/16] fix: spelling Signed-off-by: Joep Peeters --- .changeset/mean-toys-itch.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/mean-toys-itch.md b/.changeset/mean-toys-itch.md index dc0d7b1155..19f8c861df 100644 --- a/.changeset/mean-toys-itch.md +++ b/.changeset/mean-toys-itch.md @@ -2,4 +2,4 @@ '@backstage/backend-common': patch --- -Adds config option to set ownership for newly created schema's and tables in Postgres +Adds config option to set ownership for newly created schemas and tables in Postgres From e1dafc78dfc236a0fbe602a05ce521608974c692 Mon Sep 17 00:00:00 2001 From: Joep Peeters Date: Tue, 21 Feb 2023 16:50:39 +0100 Subject: [PATCH 07/16] Adhere to typespec Signed-off-by: Joep Peeters --- packages/backend-common/src/database/DatabaseManager.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/backend-common/src/database/DatabaseManager.ts b/packages/backend-common/src/database/DatabaseManager.ts index 7e16dd3787..07a9bd2934 100644 --- a/packages/backend-common/src/database/DatabaseManager.ts +++ b/packages/backend-common/src/database/DatabaseManager.ts @@ -285,12 +285,13 @@ export class DatabaseManager { */ private getConfigForPlugin(pluginId: string): Knex.Config { const { client } = this.getClientType(pluginId); + const setOwner = this.getSetOwnerConfig(pluginId); return { ...this.getAdditionalKnexConfig(pluginId), client, connection: this.getConnectionConfig(pluginId), - setOwner: this.getSetOwnerConfig(pluginId), + ...(setOwner && { setOwner }), }; } From 27c145a7b66d6c38d0ba2fd69a167c5a2de96f8e Mon Sep 17 00:00:00 2001 From: Joep Peeters Date: Tue, 21 Feb 2023 17:25:21 +0100 Subject: [PATCH 08/16] apply formatter Signed-off-by: Joep Peeters --- packages/backend-common/src/database/connectors/postgres.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/backend-common/src/database/connectors/postgres.ts b/packages/backend-common/src/database/connectors/postgres.ts index fccd8ac48e..682b2e6ceb 100644 --- a/packages/backend-common/src/database/connectors/postgres.ts +++ b/packages/backend-common/src/database/connectors/postgres.ts @@ -36,11 +36,11 @@ export function createPgDatabaseClient( const knexConfig = buildPgDatabaseConfig(dbConfig, overrides); const database = knexFactory(knexConfig); - const owner = dbConfig.getOptionalString('setOwner') + const owner = dbConfig.getOptionalString('setOwner'); if (owner) { database.client.pool.on('createSuccess', (_event: any, pgClient: any) => { - pgClient.query(`SET ROLE ${owner}`, () => { }); + pgClient.query(`SET ROLE ${owner}`, () => {}); }); } return database; From c8bdcdccb990aa88c1a981319539cc717bbdcf0a Mon Sep 17 00:00:00 2001 From: Joep Peeters Date: Mon, 6 Mar 2023 09:27:49 +0100 Subject: [PATCH 09/16] rename: setRole -> role Signed-off-by: Joep Peeters --- packages/backend-common/config.d.ts | 4 ++-- .../src/database/DatabaseManager.test.ts | 10 +++++----- .../backend-common/src/database/DatabaseManager.ts | 10 +++++----- .../src/database/connectors/postgres.ts | 12 ++++++------ 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/backend-common/config.d.ts b/packages/backend-common/config.d.ts index ad83bde485..8dd2c2db84 100644 --- a/packages/backend-common/config.d.ts +++ b/packages/backend-common/config.d.ts @@ -97,7 +97,7 @@ export interface Config { */ pluginDivisionMode?: 'database' | 'schema'; /** Configures the ownership of newly created schemas in pg databases. */ - setOwner?: string; + role?: string; /** * Arbitrary config object to pass to knex when initializing * (https://knexjs.org/#Installation-client). Most notable is the debug @@ -128,7 +128,7 @@ export interface Config { */ knexConfig?: object; /** Configures the ownership of newly created schemas in pg databases. */ - setOwner?: string; + role?: string; }; }; }; diff --git a/packages/backend-common/src/database/DatabaseManager.test.ts b/packages/backend-common/src/database/DatabaseManager.test.ts index 878fe62e4f..336e5d499c 100644 --- a/packages/backend-common/src/database/DatabaseManager.test.ts +++ b/packages/backend-common/src/database/DatabaseManager.test.ts @@ -698,7 +698,7 @@ describe('DatabaseManager', () => { host: 'localhost', database: 'foodb', }, - setOwner: 'backstage', + role: 'backstage', plugin: { testowner: {}, }, @@ -711,7 +711,7 @@ describe('DatabaseManager', () => { const mockCalls = mocked(createDatabaseClient).mock.calls.splice(-1); const [baseConfig] = mockCalls[0]; - expect(baseConfig.data.setOwner).toEqual('backstage'); + expect(baseConfig.data.role).toEqual('backstage'); }); it('sets the owner config for plugin using plugin config', async () => { @@ -724,10 +724,10 @@ describe('DatabaseManager', () => { host: 'localhost', database: 'foodb', }, - setOwner: 'backstage', + role: 'backstage', plugin: { testowner: { - setOwner: 'backstage-plugin', + role: 'backstage-plugin', }, }, }, @@ -739,7 +739,7 @@ describe('DatabaseManager', () => { const mockCalls = mocked(createDatabaseClient).mock.calls.splice(-1); const [baseConfig] = mockCalls[0]; - expect(baseConfig.data.setOwner).toEqual('backstage-plugin'); + expect(baseConfig.data.role).toEqual('backstage-plugin'); }); }); }); diff --git a/packages/backend-common/src/database/DatabaseManager.ts b/packages/backend-common/src/database/DatabaseManager.ts index 07a9bd2934..02f2c6b172 100644 --- a/packages/backend-common/src/database/DatabaseManager.ts +++ b/packages/backend-common/src/database/DatabaseManager.ts @@ -186,10 +186,10 @@ export class DatabaseManager { }; } - private getSetOwnerConfig(pluginId: string): string | undefined { + private getRoleConfig(pluginId: string): string | undefined { return ( - this.config.getOptionalString(`${pluginPath(pluginId)}.setOwner`) ?? - this.config.getOptionalString('setOwner') + this.config.getOptionalString(`${pluginPath(pluginId)}.role`) ?? + this.config.getOptionalString('role') ); } @@ -285,13 +285,13 @@ export class DatabaseManager { */ private getConfigForPlugin(pluginId: string): Knex.Config { const { client } = this.getClientType(pluginId); - const setOwner = this.getSetOwnerConfig(pluginId); + const role = this.getRoleConfig(pluginId); return { ...this.getAdditionalKnexConfig(pluginId), client, connection: this.getConnectionConfig(pluginId), - ...(setOwner && { setOwner }), + ...(role && { role }), }; } diff --git a/packages/backend-common/src/database/connectors/postgres.ts b/packages/backend-common/src/database/connectors/postgres.ts index 682b2e6ceb..54adc90757 100644 --- a/packages/backend-common/src/database/connectors/postgres.ts +++ b/packages/backend-common/src/database/connectors/postgres.ts @@ -36,11 +36,11 @@ export function createPgDatabaseClient( const knexConfig = buildPgDatabaseConfig(dbConfig, overrides); const database = knexFactory(knexConfig); - const owner = dbConfig.getOptionalString('setOwner'); + const role = dbConfig.getOptionalString('role'); - if (owner) { + if (role) { database.client.pool.on('createSuccess', (_event: any, pgClient: any) => { - pgClient.query(`SET ROLE ${owner}`, () => {}); + pgClient.query(`SET ROLE ${role}`, () => {}); }); } return database; @@ -155,14 +155,14 @@ export async function ensurePgSchemaExists( ...schemas: Array ): Promise { const admin = createPgDatabaseClient(dbConfig); - const setOwner = dbConfig.getOptionalString('setOwner'); + const role = dbConfig.getOptionalString('role'); try { const ensureSchema = async (database: string) => { - if (setOwner) { + if (role) { await admin.raw(`CREATE SCHEMA IF NOT EXISTS ?? AUTHORIZATION ??`, [ database, - setOwner, + role, ]); } else { await admin.raw(`CREATE SCHEMA IF NOT EXISTS ??`, [database]); From 0db534301019ef653bd4adc8bf51e7322c9171f6 Mon Sep 17 00:00:00 2001 From: Joep Peeters Date: Mon, 6 Mar 2023 09:29:07 +0100 Subject: [PATCH 10/16] stricter types Signed-off-by: Joep Peeters --- .../backend-common/src/database/connectors/postgres.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/backend-common/src/database/connectors/postgres.ts b/packages/backend-common/src/database/connectors/postgres.ts index 54adc90757..0b20b6f19a 100644 --- a/packages/backend-common/src/database/connectors/postgres.ts +++ b/packages/backend-common/src/database/connectors/postgres.ts @@ -39,9 +39,12 @@ export function createPgDatabaseClient( const role = dbConfig.getOptionalString('role'); if (role) { - database.client.pool.on('createSuccess', (_event: any, pgClient: any) => { - pgClient.query(`SET ROLE ${role}`, () => {}); - }); + database.client.pool.on( + 'createSuccess', + (_event: number, pgClient: Knex.Client) => { + pgClient.query(`SET ROLE ${role}`, () => {}); + }, + ); } return database; } From d68c16a28590363df3cd17a93650b783e364367a Mon Sep 17 00:00:00 2001 From: Joep Peeters Date: Mon, 6 Mar 2023 12:05:18 +0100 Subject: [PATCH 11/16] add callback with error handling Signed-off-by: Joep Peeters --- packages/backend-common/src/database/connectors/postgres.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/backend-common/src/database/connectors/postgres.ts b/packages/backend-common/src/database/connectors/postgres.ts index 0b20b6f19a..afa0d1f732 100644 --- a/packages/backend-common/src/database/connectors/postgres.ts +++ b/packages/backend-common/src/database/connectors/postgres.ts @@ -42,7 +42,9 @@ export function createPgDatabaseClient( database.client.pool.on( 'createSuccess', (_event: number, pgClient: Knex.Client) => { - pgClient.query(`SET ROLE ${role}`, () => {}); + pgClient.query(`SET ROLE ${role}`, (err: Error, _res: any) => { + if (err) throw err; + }); }, ); } From f8a9fa1b0fe1519615345a26905cfc95d97228ce Mon Sep 17 00:00:00 2001 From: Joep Peeters Date: Mon, 6 Mar 2023 12:28:03 +0100 Subject: [PATCH 12/16] add @types/pg and set correct type Signed-off-by: Joep Peeters --- packages/backend-common/package.json | 2 ++ .../src/database/connectors/postgres.ts | 3 +- yarn.lock | 33 +++++++++++++------ 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index d356d67fab..2378a24383 100644 --- a/packages/backend-common/package.json +++ b/packages/backend-common/package.json @@ -78,6 +78,7 @@ "morgan": "^1.10.0", "node-fetch": "^2.6.7", "node-forge": "^1.3.1", + "pg": "^8.9.0", "raw-body": "^2.4.1", "request": "^2.88.2", "selfsigned": "^2.0.0", @@ -110,6 +111,7 @@ "@types/mock-fs": "^4.13.0", "@types/morgan": "^1.9.0", "@types/node-forge": "^1.3.0", + "@types/pg": "^8.6.6", "@types/recursive-readdir": "^2.2.0", "@types/stoppable": "^1.1.0", "@types/supertest": "^2.0.8", diff --git a/packages/backend-common/src/database/connectors/postgres.ts b/packages/backend-common/src/database/connectors/postgres.ts index afa0d1f732..7dab81dcbb 100644 --- a/packages/backend-common/src/database/connectors/postgres.ts +++ b/packages/backend-common/src/database/connectors/postgres.ts @@ -22,6 +22,7 @@ import { mergeDatabaseConfig } from '../config'; import { DatabaseConnector } from '../types'; import defaultNameOverride from './defaultNameOverride'; import defaultSchemaOverride from './defaultSchemaOverride'; +import { Client } from 'pg'; /** * Creates a knex postgres database connection @@ -41,7 +42,7 @@ export function createPgDatabaseClient( if (role) { database.client.pool.on( 'createSuccess', - (_event: number, pgClient: Knex.Client) => { + (_event: number, pgClient: Client) => { pgClient.query(`SET ROLE ${role}`, (err: Error, _res: any) => { if (err) throw err; }); diff --git a/yarn.lock b/yarn.lock index 7d00ad8f19..e8567c9620 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3453,6 +3453,7 @@ __metadata: "@types/mock-fs": ^4.13.0 "@types/morgan": ^1.9.0 "@types/node-forge": ^1.3.0 + "@types/pg": ^8.6.6 "@types/recursive-readdir": ^2.2.0 "@types/stoppable": ^1.1.0 "@types/supertest": ^2.0.8 @@ -3489,6 +3490,7 @@ __metadata: mysql2: ^2.2.5 node-fetch: ^2.6.7 node-forge: ^1.3.1 + pg: ^8.9.0 raw-body: ^2.4.1 recursive-readdir: ^2.2.2 request: ^2.88.2 @@ -15117,6 +15119,17 @@ __metadata: languageName: node linkType: hard +"@types/pg@npm:^8.6.6": + version: 8.6.6 + resolution: "@types/pg@npm:8.6.6" + dependencies: + "@types/node": "*" + pg-protocol: "*" + pg-types: ^2.2.0 + checksum: ac145553a8ad2f357feacad1bceaf5d6ce904eb9d66233b84c469a2b4fa3738d4ebdf29b7ea45387be2d07f915fd873a229f90a2f766d7c377afa7c41fbcf8d1 + languageName: node + linkType: hard + "@types/pluralize@npm:^0.0.29": version: 0.0.29 resolution: "@types/pluralize@npm:0.0.29" @@ -31569,14 +31582,14 @@ __metadata: languageName: node linkType: hard -"pg-protocol@npm:^1.5.0": - version: 1.5.0 - resolution: "pg-protocol@npm:1.5.0" - checksum: b839d12cafe942ef9cbc5b13c174eb2356804fb4fe8ead8279f46a36be90722d19a91409955beb8a3d5301639c44854e49749de4aef02dc361fee3e2a61fb1e4 +"pg-protocol@npm:*, pg-protocol@npm:^1.6.0": + version: 1.6.0 + resolution: "pg-protocol@npm:1.6.0" + checksum: e12662d2de2011e0c3a03f6a09f435beb1025acdc860f181f18a600a5495dc38a69d753bbde1ace279c8c442536af9c1a7c11e1d0fe3fad3aa1348b28d9d2683 languageName: node linkType: hard -"pg-types@npm:^2.1.0": +"pg-types@npm:^2.1.0, pg-types@npm:^2.2.0": version: 2.2.0 resolution: "pg-types@npm:2.2.0" dependencies: @@ -31589,15 +31602,15 @@ __metadata: languageName: node linkType: hard -"pg@npm:^8.3.0, pg@npm:^8.4.0": - version: 8.8.0 - resolution: "pg@npm:8.8.0" +"pg@npm:^8.3.0, pg@npm:^8.4.0, pg@npm:^8.9.0": + version: 8.9.0 + resolution: "pg@npm:8.9.0" dependencies: buffer-writer: 2.0.0 packet-reader: 1.0.0 pg-connection-string: ^2.5.0 pg-pool: ^3.5.2 - pg-protocol: ^1.5.0 + pg-protocol: ^1.6.0 pg-types: ^2.1.0 pgpass: 1.x peerDependencies: @@ -31605,7 +31618,7 @@ __metadata: peerDependenciesMeta: pg-native: optional: true - checksum: fa30a85814dd7238b582c3bc6c0b9e2b0ae38dd0a6bb485ef480e64bb5ce589de6cb873ce4d3cd10c37a3e0a1e1281ba75dc7d80b1a68bae91999cd5b70d398b + checksum: dfd158955318f9ffb9428eaada29f3ee98b9eb07e87ed4b56589a19984d109f23bb8f88db78b7d7f870553e5b75ca0d58d0ed55755a8c6aed5df44e038c1d529 languageName: node linkType: hard From 4698b8eaf79277b7f1f69400894d33e7b85e1818 Mon Sep 17 00:00:00 2001 From: Joep Peeters Date: Mon, 6 Mar 2023 14:04:04 +0100 Subject: [PATCH 13/16] remove callback Signed-off-by: Joep Peeters --- packages/backend-common/src/database/connectors/postgres.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/backend-common/src/database/connectors/postgres.ts b/packages/backend-common/src/database/connectors/postgres.ts index 7dab81dcbb..afc8c207be 100644 --- a/packages/backend-common/src/database/connectors/postgres.ts +++ b/packages/backend-common/src/database/connectors/postgres.ts @@ -42,10 +42,8 @@ export function createPgDatabaseClient( if (role) { database.client.pool.on( 'createSuccess', - (_event: number, pgClient: Client) => { - pgClient.query(`SET ROLE ${role}`, (err: Error, _res: any) => { - if (err) throw err; - }); + async (_event: number, pgClient: Client) => { + await pgClient.query(`SET ROLE ${role}`); }, ); } From c93425b635f25ea14ed01f7df9050a3d8fb34ba6 Mon Sep 17 00:00:00 2001 From: Joep Peeters Date: Mon, 6 Mar 2023 14:13:15 +0100 Subject: [PATCH 14/16] add example config to changelog Signed-off-by: Joep Peeters --- .changeset/mean-toys-itch.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/.changeset/mean-toys-itch.md b/.changeset/mean-toys-itch.md index 19f8c861df..f456b048fa 100644 --- a/.changeset/mean-toys-itch.md +++ b/.changeset/mean-toys-itch.md @@ -2,4 +2,20 @@ '@backstage/backend-common': patch --- -Adds config option to set ownership for newly created schemas and tables in Postgres +Adds config option `backend.database.role` to set ownership for newly created schemas and tables in Postgres + +### example config + +The example config below connects to the database as user `v-backstage-123` but sets the ownership of +the create schema's and tables to `backstage` + +```yaml +backend: + database: + client: pg + pluginDivisionMode: schema + role: backstage + connection: + user: v-backstage-123 + ... +``` From 6d4b1740476d6cb3e282820d067cbce9af688491 Mon Sep 17 00:00:00 2001 From: Joep Peeters Date: Mon, 6 Mar 2023 14:17:42 +0100 Subject: [PATCH 15/16] spelling Signed-off-by: Joep Peeters --- .changeset/mean-toys-itch.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/mean-toys-itch.md b/.changeset/mean-toys-itch.md index f456b048fa..c80d99f44d 100644 --- a/.changeset/mean-toys-itch.md +++ b/.changeset/mean-toys-itch.md @@ -7,7 +7,7 @@ Adds config option `backend.database.role` to set ownership for newly created sc ### example config The example config below connects to the database as user `v-backstage-123` but sets the ownership of -the create schema's and tables to `backstage` +the create schemas and tables to `backstage` ```yaml backend: From d700b9c341cb31c03d3a8a503ac8081c934e07bf Mon Sep 17 00:00:00 2001 From: blam Date: Mon, 6 Mar 2023 21:32:53 +0100 Subject: [PATCH 16/16] chore: amtch the version types with the rest of the packages Signed-off-by: blam --- .changeset/mean-toys-itch.md | 2 -- packages/backend-common/package.json | 2 +- yarn.lock | 4 ++-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.changeset/mean-toys-itch.md b/.changeset/mean-toys-itch.md index c80d99f44d..75252b3482 100644 --- a/.changeset/mean-toys-itch.md +++ b/.changeset/mean-toys-itch.md @@ -4,8 +4,6 @@ Adds config option `backend.database.role` to set ownership for newly created schemas and tables in Postgres -### example config - The example config below connects to the database as user `v-backstage-123` but sets the ownership of the create schemas and tables to `backstage` diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index 2378a24383..778994ee80 100644 --- a/packages/backend-common/package.json +++ b/packages/backend-common/package.json @@ -78,7 +78,7 @@ "morgan": "^1.10.0", "node-fetch": "^2.6.7", "node-forge": "^1.3.1", - "pg": "^8.9.0", + "pg": "^8.3.0", "raw-body": "^2.4.1", "request": "^2.88.2", "selfsigned": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index e8567c9620..f2a4af718f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3490,7 +3490,7 @@ __metadata: mysql2: ^2.2.5 node-fetch: ^2.6.7 node-forge: ^1.3.1 - pg: ^8.9.0 + pg: ^8.3.0 raw-body: ^2.4.1 recursive-readdir: ^2.2.2 request: ^2.88.2 @@ -31602,7 +31602,7 @@ __metadata: languageName: node linkType: hard -"pg@npm:^8.3.0, pg@npm:^8.4.0, pg@npm:^8.9.0": +"pg@npm:^8.3.0, pg@npm:^8.4.0": version: 8.9.0 resolution: "pg@npm:8.9.0" dependencies: