From 8c4b67e147117eafd46097fb4ea976aa270887d0 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Wed, 18 Dec 2024 17:42:04 +0100 Subject: [PATCH 1/3] refactor: Rename AppAuthClient model as OAuthClient --- ...client.ee.js => create-oauth-client.ee.js} | 10 +- ...test.js => create-oauth-client.ee.test.js} | 24 +-- .../api/v1/admin/apps/get-auth-client.ee.js | 11 - .../api/v1/admin/apps/get-oauth-client.ee.js | 11 + ...ee.test.js => get-oauth-client.ee.test.js} | 24 +-- ...-clients.ee.js => get-oauth-clients.ee.js} | 6 +- ...e.test.js => get-oauth-clients.ee.test.js} | 20 +- .../v1/admin/apps/update-auth-client.ee.js | 22 -- .../v1/admin/apps/update-oauth-client.ee.js | 22 ++ ...test.js => update-oauth-client.ee.test.js} | 38 ++-- .../api/v1/apps/create-connection.js | 6 +- .../api/v1/apps/create-connection.test.js | 14 +- .../api/v1/apps/get-action-substeps.test.js | 2 +- .../api/v1/apps/get-auth-client.ee.js | 11 - .../controllers/api/v1/apps/get-config.ee.js | 2 +- .../api/v1/apps/get-connections.js | 2 +- .../api/v1/apps/get-oauth-client.ee.js | 11 + ...ee.test.js => get-oauth-client.ee.test.js} | 24 +-- ...-clients.ee.js => get-oauth-clients.ee.js} | 6 +- ...e.test.js => get-oauth-clients.ee.test.js} | 20 +- .../api/v1/apps/get-trigger-substeps.test.js | 2 +- .../api/v1/connections/update-connection.js | 4 +- ...hange_app_auth_clients_as_oauth_clients.js | 31 +++ .../src/helpers/add-authentication-steps.js | 4 +- .../__snapshots__/connection.test.js.snap | 8 +- ...test.js.snap => oauth-client.test.js.snap} | 2 +- .../src/models/app-auth-client.test.js | 202 ------------------ packages/backend/src/models/app-config.js | 8 +- .../backend/src/models/app-config.test.js | 8 +- packages/backend/src/models/connection.js | 26 +-- .../backend/src/models/connection.test.js | 26 +-- .../{app-auth-client.js => oauth-client.js} | 8 +- .../backend/src/models/oauth-client.test.js | 192 +++++++++++++++++ .../src/routes/api/v1/admin/apps.ee.js | 24 +-- packages/backend/src/routes/api/v1/apps.js | 12 +- .../src/serializers/app-auth-client.js | 10 - .../src/serializers/app-auth-client.test.js | 24 --- .../backend/src/serializers/connection.js | 2 +- .../src/serializers/connection.test.js | 2 +- packages/backend/src/serializers/index.js | 4 +- .../backend/src/serializers/oauth-client.js | 10 + .../src/serializers/oauth-client.test.js | 22 ++ .../{app-auth-client.js => oauth-client.js} | 8 +- .../api/v1/admin/apps/create-auth-client.js | 17 -- .../api/v1/admin/apps/create-oauth-client.js | 17 ++ .../rest/api/v1/admin/apps/get-auth-client.js | 18 -- .../api/v1/admin/apps/get-auth-clients.js | 18 -- .../api/v1/admin/apps/get-oauth-client.js | 18 ++ .../api/v1/admin/apps/get-oauth-clients.js | 18 ++ .../api/v1/admin/apps/update-auth-client.js | 18 -- .../api/v1/admin/apps/update-oauth-client.js | 18 ++ .../rest/api/v1/apps/create-connection.js | 2 +- .../mocks/rest/api/v1/apps/get-auth-client.js | 18 -- .../rest/api/v1/apps/get-auth-clients.js | 18 -- .../mocks/rest/api/v1/apps/get-connections.js | 2 +- .../rest/api/v1/apps/get-oauth-client.js | 18 ++ .../rest/api/v1/apps/get-oauth-clients.js | 18 ++ .../api/v1/connections/reset-connection.js | 2 +- .../api/v1/connections/update-connection.js | 2 +- .../mocks/rest/api/v1/steps/get-connection.js | 2 +- .../tests/admin/applications.spec.js | 10 +- 61 files changed, 588 insertions(+), 571 deletions(-) rename packages/backend/src/controllers/api/v1/admin/apps/{create-auth-client.ee.js => create-oauth-client.ee.js} (66%) rename packages/backend/src/controllers/api/v1/admin/apps/{create-auth-client.ee.test.js => create-oauth-client.ee.test.js} (81%) delete mode 100644 packages/backend/src/controllers/api/v1/admin/apps/get-auth-client.ee.js create mode 100644 packages/backend/src/controllers/api/v1/admin/apps/get-oauth-client.ee.js rename packages/backend/src/controllers/api/v1/admin/apps/{get-auth-client.ee.test.js => get-oauth-client.ee.test.js} (56%) rename packages/backend/src/controllers/api/v1/admin/apps/{get-auth-clients.ee.js => get-oauth-clients.ee.js} (54%) rename packages/backend/src/controllers/api/v1/admin/apps/{get-auth-clients.ee.test.js => get-oauth-clients.ee.test.js} (62%) delete mode 100644 packages/backend/src/controllers/api/v1/admin/apps/update-auth-client.ee.js create mode 100644 packages/backend/src/controllers/api/v1/admin/apps/update-oauth-client.ee.js rename packages/backend/src/controllers/api/v1/admin/apps/{update-auth-client.ee.test.js => update-oauth-client.ee.test.js} (65%) delete mode 100644 packages/backend/src/controllers/api/v1/apps/get-auth-client.ee.js create mode 100644 packages/backend/src/controllers/api/v1/apps/get-oauth-client.ee.js rename packages/backend/src/controllers/api/v1/apps/{get-auth-client.ee.test.js => get-oauth-client.ee.test.js} (54%) rename packages/backend/src/controllers/api/v1/apps/{get-auth-clients.ee.js => get-oauth-clients.ee.js} (56%) rename packages/backend/src/controllers/api/v1/apps/{get-auth-clients.ee.test.js => get-oauth-clients.ee.test.js} (59%) create mode 100644 packages/backend/src/db/migrations/20241217170447_change_app_auth_clients_as_oauth_clients.js rename packages/backend/src/models/__snapshots__/{app-auth-client.test.js.snap => oauth-client.test.js.snap} (87%) delete mode 100644 packages/backend/src/models/app-auth-client.test.js rename packages/backend/src/models/{app-auth-client.js => oauth-client.js} (93%) create mode 100644 packages/backend/src/models/oauth-client.test.js delete mode 100644 packages/backend/src/serializers/app-auth-client.js delete mode 100644 packages/backend/src/serializers/app-auth-client.test.js create mode 100644 packages/backend/src/serializers/oauth-client.js create mode 100644 packages/backend/src/serializers/oauth-client.test.js rename packages/backend/test/factories/{app-auth-client.js => oauth-client.js} (67%) delete mode 100644 packages/backend/test/mocks/rest/api/v1/admin/apps/create-auth-client.js create mode 100644 packages/backend/test/mocks/rest/api/v1/admin/apps/create-oauth-client.js delete mode 100644 packages/backend/test/mocks/rest/api/v1/admin/apps/get-auth-client.js delete mode 100644 packages/backend/test/mocks/rest/api/v1/admin/apps/get-auth-clients.js create mode 100644 packages/backend/test/mocks/rest/api/v1/admin/apps/get-oauth-client.js create mode 100644 packages/backend/test/mocks/rest/api/v1/admin/apps/get-oauth-clients.js delete mode 100644 packages/backend/test/mocks/rest/api/v1/admin/apps/update-auth-client.js create mode 100644 packages/backend/test/mocks/rest/api/v1/admin/apps/update-oauth-client.js delete mode 100644 packages/backend/test/mocks/rest/api/v1/apps/get-auth-client.js delete mode 100644 packages/backend/test/mocks/rest/api/v1/apps/get-auth-clients.js create mode 100644 packages/backend/test/mocks/rest/api/v1/apps/get-oauth-client.js create mode 100644 packages/backend/test/mocks/rest/api/v1/apps/get-oauth-clients.js diff --git a/packages/backend/src/controllers/api/v1/admin/apps/create-auth-client.ee.js b/packages/backend/src/controllers/api/v1/admin/apps/create-oauth-client.ee.js similarity index 66% rename from packages/backend/src/controllers/api/v1/admin/apps/create-auth-client.ee.js rename to packages/backend/src/controllers/api/v1/admin/apps/create-oauth-client.ee.js index 49cbfff2..ffba9257 100644 --- a/packages/backend/src/controllers/api/v1/admin/apps/create-auth-client.ee.js +++ b/packages/backend/src/controllers/api/v1/admin/apps/create-oauth-client.ee.js @@ -6,14 +6,14 @@ export default async (request, response) => { .findOne({ key: request.params.appKey }) .throwIfNotFound(); - const appAuthClient = await appConfig - .$relatedQuery('appAuthClients') - .insert(appAuthClientParams(request)); + const oauthClient = await appConfig + .$relatedQuery('oauthClients') + .insert(oauthClientParams(request)); - renderObject(response, appAuthClient, { status: 201 }); + renderObject(response, oauthClient, { status: 201 }); }; -const appAuthClientParams = (request) => { +const oauthClientParams = (request) => { const { active, appKey, name, formattedAuthDefaults } = request.body; return { diff --git a/packages/backend/src/controllers/api/v1/admin/apps/create-auth-client.ee.test.js b/packages/backend/src/controllers/api/v1/admin/apps/create-oauth-client.ee.test.js similarity index 81% rename from packages/backend/src/controllers/api/v1/admin/apps/create-auth-client.ee.test.js rename to packages/backend/src/controllers/api/v1/admin/apps/create-oauth-client.ee.test.js index ea658f88..4746a881 100644 --- a/packages/backend/src/controllers/api/v1/admin/apps/create-auth-client.ee.test.js +++ b/packages/backend/src/controllers/api/v1/admin/apps/create-oauth-client.ee.test.js @@ -5,11 +5,11 @@ import app from '../../../../../app.js'; import createAuthTokenByUserId from '../../../../../helpers/create-auth-token-by-user-id.js'; import { createUser } from '../../../../../../test/factories/user.js'; import { createRole } from '../../../../../../test/factories/role.js'; -import createAppAuthClientMock from '../../../../../../test/mocks/rest/api/v1/admin/apps/create-auth-client.js'; +import createOAuthClientMock from '../../../../../../test/mocks/rest/api/v1/admin/apps/create-oauth-client.js'; import { createAppConfig } from '../../../../../../test/factories/app-config.js'; import * as license from '../../../../../helpers/license.ee.js'; -describe('POST /api/v1/admin/apps/:appKey/auth-clients', () => { +describe('POST /api/v1/admin/apps/:appKey/oauth-clients', () => { let currentUser, adminRole, token; beforeEach(async () => { @@ -26,7 +26,7 @@ describe('POST /api/v1/admin/apps/:appKey/auth-clients', () => { key: 'gitlab', }); - const appAuthClient = { + const oauthClient = { active: true, appKey: 'gitlab', name: 'First auth client', @@ -39,17 +39,17 @@ describe('POST /api/v1/admin/apps/:appKey/auth-clients', () => { }; const response = await request(app) - .post('/api/v1/admin/apps/gitlab/auth-clients') + .post('/api/v1/admin/apps/gitlab/oauth-clients') .set('Authorization', token) - .send(appAuthClient) + .send(oauthClient) .expect(201); - const expectedPayload = createAppAuthClientMock(appAuthClient); + const expectedPayload = createOAuthClientMock(oauthClient); expect(response.body).toMatchObject(expectedPayload); }); it('should return not found response for not existing app config', async () => { - const appAuthClient = { + const oauthClient = { active: true, appKey: 'gitlab', name: 'First auth client', @@ -62,9 +62,9 @@ describe('POST /api/v1/admin/apps/:appKey/auth-clients', () => { }; await request(app) - .post('/api/v1/admin/apps/gitlab/auth-clients') + .post('/api/v1/admin/apps/gitlab/oauth-clients') .set('Authorization', token) - .send(appAuthClient) + .send(oauthClient) .expect(404); }); @@ -73,14 +73,14 @@ describe('POST /api/v1/admin/apps/:appKey/auth-clients', () => { key: 'gitlab', }); - const appAuthClient = { + const oauthClient = { appKey: 'gitlab', }; const response = await request(app) - .post('/api/v1/admin/apps/gitlab/auth-clients') + .post('/api/v1/admin/apps/gitlab/oauth-clients') .set('Authorization', token) - .send(appAuthClient) + .send(oauthClient) .expect(422); expect(response.body.meta.type).toStrictEqual('ModelValidation'); diff --git a/packages/backend/src/controllers/api/v1/admin/apps/get-auth-client.ee.js b/packages/backend/src/controllers/api/v1/admin/apps/get-auth-client.ee.js deleted file mode 100644 index c43ac23e..00000000 --- a/packages/backend/src/controllers/api/v1/admin/apps/get-auth-client.ee.js +++ /dev/null @@ -1,11 +0,0 @@ -import { renderObject } from '../../../../../helpers/renderer.js'; -import AppAuthClient from '../../../../../models/app-auth-client.js'; - -export default async (request, response) => { - const appAuthClient = await AppAuthClient.query() - .findById(request.params.appAuthClientId) - .where({ app_key: request.params.appKey }) - .throwIfNotFound(); - - renderObject(response, appAuthClient); -}; diff --git a/packages/backend/src/controllers/api/v1/admin/apps/get-oauth-client.ee.js b/packages/backend/src/controllers/api/v1/admin/apps/get-oauth-client.ee.js new file mode 100644 index 00000000..577461f2 --- /dev/null +++ b/packages/backend/src/controllers/api/v1/admin/apps/get-oauth-client.ee.js @@ -0,0 +1,11 @@ +import { renderObject } from '../../../../../helpers/renderer.js'; +import OAuthClient from '../../../../../models/oauth-client.js'; + +export default async (request, response) => { + const oauthClient = await OAuthClient.query() + .findById(request.params.oauthClientId) + .where({ app_key: request.params.appKey }) + .throwIfNotFound(); + + renderObject(response, oauthClient); +}; diff --git a/packages/backend/src/controllers/api/v1/admin/apps/get-auth-client.ee.test.js b/packages/backend/src/controllers/api/v1/admin/apps/get-oauth-client.ee.test.js similarity index 56% rename from packages/backend/src/controllers/api/v1/admin/apps/get-auth-client.ee.test.js rename to packages/backend/src/controllers/api/v1/admin/apps/get-oauth-client.ee.test.js index 2edb0ffe..5b30c289 100644 --- a/packages/backend/src/controllers/api/v1/admin/apps/get-auth-client.ee.test.js +++ b/packages/backend/src/controllers/api/v1/admin/apps/get-oauth-client.ee.test.js @@ -5,12 +5,12 @@ import app from '../../../../../app.js'; import createAuthTokenByUserId from '../../../../../helpers/create-auth-token-by-user-id.js'; import { createUser } from '../../../../../../test/factories/user.js'; import { createRole } from '../../../../../../test/factories/role.js'; -import getAppAuthClientMock from '../../../../../../test/mocks/rest/api/v1/admin/apps/get-auth-client.js'; -import { createAppAuthClient } from '../../../../../../test/factories/app-auth-client.js'; +import getOAuthClientMock from '../../../../../../test/mocks/rest/api/v1/admin/apps/get-oauth-client.js'; +import { createOAuthClient } from '../../../../../../test/factories/oauth-client.js'; import * as license from '../../../../../helpers/license.ee.js'; -describe('GET /api/v1/admin/apps/:appKey/auth-clients/:appAuthClientId', () => { - let currentUser, adminRole, currentAppAuthClient, token; +describe('GET /api/v1/admin/apps/:appKey/oauth-clients/:oauthClientId', () => { + let currentUser, adminRole, currentOAuthClient, token; beforeEach(async () => { vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true); @@ -18,29 +18,29 @@ describe('GET /api/v1/admin/apps/:appKey/auth-clients/:appAuthClientId', () => { adminRole = await createRole({ name: 'Admin' }); currentUser = await createUser({ roleId: adminRole.id }); - currentAppAuthClient = await createAppAuthClient({ + currentOAuthClient = await createOAuthClient({ appKey: 'deepl', }); token = await createAuthTokenByUserId(currentUser.id); }); - it('should return specified app auth client', async () => { + it('should return specified oauth client', async () => { const response = await request(app) - .get(`/api/v1/admin/apps/deepl/auth-clients/${currentAppAuthClient.id}`) + .get(`/api/v1/admin/apps/deepl/oauth-clients/${currentOAuthClient.id}`) .set('Authorization', token) .expect(200); - const expectedPayload = getAppAuthClientMock(currentAppAuthClient); + const expectedPayload = getOAuthClientMock(currentOAuthClient); expect(response.body).toStrictEqual(expectedPayload); }); - it('should return not found response for not existing app auth client ID', async () => { - const notExistingAppAuthClientUUID = Crypto.randomUUID(); + it('should return not found response for not existing oauth client ID', async () => { + const notExistingOAuthClientUUID = Crypto.randomUUID(); await request(app) .get( - `/api/v1/admin/apps/deepl/auth-clients/${notExistingAppAuthClientUUID}` + `/api/v1/admin/apps/deepl/oauth-clients/${notExistingOAuthClientUUID}` ) .set('Authorization', token) .expect(404); @@ -48,7 +48,7 @@ describe('GET /api/v1/admin/apps/:appKey/auth-clients/:appAuthClientId', () => { it('should return bad request response for invalid UUID', async () => { await request(app) - .get('/api/v1/admin/apps/deepl/auth-clients/invalidAppAuthClientUUID') + .get('/api/v1/admin/apps/deepl/oauth-clients/invalidOAuthClientUUID') .set('Authorization', token) .expect(400); }); diff --git a/packages/backend/src/controllers/api/v1/admin/apps/get-auth-clients.ee.js b/packages/backend/src/controllers/api/v1/admin/apps/get-oauth-clients.ee.js similarity index 54% rename from packages/backend/src/controllers/api/v1/admin/apps/get-auth-clients.ee.js rename to packages/backend/src/controllers/api/v1/admin/apps/get-oauth-clients.ee.js index 257e0dd7..230104a4 100644 --- a/packages/backend/src/controllers/api/v1/admin/apps/get-auth-clients.ee.js +++ b/packages/backend/src/controllers/api/v1/admin/apps/get-oauth-clients.ee.js @@ -1,10 +1,10 @@ import { renderObject } from '../../../../../helpers/renderer.js'; -import AppAuthClient from '../../../../../models/app-auth-client.js'; +import OAuthClient from '../../../../../models/oauth-client.js'; export default async (request, response) => { - const appAuthClients = await AppAuthClient.query() + const oauthClients = await OAuthClient.query() .where({ app_key: request.params.appKey }) .orderBy('created_at', 'desc'); - renderObject(response, appAuthClients); + renderObject(response, oauthClients); }; diff --git a/packages/backend/src/controllers/api/v1/admin/apps/get-auth-clients.ee.test.js b/packages/backend/src/controllers/api/v1/admin/apps/get-oauth-clients.ee.test.js similarity index 62% rename from packages/backend/src/controllers/api/v1/admin/apps/get-auth-clients.ee.test.js rename to packages/backend/src/controllers/api/v1/admin/apps/get-oauth-clients.ee.test.js index 7fbba6e0..69be2bbf 100644 --- a/packages/backend/src/controllers/api/v1/admin/apps/get-auth-clients.ee.test.js +++ b/packages/backend/src/controllers/api/v1/admin/apps/get-oauth-clients.ee.test.js @@ -4,11 +4,11 @@ import app from '../../../../../app.js'; import createAuthTokenByUserId from '../../../../../helpers/create-auth-token-by-user-id.js'; import { createUser } from '../../../../../../test/factories/user.js'; import { createRole } from '../../../../../../test/factories/role.js'; -import getAuthClientsMock from '../../../../../../test/mocks/rest/api/v1/admin/apps/get-auth-clients.js'; -import { createAppAuthClient } from '../../../../../../test/factories/app-auth-client.js'; +import getAdminOAuthClientsMock from '../../../../../../test/mocks/rest/api/v1/admin/apps/get-oauth-clients.js'; +import { createOAuthClient } from '../../../../../../test/factories/oauth-client.js'; import * as license from '../../../../../helpers/license.ee.js'; -describe('GET /api/v1/admin/apps/:appKey/auth-clients', () => { +describe('GET /api/v1/admin/apps/:appKey/oauth-clients', () => { let currentUser, adminRole, token; beforeEach(async () => { @@ -20,23 +20,23 @@ describe('GET /api/v1/admin/apps/:appKey/auth-clients', () => { token = await createAuthTokenByUserId(currentUser.id); }); - it('should return specified app auth client info', async () => { - const appAuthClientOne = await createAppAuthClient({ + it('should return specified oauth client info', async () => { + const oauthClientOne = await createOAuthClient({ appKey: 'deepl', }); - const appAuthClientTwo = await createAppAuthClient({ + const oauthClientTwo = await createOAuthClient({ appKey: 'deepl', }); const response = await request(app) - .get('/api/v1/admin/apps/deepl/auth-clients') + .get('/api/v1/admin/apps/deepl/oauth-clients') .set('Authorization', token) .expect(200); - const expectedPayload = getAuthClientsMock([ - appAuthClientTwo, - appAuthClientOne, + const expectedPayload = getAdminOAuthClientsMock([ + oauthClientTwo, + oauthClientOne, ]); expect(response.body).toStrictEqual(expectedPayload); diff --git a/packages/backend/src/controllers/api/v1/admin/apps/update-auth-client.ee.js b/packages/backend/src/controllers/api/v1/admin/apps/update-auth-client.ee.js deleted file mode 100644 index a34e9a67..00000000 --- a/packages/backend/src/controllers/api/v1/admin/apps/update-auth-client.ee.js +++ /dev/null @@ -1,22 +0,0 @@ -import { renderObject } from '../../../../../helpers/renderer.js'; -import AppAuthClient from '../../../../../models/app-auth-client.js'; - -export default async (request, response) => { - const appAuthClient = await AppAuthClient.query() - .findById(request.params.appAuthClientId) - .throwIfNotFound(); - - await appAuthClient.$query().patchAndFetch(appAuthClientParams(request)); - - renderObject(response, appAuthClient); -}; - -const appAuthClientParams = (request) => { - const { active, name, formattedAuthDefaults } = request.body; - - return { - active, - name, - formattedAuthDefaults, - }; -}; diff --git a/packages/backend/src/controllers/api/v1/admin/apps/update-oauth-client.ee.js b/packages/backend/src/controllers/api/v1/admin/apps/update-oauth-client.ee.js new file mode 100644 index 00000000..7e9c3f7a --- /dev/null +++ b/packages/backend/src/controllers/api/v1/admin/apps/update-oauth-client.ee.js @@ -0,0 +1,22 @@ +import { renderObject } from '../../../../../helpers/renderer.js'; +import OAuthClient from '../../../../../models/oauth-client.js'; + +export default async (request, response) => { + const oauthClient = await OAuthClient.query() + .findById(request.params.oauthClientId) + .throwIfNotFound(); + + await oauthClient.$query().patchAndFetch(oauthClientParams(request)); + + renderObject(response, oauthClient); +}; + +const oauthClientParams = (request) => { + const { active, name, formattedAuthDefaults } = request.body; + + return { + active, + name, + formattedAuthDefaults, + }; +}; diff --git a/packages/backend/src/controllers/api/v1/admin/apps/update-auth-client.ee.test.js b/packages/backend/src/controllers/api/v1/admin/apps/update-oauth-client.ee.test.js similarity index 65% rename from packages/backend/src/controllers/api/v1/admin/apps/update-auth-client.ee.test.js rename to packages/backend/src/controllers/api/v1/admin/apps/update-oauth-client.ee.test.js index f1a7bccd..9d28bb34 100644 --- a/packages/backend/src/controllers/api/v1/admin/apps/update-auth-client.ee.test.js +++ b/packages/backend/src/controllers/api/v1/admin/apps/update-oauth-client.ee.test.js @@ -6,12 +6,12 @@ import app from '../../../../../app.js'; import createAuthTokenByUserId from '../../../../../helpers/create-auth-token-by-user-id.js'; import { createUser } from '../../../../../../test/factories/user.js'; import { createRole } from '../../../../../../test/factories/role.js'; -import updateAppAuthClientMock from '../../../../../../test/mocks/rest/api/v1/admin/apps/update-auth-client.js'; +import updateOAuthClientMock from '../../../../../../test/mocks/rest/api/v1/admin/apps/update-oauth-client.js'; import { createAppConfig } from '../../../../../../test/factories/app-config.js'; -import { createAppAuthClient } from '../../../../../../test/factories/app-auth-client.js'; +import { createOAuthClient } from '../../../../../../test/factories/oauth-client.js'; import * as license from '../../../../../helpers/license.ee.js'; -describe('PATCH /api/v1/admin/apps/:appKey/auth-clients', () => { +describe('PATCH /api/v1/admin/apps/:appKey/oauth-clients', () => { let currentUser, adminRole, token; beforeEach(async () => { @@ -27,8 +27,8 @@ describe('PATCH /api/v1/admin/apps/:appKey/auth-clients', () => { }); }); - it('should return updated entity for valid app auth client', async () => { - const appAuthClient = { + it('should return updated entity for valid oauth client', async () => { + const oauthClient = { active: true, appKey: 'gitlab', formattedAuthDefaults: { @@ -39,33 +39,33 @@ describe('PATCH /api/v1/admin/apps/:appKey/auth-clients', () => { }, }; - const existingAppAuthClient = await createAppAuthClient({ + const existingOAuthClient = await createOAuthClient({ appKey: 'gitlab', name: 'First auth client', }); const response = await request(app) .patch( - `/api/v1/admin/apps/gitlab/auth-clients/${existingAppAuthClient.id}` + `/api/v1/admin/apps/gitlab/oauth-clients/${existingOAuthClient.id}` ) .set('Authorization', token) - .send(appAuthClient) + .send(oauthClient) .expect(200); - const expectedPayload = updateAppAuthClientMock({ - ...existingAppAuthClient, - ...appAuthClient, + const expectedPayload = updateOAuthClientMock({ + ...existingOAuthClient, + ...oauthClient, }); expect(response.body).toMatchObject(expectedPayload); }); - it('should return not found response for not existing app auth client', async () => { - const notExistingAppAuthClientId = Crypto.randomUUID(); + it('should return not found response for not existing oauth client', async () => { + const notExistingOAuthClientId = Crypto.randomUUID(); await request(app) .patch( - `/api/v1/admin/apps/gitlab/auth-clients/${notExistingAppAuthClientId}` + `/api/v1/admin/apps/gitlab/oauth-clients/${notExistingOAuthClientId}` ) .set('Authorization', token) .expect(404); @@ -73,27 +73,27 @@ describe('PATCH /api/v1/admin/apps/:appKey/auth-clients', () => { it('should return bad request response for invalid UUID', async () => { await request(app) - .patch('/api/v1/admin/apps/gitlab/auth-clients/invalidAuthClientUUID') + .patch('/api/v1/admin/apps/gitlab/oauth-clients/invalidAuthClientUUID') .set('Authorization', token) .expect(400); }); it('should return HTTP 422 for invalid payload', async () => { - const appAuthClient = { + const oauthClient = { formattedAuthDefaults: 'invalid input', }; - const existingAppAuthClient = await createAppAuthClient({ + const existingOAuthClient = await createOAuthClient({ appKey: 'gitlab', name: 'First auth client', }); const response = await request(app) .patch( - `/api/v1/admin/apps/gitlab/auth-clients/${existingAppAuthClient.id}` + `/api/v1/admin/apps/gitlab/oauth-clients/${existingOAuthClient.id}` ) .set('Authorization', token) - .send(appAuthClient) + .send(oauthClient) .expect(422); expect(response.body.meta.type).toBe('ModelValidation'); diff --git a/packages/backend/src/controllers/api/v1/apps/create-connection.js b/packages/backend/src/controllers/api/v1/apps/create-connection.js index 40a081b9..35e3a34b 100644 --- a/packages/backend/src/controllers/api/v1/apps/create-connection.js +++ b/packages/backend/src/controllers/api/v1/apps/create-connection.js @@ -9,18 +9,18 @@ export default async (request, response) => { .$query() .withGraphFetched({ appConfig: true, - appAuthClient: true, + oauthClient: true, }); renderObject(response, connectionWithAppConfigAndAuthClient, { status: 201 }); }; const connectionParams = (request) => { - const { appAuthClientId, formattedData } = request.body; + const { oauthClientId, formattedData } = request.body; return { key: request.params.appKey, - appAuthClientId, + oauthClientId, formattedData, verified: false, }; diff --git a/packages/backend/src/controllers/api/v1/apps/create-connection.test.js b/packages/backend/src/controllers/api/v1/apps/create-connection.test.js index c73df6b6..0465458f 100644 --- a/packages/backend/src/controllers/api/v1/apps/create-connection.test.js +++ b/packages/backend/src/controllers/api/v1/apps/create-connection.test.js @@ -3,7 +3,7 @@ import request from 'supertest'; import app from '../../../../app.js'; import createAuthTokenByUserId from '../../../../helpers/create-auth-token-by-user-id.js'; import { createAppConfig } from '../../../../../test/factories/app-config.js'; -import { createAppAuthClient } from '../../../../../test/factories/app-auth-client.js'; +import { createOAuthClient } from '../../../../../test/factories/oauth-client.js'; import { createUser } from '../../../../../test/factories/user.js'; import { createPermission } from '../../../../../test/factories/permission.js'; import { createRole } from '../../../../../test/factories/role.js'; @@ -267,7 +267,7 @@ describe('POST /api/v1/apps/:appKey/connections', () => { }); describe('with auth client enabled', async () => { - let appAuthClient; + let oauthClient; beforeEach(async () => { await createAppConfig({ @@ -276,7 +276,7 @@ describe('POST /api/v1/apps/:appKey/connections', () => { useOnlyPredefinedAuthClients: false, }); - appAuthClient = await createAppAuthClient({ + oauthClient = await createOAuthClient({ appKey: 'gitlab', active: true, formattedAuthDefaults: { @@ -290,7 +290,7 @@ describe('POST /api/v1/apps/:appKey/connections', () => { it('should return created connection', async () => { const connectionData = { - appAuthClientId: appAuthClient.id, + oauthClientId: oauthClient.id, }; const response = await request(app) @@ -338,7 +338,7 @@ describe('POST /api/v1/apps/:appKey/connections', () => { }); describe('with auth client disabled', async () => { - let appAuthClient; + let oauthClient; beforeEach(async () => { await createAppConfig({ @@ -347,7 +347,7 @@ describe('POST /api/v1/apps/:appKey/connections', () => { useOnlyPredefinedAuthClients: false, }); - appAuthClient = await createAppAuthClient({ + oauthClient = await createOAuthClient({ appKey: 'gitlab', active: false, }); @@ -355,7 +355,7 @@ describe('POST /api/v1/apps/:appKey/connections', () => { it('should return with not authorized response', async () => { const connectionData = { - appAuthClientId: appAuthClient.id, + oauthClientId: oauthClient.id, }; await request(app) diff --git a/packages/backend/src/controllers/api/v1/apps/get-action-substeps.test.js b/packages/backend/src/controllers/api/v1/apps/get-action-substeps.test.js index bc28ae33..e3b6db03 100644 --- a/packages/backend/src/controllers/api/v1/apps/get-action-substeps.test.js +++ b/packages/backend/src/controllers/api/v1/apps/get-action-substeps.test.js @@ -15,7 +15,7 @@ describe('GET /api/v1/apps/:appKey/actions/:actionKey/substeps', () => { exampleApp = await App.findOneByKey('github'); }); - it('should return the app auth info', async () => { + it('should return the action substeps info', async () => { const actions = await App.findActionsByKey('github'); const exampleAction = actions.find( (action) => action.key === 'createIssue' diff --git a/packages/backend/src/controllers/api/v1/apps/get-auth-client.ee.js b/packages/backend/src/controllers/api/v1/apps/get-auth-client.ee.js deleted file mode 100644 index 5aceb529..00000000 --- a/packages/backend/src/controllers/api/v1/apps/get-auth-client.ee.js +++ /dev/null @@ -1,11 +0,0 @@ -import { renderObject } from '../../../../helpers/renderer.js'; -import AppAuthClient from '../../../../models/app-auth-client.js'; - -export default async (request, response) => { - const appAuthClient = await AppAuthClient.query() - .findById(request.params.appAuthClientId) - .where({ app_key: request.params.appKey, active: true }) - .throwIfNotFound(); - - renderObject(response, appAuthClient); -}; diff --git a/packages/backend/src/controllers/api/v1/apps/get-config.ee.js b/packages/backend/src/controllers/api/v1/apps/get-config.ee.js index d0837e35..229c20d1 100644 --- a/packages/backend/src/controllers/api/v1/apps/get-config.ee.js +++ b/packages/backend/src/controllers/api/v1/apps/get-config.ee.js @@ -4,7 +4,7 @@ import AppConfig from '../../../../models/app-config.js'; export default async (request, response) => { const appConfig = await AppConfig.query() .withGraphFetched({ - appAuthClients: true, + oauthClients: true, }) .findOne({ key: request.params.appKey, diff --git a/packages/backend/src/controllers/api/v1/apps/get-connections.js b/packages/backend/src/controllers/api/v1/apps/get-connections.js index 1f5a91ad..0f2fdfcb 100644 --- a/packages/backend/src/controllers/api/v1/apps/get-connections.js +++ b/packages/backend/src/controllers/api/v1/apps/get-connections.js @@ -9,7 +9,7 @@ export default async (request, response) => { .select('connections.*') .withGraphFetched({ appConfig: true, - appAuthClient: true, + oauthClient: true, }) .fullOuterJoinRelated('steps') .where({ diff --git a/packages/backend/src/controllers/api/v1/apps/get-oauth-client.ee.js b/packages/backend/src/controllers/api/v1/apps/get-oauth-client.ee.js new file mode 100644 index 00000000..2577f27d --- /dev/null +++ b/packages/backend/src/controllers/api/v1/apps/get-oauth-client.ee.js @@ -0,0 +1,11 @@ +import { renderObject } from '../../../../helpers/renderer.js'; +import OAuthClient from '../../../../models/oauth-client.js'; + +export default async (request, response) => { + const oauthClient = await OAuthClient.query() + .findById(request.params.oauthClientId) + .where({ app_key: request.params.appKey, active: true }) + .throwIfNotFound(); + + renderObject(response, oauthClient); +}; diff --git a/packages/backend/src/controllers/api/v1/apps/get-auth-client.ee.test.js b/packages/backend/src/controllers/api/v1/apps/get-oauth-client.ee.test.js similarity index 54% rename from packages/backend/src/controllers/api/v1/apps/get-auth-client.ee.test.js rename to packages/backend/src/controllers/api/v1/apps/get-oauth-client.ee.test.js index d5bea452..b39367f8 100644 --- a/packages/backend/src/controllers/api/v1/apps/get-auth-client.ee.test.js +++ b/packages/backend/src/controllers/api/v1/apps/get-oauth-client.ee.test.js @@ -4,46 +4,46 @@ import Crypto from 'crypto'; import app from '../../../../app.js'; import createAuthTokenByUserId from '../../../../helpers/create-auth-token-by-user-id.js'; import { createUser } from '../../../../../test/factories/user.js'; -import getAppAuthClientMock from '../../../../../test/mocks/rest/api/v1/apps/get-auth-client.js'; -import { createAppAuthClient } from '../../../../../test/factories/app-auth-client.js'; +import getOAuthClientMock from '../../../../../test/mocks/rest/api/v1/apps/get-oauth-client.js'; +import { createOAuthClient } from '../../../../../test/factories/oauth-client.js'; import * as license from '../../../../helpers/license.ee.js'; -describe('GET /api/v1/apps/:appKey/auth-clients/:appAuthClientId', () => { - let currentUser, currentAppAuthClient, token; +describe('GET /api/v1/apps/:appKey/oauth-clients/:oauthClientId', () => { + let currentUser, currentOAuthClient, token; beforeEach(async () => { vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true); currentUser = await createUser(); - currentAppAuthClient = await createAppAuthClient({ + currentOAuthClient = await createOAuthClient({ appKey: 'deepl', }); token = await createAuthTokenByUserId(currentUser.id); }); - it('should return specified app auth client', async () => { + it('should return specified oauth client', async () => { const response = await request(app) - .get(`/api/v1/apps/deepl/auth-clients/${currentAppAuthClient.id}`) + .get(`/api/v1/apps/deepl/oauth-clients/${currentOAuthClient.id}`) .set('Authorization', token) .expect(200); - const expectedPayload = getAppAuthClientMock(currentAppAuthClient); + const expectedPayload = getOAuthClientMock(currentOAuthClient); expect(response.body).toStrictEqual(expectedPayload); }); - it('should return not found response for not existing app auth client ID', async () => { - const notExistingAppAuthClientUUID = Crypto.randomUUID(); + it('should return not found response for not existing oauth client ID', async () => { + const notExistingOAuthClientUUID = Crypto.randomUUID(); await request(app) - .get(`/api/v1/apps/deepl/auth-clients/${notExistingAppAuthClientUUID}`) + .get(`/api/v1/apps/deepl/oauth-clients/${notExistingOAuthClientUUID}`) .set('Authorization', token) .expect(404); }); it('should return bad request response for invalid UUID', async () => { await request(app) - .get('/api/v1/apps/deepl/auth-clients/invalidAppAuthClientUUID') + .get('/api/v1/apps/deepl/oauth-clients/invalidOAuthClientUUID') .set('Authorization', token) .expect(400); }); diff --git a/packages/backend/src/controllers/api/v1/apps/get-auth-clients.ee.js b/packages/backend/src/controllers/api/v1/apps/get-oauth-clients.ee.js similarity index 56% rename from packages/backend/src/controllers/api/v1/apps/get-auth-clients.ee.js rename to packages/backend/src/controllers/api/v1/apps/get-oauth-clients.ee.js index 06eceec1..2a68737b 100644 --- a/packages/backend/src/controllers/api/v1/apps/get-auth-clients.ee.js +++ b/packages/backend/src/controllers/api/v1/apps/get-oauth-clients.ee.js @@ -1,10 +1,10 @@ import { renderObject } from '../../../../helpers/renderer.js'; -import AppAuthClient from '../../../../models/app-auth-client.js'; +import OAuthClient from '../../../../models/oauth-client.js'; export default async (request, response) => { - const appAuthClients = await AppAuthClient.query() + const oauthClients = await OAuthClient.query() .where({ app_key: request.params.appKey, active: true }) .orderBy('created_at', 'desc'); - renderObject(response, appAuthClients); + renderObject(response, oauthClients); }; diff --git a/packages/backend/src/controllers/api/v1/apps/get-auth-clients.ee.test.js b/packages/backend/src/controllers/api/v1/apps/get-oauth-clients.ee.test.js similarity index 59% rename from packages/backend/src/controllers/api/v1/apps/get-auth-clients.ee.test.js rename to packages/backend/src/controllers/api/v1/apps/get-oauth-clients.ee.test.js index d84bf167..4e4b8508 100644 --- a/packages/backend/src/controllers/api/v1/apps/get-auth-clients.ee.test.js +++ b/packages/backend/src/controllers/api/v1/apps/get-oauth-clients.ee.test.js @@ -3,11 +3,11 @@ import request from 'supertest'; import app from '../../../../app.js'; import createAuthTokenByUserId from '../../../../helpers/create-auth-token-by-user-id.js'; import { createUser } from '../../../../../test/factories/user.js'; -import getAuthClientsMock from '../../../../../test/mocks/rest/api/v1/apps/get-auth-clients.js'; -import { createAppAuthClient } from '../../../../../test/factories/app-auth-client.js'; +import getOAuthClientsMock from '../../../../../test/mocks/rest/api/v1/apps/get-oauth-clients.js'; +import { createOAuthClient } from '../../../../../test/factories/oauth-client.js'; import * as license from '../../../../helpers/license.ee.js'; -describe('GET /api/v1/apps/:appKey/auth-clients', () => { +describe('GET /api/v1/apps/:appKey/oauth-clients', () => { let currentUser, token; beforeEach(async () => { @@ -18,23 +18,23 @@ describe('GET /api/v1/apps/:appKey/auth-clients', () => { token = await createAuthTokenByUserId(currentUser.id); }); - it('should return specified app auth client info', async () => { - const appAuthClientOne = await createAppAuthClient({ + it('should return specified oauth client info', async () => { + const oauthClientOne = await createOAuthClient({ appKey: 'deepl', }); - const appAuthClientTwo = await createAppAuthClient({ + const oauthClientTwo = await createOAuthClient({ appKey: 'deepl', }); const response = await request(app) - .get('/api/v1/apps/deepl/auth-clients') + .get('/api/v1/apps/deepl/oauth-clients') .set('Authorization', token) .expect(200); - const expectedPayload = getAuthClientsMock([ - appAuthClientTwo, - appAuthClientOne, + const expectedPayload = getOAuthClientsMock([ + oauthClientTwo, + oauthClientOne, ]); expect(response.body).toStrictEqual(expectedPayload); diff --git a/packages/backend/src/controllers/api/v1/apps/get-trigger-substeps.test.js b/packages/backend/src/controllers/api/v1/apps/get-trigger-substeps.test.js index 0748ee5a..e54b6de2 100644 --- a/packages/backend/src/controllers/api/v1/apps/get-trigger-substeps.test.js +++ b/packages/backend/src/controllers/api/v1/apps/get-trigger-substeps.test.js @@ -15,7 +15,7 @@ describe('GET /api/v1/apps/:appKey/triggers/:triggerKey/substeps', () => { exampleApp = await App.findOneByKey('github'); }); - it('should return the app auth info', async () => { + it('should return the trigger substeps info', async () => { const triggers = await App.findTriggersByKey('github'); const exampleTrigger = triggers.find( (trigger) => trigger.key === 'newIssues' diff --git a/packages/backend/src/controllers/api/v1/connections/update-connection.js b/packages/backend/src/controllers/api/v1/connections/update-connection.js index 5d84e797..979aa733 100644 --- a/packages/backend/src/controllers/api/v1/connections/update-connection.js +++ b/packages/backend/src/controllers/api/v1/connections/update-connection.js @@ -14,6 +14,6 @@ export default async (request, response) => { }; const connectionParams = (request) => { - const { formattedData, appAuthClientId } = request.body; - return { formattedData, appAuthClientId }; + const { formattedData, oauthClientId } = request.body; + return { formattedData, oauthClientId }; }; diff --git a/packages/backend/src/db/migrations/20241217170447_change_app_auth_clients_as_oauth_clients.js b/packages/backend/src/db/migrations/20241217170447_change_app_auth_clients_as_oauth_clients.js new file mode 100644 index 00000000..a26ad1f4 --- /dev/null +++ b/packages/backend/src/db/migrations/20241217170447_change_app_auth_clients_as_oauth_clients.js @@ -0,0 +1,31 @@ +export async function up(knex) { + await knex.schema.renameTable('app_auth_clients', 'oauth_clients'); + + await knex.schema.raw( + 'ALTER INDEX app_auth_clients_pkey RENAME TO oauth_clients_pkey' + ); + + await knex.schema.raw( + 'ALTER INDEX app_auth_clients_name_unique RENAME TO oauth_clients_name_unique' + ); + + return await knex.schema.alterTable('connections', (table) => { + table.renameColumn('app_auth_client_id', 'oauth_client_id'); + }); +} + +export async function down(knex) { + await knex.schema.renameTable('oauth_clients', 'app_auth_clients'); + + await knex.schema.raw( + 'ALTER INDEX oauth_clients_pkey RENAME TO app_auth_clients_pkey' + ); + + await knex.schema.raw( + 'ALTER INDEX oauth_clients_name_unique RENAME TO app_auth_clients_name_unique' + ); + + return await knex.schema.alterTable('connections', (table) => { + table.renameColumn('oauth_client_id', 'app_auth_client_id'); + }); +} diff --git a/packages/backend/src/helpers/add-authentication-steps.js b/packages/backend/src/helpers/add-authentication-steps.js index 5e7a462a..ee1bc85b 100644 --- a/packages/backend/src/helpers/add-authentication-steps.js +++ b/packages/backend/src/helpers/add-authentication-steps.js @@ -88,8 +88,8 @@ const sharedAuthenticationStepsWithAuthUrl = [ value: '{key}', }, { - name: 'appAuthClientId', - value: '{appAuthClientId}', + name: 'oauthClientId', + value: '{oauthClientId}', }, ], }, diff --git a/packages/backend/src/models/__snapshots__/connection.test.js.snap b/packages/backend/src/models/__snapshots__/connection.test.js.snap index 9fc77caf..405133b0 100644 --- a/packages/backend/src/models/__snapshots__/connection.test.js.snap +++ b/packages/backend/src/models/__snapshots__/connection.test.js.snap @@ -3,10 +3,6 @@ exports[`Connection model > jsonSchema should have correct validations 1`] = ` { "properties": { - "appAuthClientId": { - "format": "uuid", - "type": "string", - }, "createdAt": { "type": "string", }, @@ -31,6 +27,10 @@ exports[`Connection model > jsonSchema should have correct validations 1`] = ` "minLength": 1, "type": "string", }, + "oauthClientId": { + "format": "uuid", + "type": "string", + }, "updatedAt": { "type": "string", }, diff --git a/packages/backend/src/models/__snapshots__/app-auth-client.test.js.snap b/packages/backend/src/models/__snapshots__/oauth-client.test.js.snap similarity index 87% rename from packages/backend/src/models/__snapshots__/app-auth-client.test.js.snap rename to packages/backend/src/models/__snapshots__/oauth-client.test.js.snap index 87b5cc8c..04b38119 100644 --- a/packages/backend/src/models/__snapshots__/app-auth-client.test.js.snap +++ b/packages/backend/src/models/__snapshots__/oauth-client.test.js.snap @@ -1,6 +1,6 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`AppAuthClient model > jsonSchema should have correct validations 1`] = ` +exports[`OAuthClient model > jsonSchema should have correct validations 1`] = ` { "properties": { "active": { diff --git a/packages/backend/src/models/app-auth-client.test.js b/packages/backend/src/models/app-auth-client.test.js deleted file mode 100644 index bc4be9fc..00000000 --- a/packages/backend/src/models/app-auth-client.test.js +++ /dev/null @@ -1,202 +0,0 @@ -import { describe, it, expect, vi } from 'vitest'; -import AES from 'crypto-js/aes.js'; -import enc from 'crypto-js/enc-utf8.js'; - -import AppConfig from './app-config.js'; -import AppAuthClient from './app-auth-client.js'; -import Base from './base.js'; -import appConfig from '../config/app.js'; -import { createAppAuthClient } from '../../test/factories/app-auth-client.js'; - -describe('AppAuthClient model', () => { - it('tableName should return correct name', () => { - expect(AppAuthClient.tableName).toBe('app_auth_clients'); - }); - - it('jsonSchema should have correct validations', () => { - expect(AppAuthClient.jsonSchema).toMatchSnapshot(); - }); - - it('relationMappings should return correct associations', () => { - const relationMappings = AppAuthClient.relationMappings(); - - const expectedRelations = { - appConfig: { - relation: Base.BelongsToOneRelation, - modelClass: AppConfig, - join: { - from: 'app_auth_clients.app_key', - to: 'app_configs.key', - }, - }, - }; - - expect(relationMappings).toStrictEqual(expectedRelations); - }); - - describe('encryptData', () => { - it('should return undefined if eligibleForEncryption is not true', async () => { - vi.spyOn( - AppAuthClient.prototype, - 'eligibleForEncryption' - ).mockReturnValue(false); - - const appAuthClient = new AppAuthClient(); - - expect(appAuthClient.encryptData()).toBeUndefined(); - }); - - it('should encrypt formattedAuthDefaults and set it to authDefaults', async () => { - vi.spyOn( - AppAuthClient.prototype, - 'eligibleForEncryption' - ).mockReturnValue(true); - - const formattedAuthDefaults = { - key: 'value', - }; - - const appAuthClient = new AppAuthClient(); - appAuthClient.formattedAuthDefaults = formattedAuthDefaults; - appAuthClient.encryptData(); - - const expectedDecryptedValue = JSON.parse( - AES.decrypt( - appAuthClient.authDefaults, - appConfig.encryptionKey - ).toString(enc) - ); - - expect(formattedAuthDefaults).toStrictEqual(expectedDecryptedValue); - expect(appAuthClient.authDefaults).not.toStrictEqual( - formattedAuthDefaults - ); - }); - - it('should encrypt formattedAuthDefaults and remove formattedAuthDefaults', async () => { - vi.spyOn( - AppAuthClient.prototype, - 'eligibleForEncryption' - ).mockReturnValue(true); - - const formattedAuthDefaults = { - key: 'value', - }; - - const appAuthClient = new AppAuthClient(); - appAuthClient.formattedAuthDefaults = formattedAuthDefaults; - appAuthClient.encryptData(); - - expect(appAuthClient.formattedAuthDefaults).not.toBeDefined(); - }); - }); - - describe('decryptData', () => { - it('should return undefined if eligibleForDecryption is not true', () => { - vi.spyOn( - AppAuthClient.prototype, - 'eligibleForDecryption' - ).mockReturnValue(false); - - const appAuthClient = new AppAuthClient(); - - expect(appAuthClient.decryptData()).toBeUndefined(); - }); - - it('should decrypt authDefaults and set it to formattedAuthDefaults', async () => { - vi.spyOn( - AppAuthClient.prototype, - 'eligibleForDecryption' - ).mockReturnValue(true); - - const formattedAuthDefaults = { - key: 'value', - }; - - const authDefaults = AES.encrypt( - JSON.stringify(formattedAuthDefaults), - appConfig.encryptionKey - ).toString(); - - const appAuthClient = new AppAuthClient(); - appAuthClient.authDefaults = authDefaults; - appAuthClient.decryptData(); - - expect(appAuthClient.formattedAuthDefaults).toStrictEqual( - formattedAuthDefaults - ); - expect(appAuthClient.authDefaults).not.toStrictEqual( - formattedAuthDefaults - ); - }); - }); - - describe('eligibleForEncryption', () => { - it('should return true when formattedAuthDefaults property exists', async () => { - const appAuthClient = await createAppAuthClient(); - - expect(appAuthClient.eligibleForEncryption()).toBe(true); - }); - - it("should return false when formattedAuthDefaults property doesn't exist", async () => { - const appAuthClient = await createAppAuthClient(); - - delete appAuthClient.formattedAuthDefaults; - - expect(appAuthClient.eligibleForEncryption()).toBe(false); - }); - }); - - describe('eligibleForDecryption', () => { - it('should return true when authDefaults property exists', async () => { - const appAuthClient = await createAppAuthClient(); - - expect(appAuthClient.eligibleForDecryption()).toBe(true); - }); - - it("should return false when authDefaults property doesn't exist", async () => { - const appAuthClient = await createAppAuthClient(); - - delete appAuthClient.authDefaults; - - expect(appAuthClient.eligibleForDecryption()).toBe(false); - }); - }); - - it('$beforeInsert should call AppAuthClient.encryptData', async () => { - const appAuthClientBeforeInsertSpy = vi.spyOn( - AppAuthClient.prototype, - 'encryptData' - ); - - await createAppAuthClient(); - - expect(appAuthClientBeforeInsertSpy).toHaveBeenCalledOnce(); - }); - - it('$beforeUpdate should call AppAuthClient.encryptData', async () => { - const appAuthClient = await createAppAuthClient(); - - const appAuthClientBeforeUpdateSpy = vi.spyOn( - AppAuthClient.prototype, - 'encryptData' - ); - - await appAuthClient.$query().patchAndFetch({ name: 'sample' }); - - expect(appAuthClientBeforeUpdateSpy).toHaveBeenCalledOnce(); - }); - - it('$afterFind should call AppAuthClient.decryptData', async () => { - const appAuthClient = await createAppAuthClient(); - - const appAuthClientAfterFindSpy = vi.spyOn( - AppAuthClient.prototype, - 'decryptData' - ); - - await appAuthClient.$query(); - - expect(appAuthClientAfterFindSpy).toHaveBeenCalledOnce(); - }); -}); diff --git a/packages/backend/src/models/app-config.js b/packages/backend/src/models/app-config.js index 6763e9f8..fe7e2d44 100644 --- a/packages/backend/src/models/app-config.js +++ b/packages/backend/src/models/app-config.js @@ -1,5 +1,5 @@ import App from './app.js'; -import AppAuthClient from './app-auth-client.js'; +import OAuthClient from './oauth-client.js'; import Base from './base.js'; class AppConfig extends Base { @@ -24,12 +24,12 @@ class AppConfig extends Base { }; static relationMappings = () => ({ - appAuthClients: { + oauthClients: { relation: Base.HasManyRelation, - modelClass: AppAuthClient, + modelClass: OAuthClient, join: { from: 'app_configs.key', - to: 'app_auth_clients.app_key', + to: 'oauth_clients.app_key', }, }, }); diff --git a/packages/backend/src/models/app-config.test.js b/packages/backend/src/models/app-config.test.js index 2e6f05be..a68b393f 100644 --- a/packages/backend/src/models/app-config.test.js +++ b/packages/backend/src/models/app-config.test.js @@ -3,7 +3,7 @@ import { describe, it, expect } from 'vitest'; import Base from './base.js'; import AppConfig from './app-config.js'; import App from './app.js'; -import AppAuthClient from './app-auth-client.js'; +import OAuthClient from './oauth-client.js'; describe('AppConfig model', () => { it('tableName should return correct name', () => { @@ -22,12 +22,12 @@ describe('AppConfig model', () => { const relationMappings = AppConfig.relationMappings(); const expectedRelations = { - appAuthClients: { + oauthClients: { relation: Base.HasManyRelation, - modelClass: AppAuthClient, + modelClass: OAuthClient, join: { from: 'app_configs.key', - to: 'app_auth_clients.app_key', + to: 'oauth_clients.app_key', }, }, }; diff --git a/packages/backend/src/models/connection.js b/packages/backend/src/models/connection.js index 4a8d5351..5b4c7c66 100644 --- a/packages/backend/src/models/connection.js +++ b/packages/backend/src/models/connection.js @@ -2,7 +2,7 @@ import AES from 'crypto-js/aes.js'; import enc from 'crypto-js/enc-utf8.js'; import App from './app.js'; import AppConfig from './app-config.js'; -import AppAuthClient from './app-auth-client.js'; +import OAuthClient from './oauth-client.js'; import Base from './base.js'; import User from './user.js'; import Step from './step.js'; @@ -24,7 +24,7 @@ class Connection extends Base { data: { type: 'string' }, formattedData: { type: 'object' }, userId: { type: 'string', format: 'uuid' }, - appAuthClientId: { type: 'string', format: 'uuid' }, + oauthClientId: { type: 'string', format: 'uuid' }, verified: { type: 'boolean', default: false }, draft: { type: 'boolean' }, deletedAt: { type: 'string' }, @@ -69,12 +69,12 @@ class Connection extends Base { to: 'app_configs.key', }, }, - appAuthClient: { + oauthClient: { relation: Base.BelongsToOneRelation, - modelClass: AppAuthClient, + modelClass: OAuthClient, join: { - from: 'connections.app_auth_client_id', - to: 'app_auth_clients.id', + from: 'connections.oauth_client_id', + to: 'oauth_clients.id', }, }, }); @@ -136,8 +136,8 @@ class Connection extends Base { if (!this.formattedData) { const authClient = await appConfig - .$relatedQuery('appAuthClients') - .findById(this.appAuthClientId) + .$relatedQuery('oauthClients') + .findById(this.oauthClientId) .where({ active: true }) .throwIfNotFound(); @@ -215,13 +215,13 @@ class Connection extends Base { return updatedConnection; } - async updateFormattedData({ formattedData, appAuthClientId }) { - if (appAuthClientId) { - const appAuthClient = await AppAuthClient.query() - .findById(appAuthClientId) + async updateFormattedData({ formattedData, oauthClientId }) { + if (oauthClientId) { + const oauthClient = await OAuthClient.query() + .findById(oauthClientId) .throwIfNotFound(); - formattedData = appAuthClient.formattedAuthDefaults; + formattedData = oauthClient.formattedAuthDefaults; } return await this.$query().patchAndFetch({ diff --git a/packages/backend/src/models/connection.test.js b/packages/backend/src/models/connection.test.js index 329fdfe6..58410eef 100644 --- a/packages/backend/src/models/connection.test.js +++ b/packages/backend/src/models/connection.test.js @@ -2,7 +2,7 @@ import { describe, it, expect, vi } from 'vitest'; import AES from 'crypto-js/aes.js'; import enc from 'crypto-js/enc-utf8.js'; import appConfig from '../config/app.js'; -import AppAuthClient from './app-auth-client.js'; +import OAuthClient from './oauth-client.js'; import App from './app.js'; import AppConfig from './app-config.js'; import Base from './base.js'; @@ -12,7 +12,7 @@ import User from './user.js'; import Telemetry from '../helpers/telemetry/index.js'; import { createConnection } from '../../test/factories/connection.js'; import { createAppConfig } from '../../test/factories/app-config.js'; -import { createAppAuthClient } from '../../test/factories/app-auth-client.js'; +import { createOAuthClient } from '../../test/factories/oauth-client.js'; describe('Connection model', () => { it('tableName should return correct name', () => { @@ -61,12 +61,12 @@ describe('Connection model', () => { to: 'app_configs.key', }, }, - appAuthClient: { + oauthClient: { relation: Base.BelongsToOneRelation, - modelClass: AppAuthClient, + modelClass: OAuthClient, join: { - from: 'connections.app_auth_client_id', - to: 'app_auth_clients.id', + from: 'connections.oauth_client_id', + to: 'oauth_clients.id', }, }, }; @@ -307,13 +307,13 @@ describe('Connection model', () => { ); }); - it('should apply app auth client auth defaults when creating with shared app auth client', async () => { + it('should apply oauth client auth defaults when creating with shared oauth client', async () => { await createAppConfig({ key: 'gitlab', disabled: false, }); - const appAuthClient = await createAppAuthClient({ + const oauthClient = await createOAuthClient({ appKey: 'gitlab', active: true, formattedAuthDefaults: { @@ -323,7 +323,7 @@ describe('Connection model', () => { const connection = await createConnection({ key: 'gitlab', - appAuthClientId: appAuthClient.id, + oauthClientId: oauthClient.id, formattedData: null, }); @@ -559,22 +559,22 @@ describe('Connection model', () => { }); describe('updateFormattedData', () => { - it('should extend connection data with app auth client auth defaults', async () => { - const appAuthClient = await createAppAuthClient({ + it('should extend connection data with oauth client auth defaults', async () => { + const oauthClient = await createOAuthClient({ formattedAuthDefaults: { clientId: 'sample-id', }, }); const connection = await createConnection({ - appAuthClientId: appAuthClient.id, + oauthClientId: oauthClient.id, formattedData: { token: 'sample-token', }, }); const updatedConnection = await connection.updateFormattedData({ - appAuthClientId: appAuthClient.id, + oauthClientId: oauthClient.id, }); expect(updatedConnection.formattedData).toStrictEqual({ diff --git a/packages/backend/src/models/app-auth-client.js b/packages/backend/src/models/oauth-client.js similarity index 93% rename from packages/backend/src/models/app-auth-client.js rename to packages/backend/src/models/oauth-client.js index 48800841..d4c253a4 100644 --- a/packages/backend/src/models/app-auth-client.js +++ b/packages/backend/src/models/oauth-client.js @@ -4,8 +4,8 @@ import appConfig from '../config/app.js'; import Base from './base.js'; import AppConfig from './app-config.js'; -class AppAuthClient extends Base { - static tableName = 'app_auth_clients'; +class OAuthClient extends Base { + static tableName = 'oauth_clients'; static jsonSchema = { type: 'object', @@ -27,7 +27,7 @@ class AppAuthClient extends Base { relation: Base.BelongsToOneRelation, modelClass: AppConfig, join: { - from: 'app_auth_clients.app_key', + from: 'oauth_clients.app_key', to: 'app_configs.key', }, }, @@ -87,4 +87,4 @@ class AppAuthClient extends Base { } } -export default AppAuthClient; +export default OAuthClient; diff --git a/packages/backend/src/models/oauth-client.test.js b/packages/backend/src/models/oauth-client.test.js new file mode 100644 index 00000000..e1d17154 --- /dev/null +++ b/packages/backend/src/models/oauth-client.test.js @@ -0,0 +1,192 @@ +import { describe, it, expect, vi } from 'vitest'; +import AES from 'crypto-js/aes.js'; +import enc from 'crypto-js/enc-utf8.js'; + +import AppConfig from './app-config.js'; +import OAuthClient from './oauth-client.js'; +import Base from './base.js'; +import appConfig from '../config/app.js'; +import { createOAuthClient } from '../../test/factories/oauth-client.js'; + +describe('OAuthClient model', () => { + it('tableName should return correct name', () => { + expect(OAuthClient.tableName).toBe('oauth_clients'); + }); + + it('jsonSchema should have correct validations', () => { + expect(OAuthClient.jsonSchema).toMatchSnapshot(); + }); + + it('relationMappings should return correct associations', () => { + const relationMappings = OAuthClient.relationMappings(); + + const expectedRelations = { + appConfig: { + relation: Base.BelongsToOneRelation, + modelClass: AppConfig, + join: { + from: 'oauth_clients.app_key', + to: 'app_configs.key', + }, + }, + }; + + expect(relationMappings).toStrictEqual(expectedRelations); + }); + + describe('encryptData', () => { + it('should return undefined if eligibleForEncryption is not true', async () => { + vi.spyOn(OAuthClient.prototype, 'eligibleForEncryption').mockReturnValue( + false + ); + + const oauthClient = new OAuthClient(); + + expect(oauthClient.encryptData()).toBeUndefined(); + }); + + it('should encrypt formattedAuthDefaults and set it to authDefaults', async () => { + vi.spyOn(OAuthClient.prototype, 'eligibleForEncryption').mockReturnValue( + true + ); + + const formattedAuthDefaults = { + key: 'value', + }; + + const oauthClient = new OAuthClient(); + oauthClient.formattedAuthDefaults = formattedAuthDefaults; + oauthClient.encryptData(); + + const expectedDecryptedValue = JSON.parse( + AES.decrypt(oauthClient.authDefaults, appConfig.encryptionKey).toString( + enc + ) + ); + + expect(formattedAuthDefaults).toStrictEqual(expectedDecryptedValue); + expect(oauthClient.authDefaults).not.toStrictEqual(formattedAuthDefaults); + }); + + it('should encrypt formattedAuthDefaults and remove formattedAuthDefaults', async () => { + vi.spyOn(OAuthClient.prototype, 'eligibleForEncryption').mockReturnValue( + true + ); + + const formattedAuthDefaults = { + key: 'value', + }; + + const oauthClient = new OAuthClient(); + oauthClient.formattedAuthDefaults = formattedAuthDefaults; + oauthClient.encryptData(); + + expect(oauthClient.formattedAuthDefaults).not.toBeDefined(); + }); + }); + + describe('decryptData', () => { + it('should return undefined if eligibleForDecryption is not true', () => { + vi.spyOn(OAuthClient.prototype, 'eligibleForDecryption').mockReturnValue( + false + ); + + const oauthClient = new OAuthClient(); + + expect(oauthClient.decryptData()).toBeUndefined(); + }); + + it('should decrypt authDefaults and set it to formattedAuthDefaults', async () => { + vi.spyOn(OAuthClient.prototype, 'eligibleForDecryption').mockReturnValue( + true + ); + + const formattedAuthDefaults = { + key: 'value', + }; + + const authDefaults = AES.encrypt( + JSON.stringify(formattedAuthDefaults), + appConfig.encryptionKey + ).toString(); + + const oauthClient = new OAuthClient(); + oauthClient.authDefaults = authDefaults; + oauthClient.decryptData(); + + expect(oauthClient.formattedAuthDefaults).toStrictEqual( + formattedAuthDefaults + ); + expect(oauthClient.authDefaults).not.toStrictEqual(formattedAuthDefaults); + }); + }); + + describe('eligibleForEncryption', () => { + it('should return true when formattedAuthDefaults property exists', async () => { + const oauthClient = await createOAuthClient(); + + expect(oauthClient.eligibleForEncryption()).toBe(true); + }); + + it("should return false when formattedAuthDefaults property doesn't exist", async () => { + const oauthClient = await createOAuthClient(); + + delete oauthClient.formattedAuthDefaults; + + expect(oauthClient.eligibleForEncryption()).toBe(false); + }); + }); + + describe('eligibleForDecryption', () => { + it('should return true when authDefaults property exists', async () => { + const oauthClient = await createOAuthClient(); + + expect(oauthClient.eligibleForDecryption()).toBe(true); + }); + + it("should return false when authDefaults property doesn't exist", async () => { + const oauthClient = await createOAuthClient(); + + delete oauthClient.authDefaults; + + expect(oauthClient.eligibleForDecryption()).toBe(false); + }); + }); + + it('$beforeInsert should call OAuthClient.encryptData', async () => { + const oauthClientBeforeInsertSpy = vi.spyOn( + OAuthClient.prototype, + 'encryptData' + ); + + await createOAuthClient(); + + expect(oauthClientBeforeInsertSpy).toHaveBeenCalledOnce(); + }); + + it('$beforeUpdate should call OAuthClient.encryptData', async () => { + const oauthClient = await createOAuthClient(); + + const oauthClientBeforeUpdateSpy = vi.spyOn( + OAuthClient.prototype, + 'encryptData' + ); + + await oauthClient.$query().patchAndFetch({ name: 'sample' }); + + expect(oauthClientBeforeUpdateSpy).toHaveBeenCalledOnce(); + }); + + it('$afterFind should call OAuthClient.decryptData', async () => { + const oauthClient = await createOAuthClient(); + + const oauthClientAfterFindSpy = vi.spyOn( + OAuthClient.prototype, + 'decryptData' + ); + + await oauthClient.$query(); + + expect(oauthClientAfterFindSpy).toHaveBeenCalledOnce(); + }); +}); diff --git a/packages/backend/src/routes/api/v1/admin/apps.ee.js b/packages/backend/src/routes/api/v1/admin/apps.ee.js index c476d2ff..6a0eb9a6 100644 --- a/packages/backend/src/routes/api/v1/admin/apps.ee.js +++ b/packages/backend/src/routes/api/v1/admin/apps.ee.js @@ -4,10 +4,10 @@ import { authorizeAdmin } from '../../../../helpers/authorization.js'; import { checkIsEnterprise } from '../../../../helpers/check-is-enterprise.js'; import createConfigAction from '../../../../controllers/api/v1/admin/apps/create-config.ee.js'; import updateConfigAction from '../../../../controllers/api/v1/admin/apps/update-config.ee.js'; -import getAuthClientsAction from '../../../../controllers/api/v1/admin/apps/get-auth-clients.ee.js'; -import getAuthClientAction from '../../../../controllers/api/v1/admin/apps/get-auth-client.ee.js'; -import createAuthClientAction from '../../../../controllers/api/v1/admin/apps/create-auth-client.ee.js'; -import updateAuthClientAction from '../../../../controllers/api/v1/admin/apps/update-auth-client.ee.js'; +import getOAuthClientsAction from '../../../../controllers/api/v1/admin/apps/get-oauth-clients.ee.js'; +import getOAuthClientAction from '../../../../controllers/api/v1/admin/apps/get-oauth-client.ee.js'; +import createOAuthClientAction from '../../../../controllers/api/v1/admin/apps/create-oauth-client.ee.js'; +import updateOAuthClientAction from '../../../../controllers/api/v1/admin/apps/update-oauth-client.ee.js'; const router = Router(); @@ -28,35 +28,35 @@ router.patch( ); router.get( - '/:appKey/auth-clients', + '/:appKey/oauth-clients', authenticateUser, authorizeAdmin, checkIsEnterprise, - getAuthClientsAction + getOAuthClientsAction ); router.post( - '/:appKey/auth-clients', + '/:appKey/oauth-clients', authenticateUser, authorizeAdmin, checkIsEnterprise, - createAuthClientAction + createOAuthClientAction ); router.get( - '/:appKey/auth-clients/:appAuthClientId', + '/:appKey/oauth-clients/:oauthClientId', authenticateUser, authorizeAdmin, checkIsEnterprise, - getAuthClientAction + getOAuthClientAction ); router.patch( - '/:appKey/auth-clients/:appAuthClientId', + '/:appKey/oauth-clients/:oauthClientId', authenticateUser, authorizeAdmin, checkIsEnterprise, - updateAuthClientAction + updateOAuthClientAction ); export default router; diff --git a/packages/backend/src/routes/api/v1/apps.js b/packages/backend/src/routes/api/v1/apps.js index 5bdc27f1..c92fc552 100644 --- a/packages/backend/src/routes/api/v1/apps.js +++ b/packages/backend/src/routes/api/v1/apps.js @@ -7,8 +7,8 @@ import getAppsAction from '../../../controllers/api/v1/apps/get-apps.js'; import getAuthAction from '../../../controllers/api/v1/apps/get-auth.js'; import getConnectionsAction from '../../../controllers/api/v1/apps/get-connections.js'; import getConfigAction from '../../../controllers/api/v1/apps/get-config.ee.js'; -import getAuthClientsAction from '../../../controllers/api/v1/apps/get-auth-clients.ee.js'; -import getAuthClientAction from '../../../controllers/api/v1/apps/get-auth-client.ee.js'; +import getOAuthClientsAction from '../../../controllers/api/v1/apps/get-oauth-clients.ee.js'; +import getOAuthClientAction from '../../../controllers/api/v1/apps/get-oauth-client.ee.js'; import getTriggersAction from '../../../controllers/api/v1/apps/get-triggers.js'; import getTriggerSubstepsAction from '../../../controllers/api/v1/apps/get-trigger-substeps.js'; import getActionsAction from '../../../controllers/api/v1/apps/get-actions.js'; @@ -44,17 +44,17 @@ router.get( ); router.get( - '/:appKey/auth-clients', + '/:appKey/oauth-clients', authenticateUser, checkIsEnterprise, - getAuthClientsAction + getOAuthClientsAction ); router.get( - '/:appKey/auth-clients/:appAuthClientId', + '/:appKey/oauth-clients/:oauthClientId', authenticateUser, checkIsEnterprise, - getAuthClientAction + getOAuthClientAction ); router.get('/:appKey/triggers', authenticateUser, getTriggersAction); diff --git a/packages/backend/src/serializers/app-auth-client.js b/packages/backend/src/serializers/app-auth-client.js deleted file mode 100644 index 88af3dab..00000000 --- a/packages/backend/src/serializers/app-auth-client.js +++ /dev/null @@ -1,10 +0,0 @@ -const appAuthClientSerializer = (appAuthClient) => { - return { - id: appAuthClient.id, - appConfigId: appAuthClient.appConfigId, - name: appAuthClient.name, - active: appAuthClient.active, - }; -}; - -export default appAuthClientSerializer; diff --git a/packages/backend/src/serializers/app-auth-client.test.js b/packages/backend/src/serializers/app-auth-client.test.js deleted file mode 100644 index d4ed178e..00000000 --- a/packages/backend/src/serializers/app-auth-client.test.js +++ /dev/null @@ -1,24 +0,0 @@ -import { describe, it, expect, beforeEach } from 'vitest'; -import { createAppAuthClient } from '../../test/factories/app-auth-client'; -import appAuthClientSerializer from './app-auth-client'; - -describe('appAuthClient serializer', () => { - let appAuthClient; - - beforeEach(async () => { - appAuthClient = await createAppAuthClient(); - }); - - it('should return app auth client data', async () => { - const expectedPayload = { - id: appAuthClient.id, - appConfigId: appAuthClient.appConfigId, - name: appAuthClient.name, - active: appAuthClient.active, - }; - - expect(appAuthClientSerializer(appAuthClient)).toStrictEqual( - expectedPayload - ); - }); -}); diff --git a/packages/backend/src/serializers/connection.js b/packages/backend/src/serializers/connection.js index 388a6b87..70224476 100644 --- a/packages/backend/src/serializers/connection.js +++ b/packages/backend/src/serializers/connection.js @@ -2,7 +2,7 @@ const connectionSerializer = (connection) => { return { id: connection.id, key: connection.key, - appAuthClientId: connection.appAuthClientId, + oauthClientId: connection.oauthClientId, formattedData: { screenName: connection.formattedData.screenName, }, diff --git a/packages/backend/src/serializers/connection.test.js b/packages/backend/src/serializers/connection.test.js index 3ea7b324..bb9db58a 100644 --- a/packages/backend/src/serializers/connection.test.js +++ b/packages/backend/src/serializers/connection.test.js @@ -13,7 +13,7 @@ describe('connectionSerializer', () => { const expectedPayload = { id: connection.id, key: connection.key, - appAuthClientId: connection.appAuthClientId, + oauthClientId: connection.oauthClientId, formattedData: { screenName: connection.formattedData.screenName, }, diff --git a/packages/backend/src/serializers/index.js b/packages/backend/src/serializers/index.js index 3111b2df..4525b5ae 100644 --- a/packages/backend/src/serializers/index.js +++ b/packages/backend/src/serializers/index.js @@ -4,7 +4,7 @@ import permissionSerializer from './permission.js'; import adminSamlAuthProviderSerializer from './admin-saml-auth-provider.ee.js'; import samlAuthProviderSerializer from './saml-auth-provider.ee.js'; import samlAuthProviderRoleMappingSerializer from './role-mapping.ee.js'; -import appAuthClientSerializer from './app-auth-client.js'; +import oauthClientSerializer from './oauth-client.js'; import appConfigSerializer from './app-config.js'; import flowSerializer from './flow.js'; import stepSerializer from './step.js'; @@ -28,7 +28,7 @@ const serializers = { AdminSamlAuthProvider: adminSamlAuthProviderSerializer, SamlAuthProvider: samlAuthProviderSerializer, RoleMapping: samlAuthProviderRoleMappingSerializer, - AppAuthClient: appAuthClientSerializer, + OAuthClient: oauthClientSerializer, AppConfig: appConfigSerializer, Flow: flowSerializer, Step: stepSerializer, diff --git a/packages/backend/src/serializers/oauth-client.js b/packages/backend/src/serializers/oauth-client.js new file mode 100644 index 00000000..bacebafc --- /dev/null +++ b/packages/backend/src/serializers/oauth-client.js @@ -0,0 +1,10 @@ +const oauthClientSerializer = (oauthClient) => { + return { + id: oauthClient.id, + appConfigId: oauthClient.appConfigId, + name: oauthClient.name, + active: oauthClient.active, + }; +}; + +export default oauthClientSerializer; diff --git a/packages/backend/src/serializers/oauth-client.test.js b/packages/backend/src/serializers/oauth-client.test.js new file mode 100644 index 00000000..d5ab8d70 --- /dev/null +++ b/packages/backend/src/serializers/oauth-client.test.js @@ -0,0 +1,22 @@ +import { describe, it, expect, beforeEach } from 'vitest'; +import { createOAuthClient } from '../../test/factories/oauth-client'; +import oauthClientSerializer from './oauth-client'; + +describe('oauthClient serializer', () => { + let oauthClient; + + beforeEach(async () => { + oauthClient = await createOAuthClient(); + }); + + it('should return oauth client data', async () => { + const expectedPayload = { + id: oauthClient.id, + appConfigId: oauthClient.appConfigId, + name: oauthClient.name, + active: oauthClient.active, + }; + + expect(oauthClientSerializer(oauthClient)).toStrictEqual(expectedPayload); + }); +}); diff --git a/packages/backend/test/factories/app-auth-client.js b/packages/backend/test/factories/oauth-client.js similarity index 67% rename from packages/backend/test/factories/app-auth-client.js rename to packages/backend/test/factories/oauth-client.js index 831d4c14..0b0f6b9b 100644 --- a/packages/backend/test/factories/app-auth-client.js +++ b/packages/backend/test/factories/oauth-client.js @@ -1,5 +1,5 @@ import { faker } from '@faker-js/faker'; -import AppAuthClient from '../../src/models/app-auth-client'; +import OAuthClient from '../../src/models/oauth-client'; const formattedAuthDefaults = { oAuthRedirectUrl: faker.internet.url(), @@ -8,14 +8,14 @@ const formattedAuthDefaults = { clientSecret: faker.string.uuid(), }; -export const createAppAuthClient = async (params = {}) => { +export const createOAuthClient = async (params = {}) => { params.name = params?.name || faker.person.fullName(); params.appKey = params?.appKey || 'deepl'; params.active = params?.active ?? true; params.formattedAuthDefaults = params?.formattedAuthDefaults || formattedAuthDefaults; - const appAuthClient = await AppAuthClient.query().insertAndFetch(params); + const oauthClient = await OAuthClient.query().insertAndFetch(params); - return appAuthClient; + return oauthClient; }; diff --git a/packages/backend/test/mocks/rest/api/v1/admin/apps/create-auth-client.js b/packages/backend/test/mocks/rest/api/v1/admin/apps/create-auth-client.js deleted file mode 100644 index f91c8500..00000000 --- a/packages/backend/test/mocks/rest/api/v1/admin/apps/create-auth-client.js +++ /dev/null @@ -1,17 +0,0 @@ -const createAppAuthClientMock = (appAuthClient) => { - return { - data: { - name: appAuthClient.name, - active: appAuthClient.active, - }, - meta: { - count: 1, - currentPage: null, - isArray: false, - totalPages: null, - type: 'AppAuthClient', - }, - }; -}; - -export default createAppAuthClientMock; diff --git a/packages/backend/test/mocks/rest/api/v1/admin/apps/create-oauth-client.js b/packages/backend/test/mocks/rest/api/v1/admin/apps/create-oauth-client.js new file mode 100644 index 00000000..10e4e9b7 --- /dev/null +++ b/packages/backend/test/mocks/rest/api/v1/admin/apps/create-oauth-client.js @@ -0,0 +1,17 @@ +const createOAuthClientMock = (oauthClient) => { + return { + data: { + name: oauthClient.name, + active: oauthClient.active, + }, + meta: { + count: 1, + currentPage: null, + isArray: false, + totalPages: null, + type: 'OAuthClient', + }, + }; +}; + +export default createOAuthClientMock; diff --git a/packages/backend/test/mocks/rest/api/v1/admin/apps/get-auth-client.js b/packages/backend/test/mocks/rest/api/v1/admin/apps/get-auth-client.js deleted file mode 100644 index 4d437eca..00000000 --- a/packages/backend/test/mocks/rest/api/v1/admin/apps/get-auth-client.js +++ /dev/null @@ -1,18 +0,0 @@ -const getAppAuthClientMock = (appAuthClient) => { - return { - data: { - name: appAuthClient.name, - id: appAuthClient.id, - active: appAuthClient.active, - }, - meta: { - count: 1, - currentPage: null, - isArray: false, - totalPages: null, - type: 'AppAuthClient', - }, - }; -}; - -export default getAppAuthClientMock; diff --git a/packages/backend/test/mocks/rest/api/v1/admin/apps/get-auth-clients.js b/packages/backend/test/mocks/rest/api/v1/admin/apps/get-auth-clients.js deleted file mode 100644 index dd0cc5ee..00000000 --- a/packages/backend/test/mocks/rest/api/v1/admin/apps/get-auth-clients.js +++ /dev/null @@ -1,18 +0,0 @@ -const getAdminAppAuthClientsMock = (appAuthClients) => { - return { - data: appAuthClients.map((appAuthClient) => ({ - name: appAuthClient.name, - id: appAuthClient.id, - active: appAuthClient.active, - })), - meta: { - count: appAuthClients.length, - currentPage: null, - isArray: true, - totalPages: null, - type: 'AppAuthClient', - }, - }; -}; - -export default getAdminAppAuthClientsMock; diff --git a/packages/backend/test/mocks/rest/api/v1/admin/apps/get-oauth-client.js b/packages/backend/test/mocks/rest/api/v1/admin/apps/get-oauth-client.js new file mode 100644 index 00000000..1431b968 --- /dev/null +++ b/packages/backend/test/mocks/rest/api/v1/admin/apps/get-oauth-client.js @@ -0,0 +1,18 @@ +const getOAuthClientMock = (oauthClient) => { + return { + data: { + name: oauthClient.name, + id: oauthClient.id, + active: oauthClient.active, + }, + meta: { + count: 1, + currentPage: null, + isArray: false, + totalPages: null, + type: 'OAuthClient', + }, + }; +}; + +export default getOAuthClientMock; diff --git a/packages/backend/test/mocks/rest/api/v1/admin/apps/get-oauth-clients.js b/packages/backend/test/mocks/rest/api/v1/admin/apps/get-oauth-clients.js new file mode 100644 index 00000000..c0bd5d54 --- /dev/null +++ b/packages/backend/test/mocks/rest/api/v1/admin/apps/get-oauth-clients.js @@ -0,0 +1,18 @@ +const getAdminOAuthClientsMock = (oauthClients) => { + return { + data: oauthClients.map((oauthClient) => ({ + name: oauthClient.name, + id: oauthClient.id, + active: oauthClient.active, + })), + meta: { + count: oauthClients.length, + currentPage: null, + isArray: true, + totalPages: null, + type: 'OAuthClient', + }, + }; +}; + +export default getAdminOAuthClientsMock; diff --git a/packages/backend/test/mocks/rest/api/v1/admin/apps/update-auth-client.js b/packages/backend/test/mocks/rest/api/v1/admin/apps/update-auth-client.js deleted file mode 100644 index 9d4dea24..00000000 --- a/packages/backend/test/mocks/rest/api/v1/admin/apps/update-auth-client.js +++ /dev/null @@ -1,18 +0,0 @@ -const updateAppAuthClientMock = (appAuthClient) => { - return { - data: { - id: appAuthClient.id, - name: appAuthClient.name, - active: appAuthClient.active, - }, - meta: { - count: 1, - currentPage: null, - isArray: false, - totalPages: null, - type: 'AppAuthClient', - }, - }; -}; - -export default updateAppAuthClientMock; diff --git a/packages/backend/test/mocks/rest/api/v1/admin/apps/update-oauth-client.js b/packages/backend/test/mocks/rest/api/v1/admin/apps/update-oauth-client.js new file mode 100644 index 00000000..bdb5294d --- /dev/null +++ b/packages/backend/test/mocks/rest/api/v1/admin/apps/update-oauth-client.js @@ -0,0 +1,18 @@ +const updateOAuthClientMock = (oauthClient) => { + return { + data: { + id: oauthClient.id, + name: oauthClient.name, + active: oauthClient.active, + }, + meta: { + count: 1, + currentPage: null, + isArray: false, + totalPages: null, + type: 'OAuthClient', + }, + }; +}; + +export default updateOAuthClientMock; diff --git a/packages/backend/test/mocks/rest/api/v1/apps/create-connection.js b/packages/backend/test/mocks/rest/api/v1/apps/create-connection.js index 2eb1fd7f..ccbeba23 100644 --- a/packages/backend/test/mocks/rest/api/v1/apps/create-connection.js +++ b/packages/backend/test/mocks/rest/api/v1/apps/create-connection.js @@ -2,7 +2,7 @@ const createConnection = (connection) => { const connectionData = { id: connection.id, key: connection.key, - appAuthClientId: connection.appAuthClientId, + oauthClientId: connection.oauthClientId, formattedData: connection.formattedData, verified: connection.verified || false, createdAt: connection.createdAt.getTime(), diff --git a/packages/backend/test/mocks/rest/api/v1/apps/get-auth-client.js b/packages/backend/test/mocks/rest/api/v1/apps/get-auth-client.js deleted file mode 100644 index 4d437eca..00000000 --- a/packages/backend/test/mocks/rest/api/v1/apps/get-auth-client.js +++ /dev/null @@ -1,18 +0,0 @@ -const getAppAuthClientMock = (appAuthClient) => { - return { - data: { - name: appAuthClient.name, - id: appAuthClient.id, - active: appAuthClient.active, - }, - meta: { - count: 1, - currentPage: null, - isArray: false, - totalPages: null, - type: 'AppAuthClient', - }, - }; -}; - -export default getAppAuthClientMock; diff --git a/packages/backend/test/mocks/rest/api/v1/apps/get-auth-clients.js b/packages/backend/test/mocks/rest/api/v1/apps/get-auth-clients.js deleted file mode 100644 index 0a697dec..00000000 --- a/packages/backend/test/mocks/rest/api/v1/apps/get-auth-clients.js +++ /dev/null @@ -1,18 +0,0 @@ -const getAppAuthClientsMock = (appAuthClients) => { - return { - data: appAuthClients.map((appAuthClient) => ({ - name: appAuthClient.name, - id: appAuthClient.id, - active: appAuthClient.active, - })), - meta: { - count: appAuthClients.length, - currentPage: null, - isArray: true, - totalPages: null, - type: 'AppAuthClient', - }, - }; -}; - -export default getAppAuthClientsMock; diff --git a/packages/backend/test/mocks/rest/api/v1/apps/get-connections.js b/packages/backend/test/mocks/rest/api/v1/apps/get-connections.js index bd3bfa4c..d7b9f0e9 100644 --- a/packages/backend/test/mocks/rest/api/v1/apps/get-connections.js +++ b/packages/backend/test/mocks/rest/api/v1/apps/get-connections.js @@ -4,7 +4,7 @@ const getConnectionsMock = (connections) => { id: connection.id, key: connection.key, verified: connection.verified, - appAuthClientId: connection.appAuthClientId, + oauthClientId: connection.oauthClientId, formattedData: { screenName: connection.formattedData.screenName, }, diff --git a/packages/backend/test/mocks/rest/api/v1/apps/get-oauth-client.js b/packages/backend/test/mocks/rest/api/v1/apps/get-oauth-client.js new file mode 100644 index 00000000..1431b968 --- /dev/null +++ b/packages/backend/test/mocks/rest/api/v1/apps/get-oauth-client.js @@ -0,0 +1,18 @@ +const getOAuthClientMock = (oauthClient) => { + return { + data: { + name: oauthClient.name, + id: oauthClient.id, + active: oauthClient.active, + }, + meta: { + count: 1, + currentPage: null, + isArray: false, + totalPages: null, + type: 'OAuthClient', + }, + }; +}; + +export default getOAuthClientMock; diff --git a/packages/backend/test/mocks/rest/api/v1/apps/get-oauth-clients.js b/packages/backend/test/mocks/rest/api/v1/apps/get-oauth-clients.js new file mode 100644 index 00000000..549544b0 --- /dev/null +++ b/packages/backend/test/mocks/rest/api/v1/apps/get-oauth-clients.js @@ -0,0 +1,18 @@ +const getOAuthClientsMock = (oauthClients) => { + return { + data: oauthClients.map((oauthClient) => ({ + name: oauthClient.name, + id: oauthClient.id, + active: oauthClient.active, + })), + meta: { + count: oauthClients.length, + currentPage: null, + isArray: true, + totalPages: null, + type: 'OAuthClient', + }, + }; +}; + +export default getOAuthClientsMock; diff --git a/packages/backend/test/mocks/rest/api/v1/connections/reset-connection.js b/packages/backend/test/mocks/rest/api/v1/connections/reset-connection.js index 0d8131c8..f618a641 100644 --- a/packages/backend/test/mocks/rest/api/v1/connections/reset-connection.js +++ b/packages/backend/test/mocks/rest/api/v1/connections/reset-connection.js @@ -3,7 +3,7 @@ const resetConnectionMock = (connection) => { id: connection.id, key: connection.key, verified: connection.verified, - appAuthClientId: connection.appAuthClientId, + oauthClientId: connection.oauthClientId, formattedData: { screenName: connection.formattedData.screenName, }, diff --git a/packages/backend/test/mocks/rest/api/v1/connections/update-connection.js b/packages/backend/test/mocks/rest/api/v1/connections/update-connection.js index d46b9a0c..306f7726 100644 --- a/packages/backend/test/mocks/rest/api/v1/connections/update-connection.js +++ b/packages/backend/test/mocks/rest/api/v1/connections/update-connection.js @@ -3,7 +3,7 @@ const updateConnectionMock = (connection) => { id: connection.id, key: connection.key, verified: connection.verified, - appAuthClientId: connection.appAuthClientId, + oauthClientId: connection.oauthClientId, formattedData: { screenName: connection.formattedData.screenName, }, diff --git a/packages/backend/test/mocks/rest/api/v1/steps/get-connection.js b/packages/backend/test/mocks/rest/api/v1/steps/get-connection.js index 831a148a..18731302 100644 --- a/packages/backend/test/mocks/rest/api/v1/steps/get-connection.js +++ b/packages/backend/test/mocks/rest/api/v1/steps/get-connection.js @@ -3,7 +3,7 @@ const getConnectionMock = async (connection) => { id: connection.id, key: connection.key, verified: connection.verified, - appAuthClientId: connection.appAuthClientId, + oauthClientId: connection.oauthClientId, formattedData: { screenName: connection.formattedData.screenName, }, diff --git a/packages/e2e-tests/tests/admin/applications.spec.js b/packages/e2e-tests/tests/admin/applications.spec.js index 847adc41..d5bfb4ba 100644 --- a/packages/e2e-tests/tests/admin/applications.spec.js +++ b/packages/e2e-tests/tests/admin/applications.spec.js @@ -4,8 +4,8 @@ const { insertAppConnection } = require('../../helpers/db-helpers'); test.describe('Admin Applications', () => { test.beforeAll(async () => { - const deleteAppAuthClients = { - text: 'DELETE FROM app_auth_clients WHERE app_key in ($1, $2, $3, $4, $5, $6)', + const deleteOAuthClients = { + text: 'DELETE FROM oauth_clients WHERE app_key in ($1, $2, $3, $4, $5, $6)', values: [ 'carbone', 'spotify', @@ -29,10 +29,8 @@ test.describe('Admin Applications', () => { }; try { - const deleteAppAuthClientsResult = await pgPool.query( - deleteAppAuthClients - ); - expect(deleteAppAuthClientsResult.command).toBe('DELETE'); + const deleteOAuthClientsResult = await pgPool.query(deleteOAuthClients); + expect(deleteOAuthClientsResult.command).toBe('DELETE'); const deleteAppConfigsResult = await pgPool.query(deleteAppConfigs); expect(deleteAppConfigsResult.command).toBe('DELETE'); } catch (err) { From 8d5287d51ebe8cae8122967010332b3650e749ac Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Thu, 19 Dec 2024 14:53:47 +0000 Subject: [PATCH 2/3] refactor(web): use oauth client instead of app auth client --- .../src/components/AddAppConnection/index.jsx | 26 +++++------ .../index.jsx | 28 +++++------ .../index.jsx | 12 ++--- .../style.js | 0 .../index.jsx | 34 ++++++++------ .../index.jsx | 46 +++++++++---------- .../AppConnectionContextMenu/index.jsx | 2 +- .../ChooseConnectionSubstep/index.jsx | 32 ++++++------- .../index.ee.jsx | 22 ++++----- packages/web/src/config/urls.js | 20 ++++---- .../web/src/hooks/useAdminAppAuthClient.ee.js | 19 -------- ....ee.js => useAdminCreateOAuthClient.ee.js} | 11 +++-- .../web/src/hooks/useAdminOAuthClient.ee.js | 22 +++++++++ ...AuthClients.js => useAdminOAuthClients.js} | 6 +-- ....ee.js => useAdminUpdateOAuthClient.ee.js} | 12 ++--- .../web/src/hooks/useAuthenticateApp.ee.js | 10 ++-- packages/web/src/hooks/useCreateConnection.js | 4 +- ...seAppAuthClients.js => useOAuthClients.js} | 6 +-- packages/web/src/hooks/useUpdateConnection.js | 4 +- packages/web/src/locales/en.json | 28 +++++------ .../web/src/pages/AdminApplication/index.jsx | 28 +++++------ packages/web/src/pages/Application/index.jsx | 24 +++++----- packages/web/src/propTypes/propTypes.js | 4 +- 23 files changed, 206 insertions(+), 194 deletions(-) rename packages/web/src/components/{AdminApplicationCreateAuthClient => AdminApplicationCreateOAuthClient}/index.jsx (74%) rename packages/web/src/components/{AdminApplicationAuthClientDialog => AdminApplicationOAuthClientDialog}/index.jsx (89%) rename packages/web/src/components/{AdminApplicationAuthClientDialog => AdminApplicationOAuthClientDialog}/style.js (100%) rename packages/web/src/components/{AdminApplicationAuthClients => AdminApplicationOAuthClients}/index.jsx (70%) rename packages/web/src/components/{AdminApplicationUpdateAuthClient => AdminApplicationUpdateOAuthClient}/index.jsx (56%) rename packages/web/src/components/{AppAuthClientsDialog => OAuthClientsDialog}/index.ee.jsx (57%) delete mode 100644 packages/web/src/hooks/useAdminAppAuthClient.ee.js rename packages/web/src/hooks/{useAdminCreateAppAuthClient.ee.js => useAdminCreateOAuthClient.ee.js} (57%) create mode 100644 packages/web/src/hooks/useAdminOAuthClient.ee.js rename packages/web/src/hooks/{useAdminAppAuthClients.js => useAdminOAuthClients.js} (56%) rename packages/web/src/hooks/{useAdminUpdateAppAuthClient.ee.js => useAdminUpdateOAuthClient.ee.js} (57%) rename packages/web/src/hooks/{useAppAuthClients.js => useOAuthClients.js} (58%) diff --git a/packages/web/src/components/AddAppConnection/index.jsx b/packages/web/src/components/AddAppConnection/index.jsx index a074b035..9fef4c77 100644 --- a/packages/web/src/components/AddAppConnection/index.jsx +++ b/packages/web/src/components/AddAppConnection/index.jsx @@ -9,7 +9,7 @@ import * as React from 'react'; import { useNavigate, useSearchParams } from 'react-router-dom'; import { AppPropType } from 'propTypes/propTypes'; -import AppAuthClientsDialog from 'components/AppAuthClientsDialog/index.ee'; +import AppOAuthClientsDialog from 'components/OAuthClientsDialog/index.ee'; import InputCreator from 'components/InputCreator'; import * as URLS from 'config/urls'; import useAuthenticateApp from 'hooks/useAuthenticateApp.ee'; @@ -31,12 +31,12 @@ function AddAppConnection(props) { const [inProgress, setInProgress] = React.useState(false); const hasConnection = Boolean(connectionId); const useShared = searchParams.get('shared') === 'true'; - const appAuthClientId = searchParams.get('appAuthClientId') || undefined; + const oauthClientId = searchParams.get('oauthClientId') || undefined; const { authenticate } = useAuthenticateApp({ appKey: key, connectionId, - appAuthClientId, - useShared: !!appAuthClientId, + oauthClientId, + useShared: !!oauthClientId, }); const queryClient = useQueryClient(); @@ -52,8 +52,8 @@ function AddAppConnection(props) { }, []); React.useEffect( - function initiateSharedAuthenticationForGivenAuthClient() { - if (!appAuthClientId) return; + function initiateSharedAuthenticationForGivenOAuthClient() { + if (!oauthClientId) return; if (!authenticate) return; @@ -64,13 +64,13 @@ function AddAppConnection(props) { asyncAuthenticate(); }, - [appAuthClientId, authenticate, key, navigate], + [oauthClientId, authenticate, key, navigate], ); - const handleClientClick = (appAuthClientId) => - navigate(URLS.APP_ADD_CONNECTION_WITH_AUTH_CLIENT_ID(key, appAuthClientId)); + const handleClientClick = (oauthClientId) => + navigate(URLS.APP_ADD_CONNECTION_WITH_OAUTH_CLIENT_ID(key, oauthClientId)); - const handleAuthClientsDialogClose = () => + const handleOAuthClientsDialogClose = () => navigate(URLS.APP_CONNECTIONS(key)); const submitHandler = React.useCallback( @@ -104,14 +104,14 @@ function AddAppConnection(props) { if (useShared) return ( - ); - if (appAuthClientId) return ; + if (oauthClientId) return ; return ( { let appConfigKey = appConfig?.data?.key; @@ -43,7 +43,7 @@ function AdminApplicationCreateAuthClient(props) { const { name, active, ...formattedAuthDefaults } = values; - await createAppAuthClient({ + await createOAuthClient({ appKey, name, active, @@ -81,23 +81,23 @@ function AdminApplicationCreateAuthClient(props) { ); return ( - ); } -AdminApplicationCreateAuthClient.propTypes = { +AdminApplicationCreateOAuthClient.propTypes = { appKey: PropTypes.string.isRequired, application: AppPropType.isRequired, onClose: PropTypes.func.isRequired, }; -export default AdminApplicationCreateAuthClient; +export default AdminApplicationCreateOAuthClient; diff --git a/packages/web/src/components/AdminApplicationAuthClientDialog/index.jsx b/packages/web/src/components/AdminApplicationOAuthClientDialog/index.jsx similarity index 89% rename from packages/web/src/components/AdminApplicationAuthClientDialog/index.jsx rename to packages/web/src/components/AdminApplicationOAuthClientDialog/index.jsx index 6c328c11..9bb38959 100644 --- a/packages/web/src/components/AdminApplicationAuthClientDialog/index.jsx +++ b/packages/web/src/components/AdminApplicationOAuthClientDialog/index.jsx @@ -15,7 +15,7 @@ import Switch from 'components/Switch'; import TextField from 'components/TextField'; import { Form } from './style'; -function AdminApplicationAuthClientDialog(props) { +function AdminApplicationOAuthClientDialog(props) { const { error, onClose, @@ -52,12 +52,12 @@ function AdminApplicationAuthClientDialog(props) { <> {authFields?.map((field) => ( @@ -72,7 +72,7 @@ function AdminApplicationAuthClientDialog(props) { loading={submitting} disabled={disabled || !isDirty} > - {formatMessage('authClient.buttonSubmit')} + {formatMessage('oauthClient.buttonSubmit')} )} @@ -84,7 +84,7 @@ function AdminApplicationAuthClientDialog(props) { ); } -AdminApplicationAuthClientDialog.propTypes = { +AdminApplicationOAuthClientDialog.propTypes = { error: PropTypes.shape({ message: PropTypes.string, }), @@ -98,4 +98,4 @@ AdminApplicationAuthClientDialog.propTypes = { disabled: PropTypes.bool, }; -export default AdminApplicationAuthClientDialog; +export default AdminApplicationOAuthClientDialog; diff --git a/packages/web/src/components/AdminApplicationAuthClientDialog/style.js b/packages/web/src/components/AdminApplicationOAuthClientDialog/style.js similarity index 100% rename from packages/web/src/components/AdminApplicationAuthClientDialog/style.js rename to packages/web/src/components/AdminApplicationOAuthClientDialog/style.js diff --git a/packages/web/src/components/AdminApplicationAuthClients/index.jsx b/packages/web/src/components/AdminApplicationOAuthClients/index.jsx similarity index 70% rename from packages/web/src/components/AdminApplicationAuthClients/index.jsx rename to packages/web/src/components/AdminApplicationOAuthClients/index.jsx index f39bc384..ae41e8ab 100644 --- a/packages/web/src/components/AdminApplicationAuthClients/index.jsx +++ b/packages/web/src/components/AdminApplicationOAuthClients/index.jsx @@ -8,29 +8,30 @@ import CardContent from '@mui/material/CardContent'; import Typography from '@mui/material/Typography'; import Chip from '@mui/material/Chip'; import Button from '@mui/material/Button'; + +import NoResultFound from 'components/NoResultFound'; import * as URLS from 'config/urls'; import useFormatMessage from 'hooks/useFormatMessage'; -import useAdminAppAuthClients from 'hooks/useAdminAppAuthClients'; -import NoResultFound from 'components/NoResultFound'; +import useAdminOAuthClients from 'hooks/useAdminOAuthClients'; -function AdminApplicationAuthClients(props) { +function AdminApplicationOAuthClients(props) { const { appKey } = props; const formatMessage = useFormatMessage(); - const { data: appAuthClients, isLoading } = useAdminAppAuthClients(appKey); + const { data: appOAuthClients, isLoading } = useAdminOAuthClients(appKey); if (isLoading) return ; - if (!appAuthClients?.data.length) { + if (!appOAuthClients?.data.length) { return ( ); } - const sortedAuthClients = appAuthClients.data.slice().sort((a, b) => { + const sortedOAuthClients = appOAuthClients.data.slice().sort((a, b) => { if (a.id < b.id) { return -1; } @@ -42,7 +43,7 @@ function AdminApplicationAuthClients(props) { return (
- {sortedAuthClients.map((client) => ( + {sortedOAuthClients.map((client) => ( @@ -70,8 +71,13 @@ function AdminApplicationAuthClients(props) { ))} - @@ -79,8 +85,8 @@ function AdminApplicationAuthClients(props) { ); } -AdminApplicationAuthClients.propTypes = { +AdminApplicationOAuthClients.propTypes = { appKey: PropTypes.string.isRequired, }; -export default AdminApplicationAuthClients; +export default AdminApplicationOAuthClients; diff --git a/packages/web/src/components/AdminApplicationUpdateAuthClient/index.jsx b/packages/web/src/components/AdminApplicationUpdateOAuthClient/index.jsx similarity index 56% rename from packages/web/src/components/AdminApplicationUpdateAuthClient/index.jsx rename to packages/web/src/components/AdminApplicationUpdateOAuthClient/index.jsx index 0dc3d795..18389bed 100644 --- a/packages/web/src/components/AdminApplicationUpdateAuthClient/index.jsx +++ b/packages/web/src/components/AdminApplicationUpdateOAuthClient/index.jsx @@ -4,26 +4,26 @@ import { useParams } from 'react-router-dom'; import { AppPropType } from 'propTypes/propTypes'; import useFormatMessage from 'hooks/useFormatMessage'; -import AdminApplicationAuthClientDialog from 'components/AdminApplicationAuthClientDialog'; -import useAdminAppAuthClient from 'hooks/useAdminAppAuthClient.ee'; -import useAdminUpdateAppAuthClient from 'hooks/useAdminUpdateAppAuthClient.ee'; +import AdminApplicationOAuthClientDialog from 'components/AdminApplicationOAuthClientDialog'; +import useAdminOAuthClient from 'hooks/useAdminOAuthClient.ee'; +import useAdminUpdateOAuthClient from 'hooks/useAdminUpdateOAuthClient.ee'; import useAppAuth from 'hooks/useAppAuth'; -function AdminApplicationUpdateAuthClient(props) { +function AdminApplicationUpdateOAuthClient(props) { const { application, onClose } = props; const formatMessage = useFormatMessage(); const { clientId } = useParams(); - const { data: adminAppAuthClient, isLoading: isAdminAuthClientLoading } = - useAdminAppAuthClient(application.key, clientId); + const { data: adminOAuthClient, isLoading: isAdminOAuthClientLoading } = + useAdminOAuthClient(application.key, clientId); const { data: auth } = useAppAuth(application.key); const { - mutateAsync: updateAppAuthClient, - isPending: isUpdateAppAuthClientPending, - error: updateAppAuthClientError, - } = useAdminUpdateAppAuthClient(application.key, clientId); + mutateAsync: updateOAuthClient, + isPending: isUpdateOAuthClientPending, + error: updateOAuthClientError, + } = useAdminUpdateOAuthClient(application.key, clientId); const authFields = auth?.data?.fields?.map((field) => ({ ...field, @@ -31,13 +31,13 @@ function AdminApplicationUpdateAuthClient(props) { })); const submitHandler = async (values) => { - if (!adminAppAuthClient) { + if (!adminOAuthClient) { return; } const { name, active, ...formattedAuthDefaults } = values; - await updateAppAuthClient({ + await updateOAuthClient({ name, active, formattedAuthDefaults, @@ -64,31 +64,31 @@ function AdminApplicationUpdateAuthClient(props) { const defaultValues = useMemo( () => ({ - name: adminAppAuthClient?.data?.name || '', - active: adminAppAuthClient?.data?.active || false, + name: adminOAuthClient?.data?.name || '', + active: adminOAuthClient?.data?.active || false, ...getAuthFieldsDefaultValues(), }), - [adminAppAuthClient, getAuthFieldsDefaultValues], + [adminOAuthClient, getAuthFieldsDefaultValues], ); return ( - ); } -AdminApplicationUpdateAuthClient.propTypes = { +AdminApplicationUpdateOAuthClient.propTypes = { application: AppPropType.isRequired, onClose: PropTypes.func.isRequired, }; -export default AdminApplicationUpdateAuthClient; +export default AdminApplicationUpdateOAuthClient; diff --git a/packages/web/src/components/AppConnectionContextMenu/index.jsx b/packages/web/src/components/AppConnectionContextMenu/index.jsx index f17fb860..8e7eb318 100644 --- a/packages/web/src/components/AppConnectionContextMenu/index.jsx +++ b/packages/web/src/components/AppConnectionContextMenu/index.jsx @@ -70,7 +70,7 @@ function ContextMenu(props) { to={URLS.APP_RECONNECT_CONNECTION( appKey, connection.id, - connection.appAuthClientId, + connection.oauthClientId, )} onClick={createActionHandler({ type: 'reconnect' })} > diff --git a/packages/web/src/components/ChooseConnectionSubstep/index.jsx b/packages/web/src/components/ChooseConnectionSubstep/index.jsx index 0c6ef5c8..2f5df9ee 100644 --- a/packages/web/src/components/ChooseConnectionSubstep/index.jsx +++ b/packages/web/src/components/ChooseConnectionSubstep/index.jsx @@ -7,7 +7,7 @@ import TextField from '@mui/material/TextField'; import * as React from 'react'; import AddAppConnection from 'components/AddAppConnection'; -import AppAuthClientsDialog from 'components/AppAuthClientsDialog/index.ee'; +import AppOAuthClientsDialog from 'components/OAuthClientsDialog/index.ee'; import FlowSubstepTitle from 'components/FlowSubstepTitle'; import useAppConfig from 'hooks/useAppConfig.ee'; import { EditorContext } from 'contexts/Editor'; @@ -22,7 +22,7 @@ import useStepConnection from 'hooks/useStepConnection'; import { useQueryClient } from '@tanstack/react-query'; import useAppConnections from 'hooks/useAppConnections'; import useTestConnection from 'hooks/useTestConnection'; -import useAppAuthClients from 'hooks/useAppAuthClients'; +import useOAuthClients from 'hooks/useOAuthClients'; const ADD_CONNECTION_VALUE = 'ADD_CONNECTION'; const ADD_SHARED_CONNECTION_VALUE = 'ADD_SHARED_CONNECTION'; @@ -54,7 +54,7 @@ function ChooseConnectionSubstep(props) { const [showAddSharedConnectionDialog, setShowAddSharedConnectionDialog] = React.useState(false); const queryClient = useQueryClient(); - const { data: appAuthClients } = useAppAuthClients(application.key); + const { data: appOAuthClients } = useOAuthClients(application.key); const { authenticate } = useAuthenticateApp({ appKey: application.key, @@ -100,9 +100,9 @@ function ChooseConnectionSubstep(props) { value: ADD_CONNECTION_VALUE, }; - const addConnectionWithAuthClient = { + const addConnectionWithOAuthClient = { label: formatMessage( - 'chooseConnectionSubstep.addConnectionWithAuthClient', + 'chooseConnectionSubstep.addConnectionWithOAuthClient', ), value: ADD_SHARED_CONNECTION_VALUE, }; @@ -115,33 +115,33 @@ function ChooseConnectionSubstep(props) { // app is disabled. if (appConfig.data.disabled) return options; - // means only auth clients are allowed for connection creation and there is app auth client + // means only OAuth clients are allowed for connection creation and there is OAuth client if ( appConfig.data.useOnlyPredefinedAuthClients === true && - appAuthClients.data.length > 0 + appOAuthClients.data.length > 0 ) { - return options.concat([addConnectionWithAuthClient]); + return options.concat([addConnectionWithOAuthClient]); } - // means there is no app auth client. so we don't show the `addConnectionWithAuthClient` + // means there is no OAuth client. so we don't show the `addConnectionWithOAuthClient` if ( appConfig.data.useOnlyPredefinedAuthClients === true && - appAuthClients.data.length === 0 + appOAuthClients.data.length === 0 ) { return options; } - if (appAuthClients.data.length === 0) { + if (appOAuthClients.data.length === 0) { return options.concat([addCustomConnection]); } - return options.concat([addCustomConnection, addConnectionWithAuthClient]); - }, [data, formatMessage, appConfig, appAuthClients]); + return options.concat([addCustomConnection, addConnectionWithOAuthClient]); + }, [data, formatMessage, appConfig, appOAuthClients]); - const handleClientClick = async (appAuthClientId) => { + const handleClientClick = async (oauthClientId) => { try { const response = await authenticate?.({ - appAuthClientId, + oauthClientId, }); const connectionId = response?.createConnection.id; @@ -292,7 +292,7 @@ function ChooseConnectionSubstep(props) { )} {application && showAddSharedConnectionDialog && ( - setShowAddSharedConnectionDialog(false)} onClientClick={handleClientClick} diff --git a/packages/web/src/components/AppAuthClientsDialog/index.ee.jsx b/packages/web/src/components/OAuthClientsDialog/index.ee.jsx similarity index 57% rename from packages/web/src/components/AppAuthClientsDialog/index.ee.jsx rename to packages/web/src/components/OAuthClientsDialog/index.ee.jsx index eea6674b..c8e204cb 100644 --- a/packages/web/src/components/AppAuthClientsDialog/index.ee.jsx +++ b/packages/web/src/components/OAuthClientsDialog/index.ee.jsx @@ -6,26 +6,26 @@ import ListItem from '@mui/material/ListItem'; import ListItemButton from '@mui/material/ListItemButton'; import ListItemText from '@mui/material/ListItemText'; import * as React from 'react'; -import useAppAuthClients from 'hooks/useAppAuthClients'; +import useOAuthClients from 'hooks/useOAuthClients'; import useFormatMessage from 'hooks/useFormatMessage'; -function AppAuthClientsDialog(props) { +function AppOAuthClientsDialog(props) { const { appKey, onClientClick, onClose } = props; - const { data: appAuthClients } = useAppAuthClients(appKey); + const { data: appOAuthClients } = useOAuthClients(appKey); const formatMessage = useFormatMessage(); - if (!appAuthClients?.data.length) return ; + if (!appOAuthClients?.data.length) return ; return ( - {formatMessage('appAuthClientsDialog.title')} + {formatMessage('appOAuthClientsDialog.title')} - {appAuthClients.data.map((appAuthClient) => ( - - onClientClick(appAuthClient.id)}> - + {appOAuthClients.data.map((oauthClient) => ( + + onClientClick(oauthClient.id)}> + ))} @@ -34,10 +34,10 @@ function AppAuthClientsDialog(props) { ); } -AppAuthClientsDialog.propTypes = { +AppOAuthClientsDialog.propTypes = { appKey: PropTypes.string.isRequired, onClientClick: PropTypes.func.isRequired, onClose: PropTypes.func.isRequired, }; -export default AppAuthClientsDialog; +export default AppOAuthClientsDialog; diff --git a/packages/web/src/config/urls.js b/packages/web/src/config/urls.js index db0c50d2..820d721c 100644 --- a/packages/web/src/config/urls.js +++ b/packages/web/src/config/urls.js @@ -17,19 +17,19 @@ export const APP_CONNECTIONS = (appKey) => `/app/${appKey}/connections`; export const APP_CONNECTIONS_PATTERN = '/app/:appKey/connections'; export const APP_ADD_CONNECTION = (appKey, shared = false) => `/app/${appKey}/connections/add?shared=${shared}`; -export const APP_ADD_CONNECTION_WITH_AUTH_CLIENT_ID = ( +export const APP_ADD_CONNECTION_WITH_OAUTH_CLIENT_ID = ( appKey, - appAuthClientId, -) => `/app/${appKey}/connections/add?appAuthClientId=${appAuthClientId}`; + oauthClientId, +) => `/app/${appKey}/connections/add?oauthClientId=${oauthClientId}`; export const APP_ADD_CONNECTION_PATTERN = '/app/:appKey/connections/add'; export const APP_RECONNECT_CONNECTION = ( appKey, connectionId, - appAuthClientId, + oauthClientId, ) => { const path = `/app/${appKey}/connections/${connectionId}/reconnect`; - if (appAuthClientId) { - return `${path}?appAuthClientId=${appAuthClientId}`; + if (oauthClientId) { + return `${path}?oauthClientId=${oauthClientId}`; } return path; }; @@ -71,18 +71,18 @@ export const ADMIN_APPS = `${ADMIN_SETTINGS}/apps`; export const ADMIN_APP = (appKey) => `${ADMIN_SETTINGS}/apps/${appKey}`; export const ADMIN_APP_PATTERN = `${ADMIN_SETTINGS}/apps/:appKey`; export const ADMIN_APP_SETTINGS_PATTERN = `${ADMIN_SETTINGS}/apps/:appKey/settings`; -export const ADMIN_APP_AUTH_CLIENTS_PATTERN = `${ADMIN_SETTINGS}/apps/:appKey/auth-clients`; +export const ADMIN_APP_AUTH_CLIENTS_PATTERN = `${ADMIN_SETTINGS}/apps/:appKey/oauth-clients`; export const ADMIN_APP_CONNECTIONS_PATTERN = `${ADMIN_SETTINGS}/apps/:appKey/connections`; export const ADMIN_APP_CONNECTIONS = (appKey) => `${ADMIN_SETTINGS}/apps/${appKey}/connections`; export const ADMIN_APP_SETTINGS = (appKey) => `${ADMIN_SETTINGS}/apps/${appKey}/settings`; export const ADMIN_APP_AUTH_CLIENTS = (appKey) => - `${ADMIN_SETTINGS}/apps/${appKey}/auth-clients`; + `${ADMIN_SETTINGS}/apps/${appKey}/oauth-clients`; export const ADMIN_APP_AUTH_CLIENT = (appKey, id) => - `${ADMIN_SETTINGS}/apps/${appKey}/auth-clients/${id}`; + `${ADMIN_SETTINGS}/apps/${appKey}/oauth-clients/${id}`; export const ADMIN_APP_AUTH_CLIENTS_CREATE = (appKey) => - `${ADMIN_SETTINGS}/apps/${appKey}/auth-clients/create`; + `${ADMIN_SETTINGS}/apps/${appKey}/oauth-clients/create`; export const DASHBOARD = FLOWS; // External links and paths diff --git a/packages/web/src/hooks/useAdminAppAuthClient.ee.js b/packages/web/src/hooks/useAdminAppAuthClient.ee.js deleted file mode 100644 index 694ba03b..00000000 --- a/packages/web/src/hooks/useAdminAppAuthClient.ee.js +++ /dev/null @@ -1,19 +0,0 @@ -import { useQuery } from '@tanstack/react-query'; - -import api from 'helpers/api'; - -export default function useAdminAppAuthClient(appKey, id) { - const query = useQuery({ - queryKey: ['admin', 'apps', appKey, 'authClients', id], - queryFn: async ({ signal }) => { - const { data } = await api.get(`/v1/admin/apps/${appKey}/auth-clients/${id}`, { - signal, - }); - - return data; - }, - enabled: !!appKey && !!id, - }); - - return query; -} diff --git a/packages/web/src/hooks/useAdminCreateAppAuthClient.ee.js b/packages/web/src/hooks/useAdminCreateOAuthClient.ee.js similarity index 57% rename from packages/web/src/hooks/useAdminCreateAppAuthClient.ee.js rename to packages/web/src/hooks/useAdminCreateOAuthClient.ee.js index 37a39045..4c0e9e80 100644 --- a/packages/web/src/hooks/useAdminCreateAppAuthClient.ee.js +++ b/packages/web/src/hooks/useAdminCreateOAuthClient.ee.js @@ -1,20 +1,23 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; import api from 'helpers/api'; -export default function useAdminCreateAppAuthClient(appKey) { +export default function useAdminCreateOAuthClient(appKey) { const queryClient = useQueryClient(); const query = useMutation({ mutationFn: async (payload) => { - const { data } = await api.post(`/v1/admin/apps/${appKey}/auth-clients`, payload); + const { data } = await api.post( + `/v1/admin/apps/${appKey}/oauth-clients`, + payload, + ); return data; }, onSuccess: () => { queryClient.invalidateQueries({ - queryKey: ['admin', 'apps', appKey, 'authClients'], + queryKey: ['admin', 'apps', appKey, 'oauthClients'], }); - } + }, }); return query; diff --git a/packages/web/src/hooks/useAdminOAuthClient.ee.js b/packages/web/src/hooks/useAdminOAuthClient.ee.js new file mode 100644 index 00000000..a4482f5a --- /dev/null +++ b/packages/web/src/hooks/useAdminOAuthClient.ee.js @@ -0,0 +1,22 @@ +import { useQuery } from '@tanstack/react-query'; + +import api from 'helpers/api'; + +export default function useAdminOAuthClient(appKey, id) { + const query = useQuery({ + queryKey: ['admin', 'apps', appKey, 'oauthClients', id], + queryFn: async ({ signal }) => { + const { data } = await api.get( + `/v1/admin/apps/${appKey}/oauth-clients/${id}`, + { + signal, + }, + ); + + return data; + }, + enabled: !!appKey && !!id, + }); + + return query; +} diff --git a/packages/web/src/hooks/useAdminAppAuthClients.js b/packages/web/src/hooks/useAdminOAuthClients.js similarity index 56% rename from packages/web/src/hooks/useAdminAppAuthClients.js rename to packages/web/src/hooks/useAdminOAuthClients.js index a4bc4bc8..d942a18d 100644 --- a/packages/web/src/hooks/useAdminAppAuthClients.js +++ b/packages/web/src/hooks/useAdminOAuthClients.js @@ -1,11 +1,11 @@ import { useQuery } from '@tanstack/react-query'; import api from 'helpers/api'; -export default function useAdminAppAuthClients(appKey) { +export default function useAdminOAuthClients(appKey) { const query = useQuery({ - queryKey: ['admin', 'apps', appKey, 'authClients'], + queryKey: ['admin', 'apps', appKey, 'oauthClients'], queryFn: async ({ signal }) => { - const { data } = await api.get(`/v1/admin/apps/${appKey}/auth-clients`, { + const { data } = await api.get(`/v1/admin/apps/${appKey}/oauth-clients`, { signal, }); return data; diff --git a/packages/web/src/hooks/useAdminUpdateAppAuthClient.ee.js b/packages/web/src/hooks/useAdminUpdateOAuthClient.ee.js similarity index 57% rename from packages/web/src/hooks/useAdminUpdateAppAuthClient.ee.js rename to packages/web/src/hooks/useAdminUpdateOAuthClient.ee.js index a1aa078e..bc397eb8 100644 --- a/packages/web/src/hooks/useAdminUpdateAppAuthClient.ee.js +++ b/packages/web/src/hooks/useAdminUpdateOAuthClient.ee.js @@ -1,13 +1,13 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; import api from 'helpers/api'; -export default function useAdminUpdateAppAuthClient(appKey, id) { +export default function useAdminUpdateOAuthClient(appKey, id) { const queryClient = useQueryClient(); - const query = useMutation({ + const mutation = useMutation({ mutationFn: async (payload) => { const { data } = await api.patch( - `/v1/admin/apps/${appKey}/auth-clients/${id}`, + `/v1/admin/apps/${appKey}/oauth-clients/${id}`, payload, ); @@ -15,14 +15,14 @@ export default function useAdminUpdateAppAuthClient(appKey, id) { }, onSuccess: () => { queryClient.invalidateQueries({ - queryKey: ['admin', 'apps', appKey, 'authClients', id], + queryKey: ['admin', 'apps', appKey, 'oauthClients', id], }); queryClient.invalidateQueries({ - queryKey: ['admin', 'apps', appKey, 'authClients'], + queryKey: ['admin', 'apps', appKey, 'oauthClients'], }); }, }); - return query; + return mutation; } diff --git a/packages/web/src/hooks/useAuthenticateApp.ee.js b/packages/web/src/hooks/useAuthenticateApp.ee.js index 45c17bfb..061b8e88 100644 --- a/packages/web/src/hooks/useAuthenticateApp.ee.js +++ b/packages/web/src/hooks/useAuthenticateApp.ee.js @@ -31,7 +31,7 @@ function getSteps(auth, hasConnection, useShared) { } export default function useAuthenticateApp(payload) { - const { appKey, appAuthClientId, connectionId, useShared = false } = payload; + const { appKey, oauthClientId, connectionId, useShared = false } = payload; const { data: auth } = useAppAuth(appKey); const queryClient = useQueryClient(); const { mutateAsync: createConnection } = useCreateConnection(appKey); @@ -55,7 +55,7 @@ export default function useAuthenticateApp(payload) { const response = { key: appKey, - appAuthClientId: appAuthClientId || payload.appAuthClientId, + oauthClientId: oauthClientId || payload.oauthClientId, connectionId, fields, }; @@ -133,7 +133,7 @@ export default function useAuthenticateApp(payload) { }, [ steps, appKey, - appAuthClientId, + oauthClientId, connectionId, queryClient, createConnection, @@ -147,7 +147,7 @@ export default function useAuthenticateApp(payload) { [ steps, appKey, - appAuthClientId, + oauthClientId, connectionId, queryClient, createConnection, @@ -156,7 +156,7 @@ export default function useAuthenticateApp(payload) { resetConnection, verifyConnection, ], - 'steps, appKey, appAuthClientId, connectionId, queryClient, createConnection, createConnectionAuthUrl, updateConnection, resetConnection, verifyConnection', + 'steps, appKey, oauthClientId, connectionId, queryClient, createConnection, createConnectionAuthUrl, updateConnection, resetConnection, verifyConnection', '', 'useAuthenticate', ); diff --git a/packages/web/src/hooks/useCreateConnection.js b/packages/web/src/hooks/useCreateConnection.js index 7615ab6d..9c09f8b6 100644 --- a/packages/web/src/hooks/useCreateConnection.js +++ b/packages/web/src/hooks/useCreateConnection.js @@ -4,9 +4,9 @@ import api from 'helpers/api'; export default function useCreateConnection(appKey) { const mutation = useMutation({ - mutationFn: async ({ appAuthClientId, formattedData }) => { + mutationFn: async ({ oauthClientId, formattedData }) => { const { data } = await api.post(`/v1/apps/${appKey}/connections`, { - appAuthClientId, + oauthClientId, formattedData, }); diff --git a/packages/web/src/hooks/useAppAuthClients.js b/packages/web/src/hooks/useOAuthClients.js similarity index 58% rename from packages/web/src/hooks/useAppAuthClients.js rename to packages/web/src/hooks/useOAuthClients.js index 1524c3ac..057fb481 100644 --- a/packages/web/src/hooks/useAppAuthClients.js +++ b/packages/web/src/hooks/useOAuthClients.js @@ -1,11 +1,11 @@ import { useQuery } from '@tanstack/react-query'; import api from 'helpers/api'; -export default function useAppAuthClients(appKey) { +export default function useOAuthClients(appKey) { const query = useQuery({ - queryKey: ['apps', appKey, 'auth-clients'], + queryKey: ['apps', appKey, 'oauth-clients'], queryFn: async ({ signal }) => { - const { data } = await api.get(`/v1/apps/${appKey}/auth-clients`, { + const { data } = await api.get(`/v1/apps/${appKey}/oauth-clients`, { signal, }); return data; diff --git a/packages/web/src/hooks/useUpdateConnection.js b/packages/web/src/hooks/useUpdateConnection.js index 37d87bc4..c48147ff 100644 --- a/packages/web/src/hooks/useUpdateConnection.js +++ b/packages/web/src/hooks/useUpdateConnection.js @@ -4,10 +4,10 @@ import api from 'helpers/api'; export default function useUpdateConnection() { const query = useMutation({ - mutationFn: async ({ connectionId, formattedData, appAuthClientId }) => { + mutationFn: async ({ connectionId, formattedData, oauthClientId }) => { const { data } = await api.patch(`/v1/connections/${connectionId}`, { formattedData, - appAuthClientId, + oauthClientId, }); return data; diff --git a/packages/web/src/locales/en.json b/packages/web/src/locales/en.json index 40073d61..a4c0dd2b 100644 --- a/packages/web/src/locales/en.json +++ b/packages/web/src/locales/en.json @@ -22,7 +22,7 @@ "app.connectionCount": "{count} connections", "app.flowCount": "{count} flows", "app.addConnection": "Add connection", - "app.addConnectionWithAuthClient": "Add connection with auth client", + "app.addConnectionWithOAuthClient": "Add connection with OAuth client", "app.reconnectConnection": "Reconnect connection", "app.createFlow": "Create flow", "app.settings": "Settings", @@ -74,7 +74,7 @@ "filterConditions.orContinueIf": "OR continue if…", "chooseConnectionSubstep.continue": "Continue", "chooseConnectionSubstep.addNewConnection": "Add new connection", - "chooseConnectionSubstep.addConnectionWithAuthClient": "Add connection with auth client", + "chooseConnectionSubstep.addConnectionWithOAuthClient": "Add connection with OAuth client", "chooseConnectionSubstep.chooseConnection": "Choose connection", "flow.createdAt": "created {datetime}", "flow.updatedAt": "updated {datetime}", @@ -258,7 +258,7 @@ "permissionSettings.cancel": "Cancel", "permissionSettings.apply": "Apply", "permissionSettings.title": "Conditions", - "appAuthClientsDialog.title": "Choose your authentication client", + "appOAuthClientsDialog.title": "Choose your authentication client", "userInterfacePage.title": "User Interface", "userInterfacePage.successfullyUpdated": "User interface has been updated.", "userInterfacePage.titleFieldLabel": "Title", @@ -290,22 +290,22 @@ "roleMappingsForm.successfullySaved": "Role mappings have been saved.", "adminApps.title": "Apps", "adminApps.connections": "Connections", - "adminApps.authClients": "Auth clients", + "adminApps.oauthClients": "OAuth clients", "adminApps.settings": "Settings", - "adminAppsSettings.useOnlyPredefinedAuthClients": "Use only predefined auth clients", + "adminAppsSettings.useOnlyPredefinedAuthClients": "Use only predefined OAuth clients", "adminAppsSettings.shared": "Shared", "adminAppsSettings.disabled": "Disabled", "adminAppsSettings.save": "Save", "adminAppsSettings.successfullySaved": "Settings have been saved.", - "adminAppsAuthClients.noAuthClients": "You don't have any auth clients yet.", - "adminAppsAuthClients.statusActive": "Active", - "adminAppsAuthClients.statusInactive": "Inactive", - "createAuthClient.button": "Create auth client", - "createAuthClient.title": "Create auth client", - "authClient.buttonSubmit": "Submit", - "authClient.inputName": "Name", - "authClient.inputActive": "Active", - "updateAuthClient.title": "Update auth client", + "adminAppsOAuthClients.noOauthClients": "You don't have any OAuth clients yet.", + "adminAppsOAuthClients.statusActive": "Active", + "adminAppsOAuthClients.statusInactive": "Inactive", + "createOAuthClient.button": "Create OAuth client", + "createOAuthClient.title": "Create OAuth client", + "oauthClient.buttonSubmit": "Submit", + "oauthClient.inputName": "Name", + "oauthClient.inputActive": "Active", + "updateOAuthClient.title": "Update OAuth client", "notFoundPage.title": "We can't seem to find a page you're looking for.", "notFoundPage.button": "Back to home page" } diff --git a/packages/web/src/pages/AdminApplication/index.jsx b/packages/web/src/pages/AdminApplication/index.jsx index 85e15bba..a7e24de3 100644 --- a/packages/web/src/pages/AdminApplication/index.jsx +++ b/packages/web/src/pages/AdminApplication/index.jsx @@ -21,9 +21,9 @@ import AppIcon from 'components/AppIcon'; import Container from 'components/Container'; import PageTitle from 'components/PageTitle'; import AdminApplicationSettings from 'components/AdminApplicationSettings'; -import AdminApplicationAuthClients from 'components/AdminApplicationAuthClients'; -import AdminApplicationCreateAuthClient from 'components/AdminApplicationCreateAuthClient'; -import AdminApplicationUpdateAuthClient from 'components/AdminApplicationUpdateAuthClient'; +import AdminApplicationOAuthClients from 'components/AdminApplicationOAuthClients'; +import AdminApplicationCreateOAuthClient from 'components/AdminApplicationCreateOAuthClient'; +import AdminApplicationUpdateOAuthClient from 'components/AdminApplicationUpdateOAuthClient'; import useApp from 'hooks/useApp'; export default function AdminApplication() { @@ -39,7 +39,7 @@ export default function AdminApplication() { path: URLS.ADMIN_APP_SETTINGS_PATTERN, end: false, }); - const authClientsPathMatch = useMatch({ + const oauthClientsPathMatch = useMatch({ path: URLS.ADMIN_APP_AUTH_CLIENTS_PATTERN, end: false, }); @@ -49,7 +49,7 @@ export default function AdminApplication() { const app = data?.data || {}; - const goToAuthClientsPage = () => navigate('auth-clients'); + const goToAuthClientsPage = () => navigate('oauth-clients'); if (loading) return null; @@ -77,7 +77,7 @@ export default function AdminApplication() { value={ settingsPathMatch?.pattern?.path || connectionsPathMatch?.pattern?.path || - authClientsPathMatch?.pattern?.path + oauthClientsPathMatch?.pattern?.path } > } /> } + path={`/oauth-clients/*`} + element={} /> diff --git a/packages/web/src/pages/Application/index.jsx b/packages/web/src/pages/Application/index.jsx index 73528b3e..0ba6ab62 100644 --- a/packages/web/src/pages/Application/index.jsx +++ b/packages/web/src/pages/Application/index.jsx @@ -30,7 +30,7 @@ import AppIcon from 'components/AppIcon'; import Container from 'components/Container'; import PageTitle from 'components/PageTitle'; import useApp from 'hooks/useApp'; -import useAppAuthClients from 'hooks/useAppAuthClients'; +import useOAuthClients from 'hooks/useOAuthClients'; import Can from 'components/Can'; import { AppPropType } from 'propTypes/propTypes'; @@ -63,7 +63,7 @@ export default function Application() { const flowsPathMatch = useMatch({ path: URLS.APP_FLOWS_PATTERN, end: false }); const { appKey } = useParams(); const navigate = useNavigate(); - const { data: appAuthClients } = useAppAuthClients(appKey); + const { data: appOAuthClients } = useOAuthClients(appKey); const { data, loading } = useApp(appKey); const app = data?.data || {}; @@ -86,14 +86,14 @@ export default function Application() { appConfig?.data?.disabled === true, }; - const addConnectionWithAuthClient = { - label: formatMessage('app.addConnectionWithAuthClient'), - key: 'addConnectionWithAuthClient', + const addConnectionWithOAuthClient = { + label: formatMessage('app.addConnectionWithOAuthClient'), + key: 'addConnectionWithOAuthClient', 'data-test': 'add-connection-with-auth-client-button', to: URLS.APP_ADD_CONNECTION(appKey, true), disabled: !currentUserAbility.can('create', 'Connection') || - appAuthClients?.data?.length === 0 || + appOAuthClients?.data?.length === 0 || appConfig?.data?.disabled === true, }; @@ -102,18 +102,18 @@ export default function Application() { return [addCustomConnection]; } - // means only auth clients are allowed for connection creation + // means only OAuth clients are allowed for connection creation if (appConfig?.data?.useOnlyPredefinedAuthClients === true) { - return [addConnectionWithAuthClient]; + return [addConnectionWithOAuthClient]; } - // means there is no app auth client. so we don't show the `addConnectionWithAuthClient` - if (appAuthClients?.data?.length === 0) { + // means there is no OAuth client. so we don't show the `addConnectionWithOAuthClient` + if (appOAuthClients?.data?.length === 0) { return [addCustomConnection]; } - return [addCustomConnection, addConnectionWithAuthClient]; - }, [appKey, appConfig, appAuthClients, currentUserAbility, formatMessage]); + return [addCustomConnection, addConnectionWithOAuthClient]; + }, [appKey, appConfig, appOAuthClients, currentUserAbility, formatMessage]); if (loading) return null; diff --git a/packages/web/src/propTypes/propTypes.js b/packages/web/src/propTypes/propTypes.js index c92f51a4..bb594912 100644 --- a/packages/web/src/propTypes/propTypes.js +++ b/packages/web/src/propTypes/propTypes.js @@ -211,7 +211,7 @@ export const ConnectionPropType = PropTypes.shape({ flowCount: PropTypes.number, appData: AppPropType, createdAt: PropTypes.number, - appAuthClientId: PropTypes.string, + oauthClientId: PropTypes.string, }); AppPropType.connection = PropTypes.arrayOf(ConnectionPropType); @@ -463,7 +463,7 @@ export const AppConfigPropType = PropTypes.shape({ disabled: PropTypes.bool, }); -export const AppAuthClientPropType = PropTypes.shape({ +export const OAuthClientPropType = PropTypes.shape({ id: PropTypes.string, name: PropTypes.string, appConfigKey: PropTypes.string, From d675fd6e69cad93e495ded363d06fc3760987409 Mon Sep 17 00:00:00 2001 From: "Jakub P." Date: Thu, 19 Dec 2024 20:19:28 +0100 Subject: [PATCH 3/3] test: adapt tests to OAuth client rename --- ...e.js => application-oauth-clients-page.js} | 4 +- packages/e2e-tests/fixtures/admin/index.js | 11 +-- .../tests/admin/applications.spec.js | 82 +++++++++---------- .../e2e-tests/tests/apps/list-apps.spec.js | 2 +- 4 files changed, 50 insertions(+), 49 deletions(-) rename packages/e2e-tests/fixtures/admin/{application-auth-clients-page.js => application-oauth-clients-page.js} (89%) diff --git a/packages/e2e-tests/fixtures/admin/application-auth-clients-page.js b/packages/e2e-tests/fixtures/admin/application-oauth-clients-page.js similarity index 89% rename from packages/e2e-tests/fixtures/admin/application-auth-clients-page.js rename to packages/e2e-tests/fixtures/admin/application-oauth-clients-page.js index c1b852a1..e0258eeb 100644 --- a/packages/e2e-tests/fixtures/admin/application-auth-clients-page.js +++ b/packages/e2e-tests/fixtures/admin/application-oauth-clients-page.js @@ -2,14 +2,14 @@ import { expect } from '@playwright/test'; const { AuthenticatedPage } = require('../authenticated-page'); -export class AdminApplicationAuthClientsPage extends AuthenticatedPage { +export class AdminApplicationOAuthClientsPage extends AuthenticatedPage { /** * @param {import('@playwright/test').Page} page */ constructor(page) { super(page); - this.authClientsTab = this.page.getByTestId('auth-clients-tab'); + this.authClientsTab = this.page.getByTestId('oauth-clients-tab'); this.saveButton = this.page.getByTestId('submitButton'); this.successSnackbar = this.page.getByTestId( 'snackbar-save-admin-apps-settings-success' diff --git a/packages/e2e-tests/fixtures/admin/index.js b/packages/e2e-tests/fixtures/admin/index.js index 746c85dd..db99cf35 100644 --- a/packages/e2e-tests/fixtures/admin/index.js +++ b/packages/e2e-tests/fixtures/admin/index.js @@ -8,7 +8,9 @@ const { AdminEditRolePage } = require('./edit-role-page'); const { AdminApplicationsPage } = require('./applications-page'); const { AdminApplicationSettingsPage } = require('./application-settings-page'); -const { AdminApplicationAuthClientsPage } = require('./application-auth-clients-page'); +const { + AdminApplicationOAuthClientsPage, +} = require('./application-oauth-clients-page'); export const adminFixtures = { adminUsersPage: async ({ page }, use) => { @@ -35,8 +37,7 @@ export const adminFixtures = { adminApplicationSettingsPage: async ({ page }, use) => { await use(new AdminApplicationSettingsPage(page)); }, - adminApplicationAuthClientsPage: async ({ page }, use) => { - await use(new AdminApplicationAuthClientsPage(page)); - } + adminApplicationOAuthClientsPage: async ({ page }, use) => { + await use(new AdminApplicationOAuthClientsPage(page)); + }, }; - diff --git a/packages/e2e-tests/tests/admin/applications.spec.js b/packages/e2e-tests/tests/admin/applications.spec.js index d5bfb4ba..c487ae3f 100644 --- a/packages/e2e-tests/tests/admin/applications.spec.js +++ b/packages/e2e-tests/tests/admin/applications.spec.js @@ -71,7 +71,7 @@ test.describe('Admin Applications', () => { test('should allow only custom connections', async ({ adminApplicationsPage, adminApplicationSettingsPage, - adminApplicationAuthClientsPage, + adminApplicationOAuthClientsPage, flowEditorPage, page, }) => { @@ -95,9 +95,9 @@ test.describe('Admin Applications', () => { adminApplicationSettingsPage.disableConnectionsSwitch ).not.toBeChecked(); - await adminApplicationAuthClientsPage.openAuthClientsTab(); + await adminApplicationOAuthClientsPage.openAuthClientsTab(); await expect( - adminApplicationAuthClientsPage.createFirstAuthClientButton + adminApplicationOAuthClientsPage.createFirstAuthClientButton ).toHaveCount(1); await page.goto('/'); @@ -117,9 +117,9 @@ test.describe('Admin Applications', () => { const newConnectionOption = page .getByRole('option') .filter({ hasText: 'Add new connection' }); - const newSharedConnectionOption = page + const newOAuthConnectionOption = page .getByRole('option') - .filter({ hasText: 'Add new connection with auth client' }); + .filter({ hasText: 'Add connection with OAuth client' }); const existingConnection = page .getByRole('option') .filter({ hasText: 'Unnamed' }); @@ -127,13 +127,13 @@ test.describe('Admin Applications', () => { await expect(await existingConnection.count()).toBeGreaterThan(0); await expect(newConnectionOption).toBeEnabled(); await expect(newConnectionOption).toHaveCount(1); - await expect(newSharedConnectionOption).toHaveCount(0); + await expect(newOAuthConnectionOption).toHaveCount(0); }); test('should allow only predefined connections and existing custom', async ({ adminApplicationsPage, adminApplicationSettingsPage, - adminApplicationAuthClientsPage, + adminApplicationOAuthClientsPage, flowEditorPage, page, }) => { @@ -153,8 +153,8 @@ test.describe('Admin Applications', () => { await adminApplicationSettingsPage.saveSettings(); await adminApplicationSettingsPage.expectSuccessSnackbarToBeVisible(); - await adminApplicationAuthClientsPage.openAuthClientsTab(); - await adminApplicationAuthClientsPage.openFirstAuthClientCreateForm(); + await adminApplicationOAuthClientsPage.openAuthClientsTab(); + await adminApplicationOAuthClientsPage.openFirstAuthClientCreateForm(); const authClientForm = page.getByTestId('auth-client-form'); await authClientForm.locator(page.getByTestId('switch')).check(); await authClientForm @@ -166,8 +166,8 @@ test.describe('Admin Applications', () => { await authClientForm .locator(page.locator('[name="clientSecret"]')) .fill('spotifyClientSecret'); - await adminApplicationAuthClientsPage.submitAuthClientForm(); - await adminApplicationAuthClientsPage.authClientShouldBeVisible( + await adminApplicationOAuthClientsPage.submitAuthClientForm(); + await adminApplicationOAuthClientsPage.authClientShouldBeVisible( 'spotifyAuthClient' ); @@ -187,23 +187,23 @@ test.describe('Admin Applications', () => { const newConnectionOption = page .getByRole('option') .filter({ hasText: 'Add new connection' }); - const newSharedConnectionOption = page + const newOAuthConnectionOption = page .getByRole('option') - .filter({ hasText: 'Add connection with auth client' }); + .filter({ hasText: 'Add connection with OAuth client' }); const existingConnection = page .getByRole('option') .filter({ hasText: 'Unnamed' }); await expect(await existingConnection.count()).toBeGreaterThan(0); await expect(newConnectionOption).toHaveCount(0); - await expect(newSharedConnectionOption).toBeEnabled(); - await expect(newSharedConnectionOption).toHaveCount(1); + await expect(newOAuthConnectionOption).toBeEnabled(); + await expect(newOAuthConnectionOption).toHaveCount(1); }); test('should allow all connections', async ({ adminApplicationsPage, adminApplicationSettingsPage, - adminApplicationAuthClientsPage, + adminApplicationOAuthClientsPage, flowEditorPage, page, }) => { @@ -219,8 +219,8 @@ test.describe('Admin Applications', () => { adminApplicationSettingsPage.disableConnectionsSwitch ).not.toBeChecked(); - await adminApplicationAuthClientsPage.openAuthClientsTab(); - await adminApplicationAuthClientsPage.openFirstAuthClientCreateForm(); + await adminApplicationOAuthClientsPage.openAuthClientsTab(); + await adminApplicationOAuthClientsPage.openFirstAuthClientCreateForm(); const authClientForm = page.getByTestId('auth-client-form'); await authClientForm.locator(page.getByTestId('switch')).check(); await authClientForm @@ -232,8 +232,8 @@ test.describe('Admin Applications', () => { await authClientForm .locator(page.locator('[name="clientSecret"]')) .fill('redditClientSecret'); - await adminApplicationAuthClientsPage.submitAuthClientForm(); - await adminApplicationAuthClientsPage.authClientShouldBeVisible( + await adminApplicationOAuthClientsPage.submitAuthClientForm(); + await adminApplicationOAuthClientsPage.authClientShouldBeVisible( 'redditAuthClient' ); @@ -253,23 +253,23 @@ test.describe('Admin Applications', () => { const newConnectionOption = page .getByRole('option') .filter({ hasText: 'Add new connection' }); - const newSharedConnectionOption = page + const newOAuthConnectionOption = page .getByRole('option') - .filter({ hasText: 'Add connection with auth client' }); + .filter({ hasText: 'Add connection with OAuth client' }); const existingConnection = page .getByRole('option') .filter({ hasText: 'Unnamed' }); await expect(await existingConnection.count()).toBeGreaterThan(0); await expect(newConnectionOption).toHaveCount(1); - await expect(newSharedConnectionOption).toBeEnabled(); - await expect(newSharedConnectionOption).toHaveCount(1); + await expect(newOAuthConnectionOption).toBeEnabled(); + await expect(newOAuthConnectionOption).toHaveCount(1); }); test('should not allow new connections but existing custom', async ({ adminApplicationsPage, adminApplicationSettingsPage, - adminApplicationAuthClientsPage, + adminApplicationOAuthClientsPage, flowEditorPage, page, }) => { @@ -282,8 +282,8 @@ test.describe('Admin Applications', () => { await adminApplicationSettingsPage.saveSettings(); await adminApplicationSettingsPage.expectSuccessSnackbarToBeVisible(); - await adminApplicationAuthClientsPage.openAuthClientsTab(); - await adminApplicationAuthClientsPage.openFirstAuthClientCreateForm(); + await adminApplicationOAuthClientsPage.openAuthClientsTab(); + await adminApplicationOAuthClientsPage.openFirstAuthClientCreateForm(); const authClientForm = page.getByTestId('auth-client-form'); await authClientForm.locator(page.getByTestId('switch')).check(); @@ -296,8 +296,8 @@ test.describe('Admin Applications', () => { await authClientForm .locator(page.locator('[name="clientSecret"]')) .fill('clickupClientSecret'); - await adminApplicationAuthClientsPage.submitAuthClientForm(); - await adminApplicationAuthClientsPage.authClientShouldBeVisible( + await adminApplicationOAuthClientsPage.submitAuthClientForm(); + await adminApplicationOAuthClientsPage.authClientShouldBeVisible( 'clickupAuthClient' ); @@ -317,22 +317,22 @@ test.describe('Admin Applications', () => { const newConnectionOption = page .getByRole('option') .filter({ hasText: 'Add new connection' }); - const newSharedConnectionOption = page + const newOAuthConnectionOption = page .getByRole('option') - .filter({ hasText: 'Add connection with auth client' }); + .filter({ hasText: 'Add connection with OAuth client' }); const existingConnection = page .getByRole('option') .filter({ hasText: 'Unnamed' }); await expect(await existingConnection.count()).toBeGreaterThan(0); await expect(newConnectionOption).toHaveCount(0); - await expect(newSharedConnectionOption).toHaveCount(0); + await expect(newOAuthConnectionOption).toHaveCount(0); }); - test('should not allow new connections but existing custom even if predefined auth clients are enabled', async ({ + test('should not allow new connections but existing custom even if predefined OAuth clients are enabled', async ({ adminApplicationsPage, adminApplicationSettingsPage, - adminApplicationAuthClientsPage, + adminApplicationOAuthClientsPage, flowEditorPage, page, }) => { @@ -348,8 +348,8 @@ test.describe('Admin Applications', () => { await adminApplicationSettingsPage.saveSettings(); await adminApplicationSettingsPage.expectSuccessSnackbarToBeVisible(); - await adminApplicationAuthClientsPage.openAuthClientsTab(); - await adminApplicationAuthClientsPage.openFirstAuthClientCreateForm(); + await adminApplicationOAuthClientsPage.openAuthClientsTab(); + await adminApplicationOAuthClientsPage.openFirstAuthClientCreateForm(); const authClientForm = page.getByTestId('auth-client-form'); await authClientForm.locator(page.getByTestId('switch')).check(); @@ -362,8 +362,8 @@ test.describe('Admin Applications', () => { await authClientForm .locator(page.locator('[name="clientSecret"]')) .fill('mailchimpClientSecret'); - await adminApplicationAuthClientsPage.submitAuthClientForm(); - await adminApplicationAuthClientsPage.authClientShouldBeVisible( + await adminApplicationOAuthClientsPage.submitAuthClientForm(); + await adminApplicationOAuthClientsPage.authClientShouldBeVisible( 'mailchimpAuthClient' ); @@ -387,9 +387,9 @@ test.describe('Admin Applications', () => { const newConnectionOption = page .getByRole('option') .filter({ hasText: 'Add new connection' }); - const newSharedConnectionOption = page + const newOAuthConnectionOption = page .getByRole('option') - .filter({ hasText: 'Add new shared connection' }); + .filter({ hasText: 'Add connection with OAuth client' }); const noConnectionsOption = page .locator('.MuiAutocomplete-noOptions') .filter({ hasText: 'No options' }); @@ -397,6 +397,6 @@ test.describe('Admin Applications', () => { await expect(await existingConnection.count()).toBeGreaterThan(0); await expect(noConnectionsOption).toHaveCount(0); await expect(newConnectionOption).toHaveCount(0); - await expect(newSharedConnectionOption).toHaveCount(0); + await expect(newOAuthConnectionOption).toHaveCount(0); }); }); diff --git a/packages/e2e-tests/tests/apps/list-apps.spec.js b/packages/e2e-tests/tests/apps/list-apps.spec.js index 42e56880..b382782a 100644 --- a/packages/e2e-tests/tests/apps/list-apps.spec.js +++ b/packages/e2e-tests/tests/apps/list-apps.spec.js @@ -55,7 +55,7 @@ test.describe('Apps page', () => { test('goes to app page to create a connection', async ({ applicationsPage, }) => { - // loading app, app config, app auth clients take time + // loading app, app config, app oauth clients take time test.setTimeout(60000); await applicationsPage.page.getByTestId('app-list-item').first().click();