From aed61209faeac0809c520a5c4bf02be30520a505 Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Tue, 8 Oct 2024 12:17:44 +0000 Subject: [PATCH] feat(app-config): update canConnect upon dependent changes --- .../__snapshots__/app-config.test.js.snap | 5 ++- .../backend/src/models/app-auth-client.js | 6 +-- packages/backend/src/models/app-config.js | 35 +++++++++++++---- .../backend/src/models/app-config.test.js | 38 ++++++++++++++++--- 4 files changed, 68 insertions(+), 16 deletions(-) diff --git a/packages/backend/src/models/__snapshots__/app-config.test.js.snap b/packages/backend/src/models/__snapshots__/app-config.test.js.snap index ee1e862c..d92ce25f 100644 --- a/packages/backend/src/models/__snapshots__/app-config.test.js.snap +++ b/packages/backend/src/models/__snapshots__/app-config.test.js.snap @@ -7,6 +7,10 @@ exports[`AppConfig model > jsonSchema should have correct validations 1`] = ` "default": false, "type": "boolean", }, + "canConnect": { + "default": false, + "type": "boolean", + }, "createdAt": { "type": "string", }, @@ -38,7 +42,6 @@ exports[`AppConfig model > jsonSchema should have correct validations 1`] = ` exports[`AppConfig model > virtualAttributes should return correct properties 1`] = ` [ - "canConnect", "canCustomConnect", ] `; diff --git a/packages/backend/src/models/app-auth-client.js b/packages/backend/src/models/app-auth-client.js index ab209713..72882685 100644 --- a/packages/backend/src/models/app-auth-client.js +++ b/packages/backend/src/models/app-auth-client.js @@ -63,7 +63,7 @@ class AppAuthClient extends Base { async triggerAppConfigUpdate() { const appConfig = await this.$relatedQuery('appConfig').select('*'); - await appConfig.$query().patch({}); + await appConfig?.updateCanConnectProperty(); } // TODO: Make another abstraction like beforeSave instead of using @@ -84,8 +84,8 @@ class AppAuthClient extends Base { this.encryptData(); } - async $afterUpdate(queryContext) { - await super.$afterUpdate(queryContext); + async $afterUpdate(opt, queryContext) { + await super.$afterUpdate(opt, queryContext); await this.triggerAppConfigUpdate(); } diff --git a/packages/backend/src/models/app-config.js b/packages/backend/src/models/app-config.js index e72ef1e3..e36cd437 100644 --- a/packages/backend/src/models/app-config.js +++ b/packages/backend/src/models/app-config.js @@ -46,25 +46,46 @@ class AppConfig extends Base { return await App.findOneByKey(this.key); } - async updateCanConnectValue() { - const appAuthClients = await this.$relatedQuery('appAuthClients'); + async computeCanConnectProperty(oldAppConfig) { + const appAuthClients = await oldAppConfig.$relatedQuery('appAuthClients'); const hasSomeActiveAppAuthClients = !!appAuthClients?.some( (appAuthClient) => appAuthClient.active ); - const shared = this.shared; - const active = this.disabled === false; + const shared = this.shared ?? oldAppConfig.shared; + const disabled = this.disabled ?? oldAppConfig.disabled; + const active = disabled === false; const conditions = [hasSomeActiveAppAuthClients, shared, active]; - this.canConnect = conditions.every(Boolean); + const canConnect = conditions.every(Boolean); - return this; + return canConnect; + } + + async updateCanConnectProperty() { + const canConnect = await this.computeCanConnectProperty(this); + + return await this.$query().patch({ + canConnect, + }); + } + + async computeAndAssignCanConnectProperty(oldAppConfig) { + this.canConnect = await this.computeCanConnectProperty(oldAppConfig); + } + + async $beforeInsert(queryContext) { + await super.$beforeInsert(queryContext); + + await this.computeAndAssignCanConnectProperty(this); } async $beforeUpdate(opt, queryContext) { await super.$beforeUpdate(opt, queryContext); - await opt.old.updateCanConnectValue(); + const oldAppConfig = opt.old; + + await this.computeAndAssignCanConnectProperty(oldAppConfig); } } diff --git a/packages/backend/src/models/app-config.test.js b/packages/backend/src/models/app-config.test.js index 1c9f7651..11a37acd 100644 --- a/packages/backend/src/models/app-config.test.js +++ b/packages/backend/src/models/app-config.test.js @@ -66,24 +66,52 @@ describe('AppConfig model', () => { }); describe('canConnect', () => { - it('should return true when app is enabled, shared and allows custom connection', async () => { + it('should return true when app is enabled, shared and allows custom connection with an active app auth client at least', async () => { await createAppAuthClient({ appKey: 'deepl', active: true, }); - let appConfig = await createAppConfig({ + await createAppAuthClient({ + appKey: 'deepl', + active: false, + }); + + const appConfig = await createAppConfig({ disabled: false, allowCustomConnection: true, shared: true, key: 'deepl', }); - appConfig = await appConfig.$query().withGraphFetched({ - appAuthClients: true, + expect(appConfig.canConnect).toBe(true); + }); + + it('should return true when app is enabled, shared and allows custom connection with no active app auth client', async () => { + await createAppAuthClient({ + appKey: 'deepl', + active: false, }); - expect(appConfig.canConnect).toBe(true); + const appConfig = await createAppConfig({ + disabled: false, + allowCustomConnection: true, + shared: true, + key: 'deepl', + }); + + expect(appConfig.canConnect).toBe(false); + }); + + it('should return false when app is enabled, shared and allows custom connection without any app auth clients', async () => { + const appConfig = await createAppConfig({ + disabled: false, + allowCustomConnection: true, + shared: true, + key: 'deepl', + }); + + expect(appConfig.canConnect).toBe(false); }); it('should return false when app is disabled', async () => {