From 2ecb802a2e95e8e01cd34165b435050343d06be4 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Fri, 22 Mar 2024 14:42:48 +0100 Subject: [PATCH 1/4] feat: Implement admin get app auth clients API endpoint --- .../app-auth-clients/get-app-auth-clients.js | 11 +++++ .../get-app-auth-clients.test.js | 41 +++++++++++++++++++ .../routes/api/v1/admin/app-auth-clients.js | 13 +++++- packages/backend/test/factories/app-config.js | 3 +- .../app-auth-clients/get-app-auth-clients.js | 19 +++++++++ 5 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 packages/backend/src/controllers/api/v1/admin/app-auth-clients/get-app-auth-clients.js create mode 100644 packages/backend/src/controllers/api/v1/admin/app-auth-clients/get-app-auth-clients.test.js create mode 100644 packages/backend/test/mocks/rest/api/v1/admin/app-auth-clients/get-app-auth-clients.js diff --git a/packages/backend/src/controllers/api/v1/admin/app-auth-clients/get-app-auth-clients.js b/packages/backend/src/controllers/api/v1/admin/app-auth-clients/get-app-auth-clients.js new file mode 100644 index 00000000..03d0aeee --- /dev/null +++ b/packages/backend/src/controllers/api/v1/admin/app-auth-clients/get-app-auth-clients.js @@ -0,0 +1,11 @@ +import { renderObject } from '../../../../../helpers/renderer.js'; +import AppAuthClient from '../../../../../models/app-auth-client.js'; + +export default async (request, response) => { + const appAuthClients = await AppAuthClient.query().orderBy( + 'created_at', + 'desc' + ); + + renderObject(response, appAuthClients); +}; diff --git a/packages/backend/src/controllers/api/v1/admin/app-auth-clients/get-app-auth-clients.test.js b/packages/backend/src/controllers/api/v1/admin/app-auth-clients/get-app-auth-clients.test.js new file mode 100644 index 00000000..b3394c89 --- /dev/null +++ b/packages/backend/src/controllers/api/v1/admin/app-auth-clients/get-app-auth-clients.test.js @@ -0,0 +1,41 @@ +import { vi, describe, it, expect, beforeEach } from 'vitest'; +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 getAdminAppAuthClientsMock from '../../../../../../test/mocks/rest/api/v1/admin/app-auth-clients/get-app-auth-clients.js'; +import { createAppAuthClient } from '../../../../../../test/factories/app-auth-client.js'; +import { createRole } from '../../../../../../test/factories/role.js'; +import * as license from '../../../../../helpers/license.ee.js'; + +describe('GET /api/v1/admin/app-auth-clients', () => { + let currentUser, currentUserRole, token; + + describe('with valid license key', () => { + beforeEach(async () => { + vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true); + + currentUserRole = await createRole({ key: 'admin' }); + currentUser = await createUser({ roleId: currentUserRole.id }); + + token = createAuthTokenByUserId(currentUser.id); + }); + + it('should return app auth clients', async () => { + const appAuthClientOne = await createAppAuthClient(); + const appAuthClientTwo = await createAppAuthClient(); + + const response = await request(app) + .get('/api/v1/admin/app-auth-clients') + .set('Authorization', token) + .expect(200); + + const expectedPayload = getAdminAppAuthClientsMock([ + appAuthClientTwo, + appAuthClientOne, + ]); + + expect(response.body).toEqual(expectedPayload); + }); + }); +}); diff --git a/packages/backend/src/routes/api/v1/admin/app-auth-clients.js b/packages/backend/src/routes/api/v1/admin/app-auth-clients.js index 08b18bbb..37035570 100644 --- a/packages/backend/src/routes/api/v1/admin/app-auth-clients.js +++ b/packages/backend/src/routes/api/v1/admin/app-auth-clients.js @@ -3,16 +3,25 @@ import asyncHandler from 'express-async-handler'; import { authenticateUser } from '../../../../helpers/authentication.js'; import { authorizeAdmin } from '../../../../helpers/authorization.js'; import { checkIsEnterprise } from '../../../../helpers/check-is-enterprise.js'; -import getAdminAppAuthClientsAction from '../../../../controllers/api/v1/admin/app-auth-clients/get-app-auth-client.js'; +import getAdminAppAuthClientsAction from '../../../../controllers/api/v1/admin/app-auth-clients/get-app-auth-clients.js'; +import getAdminAppAuthClientAction from '../../../../controllers/api/v1/admin/app-auth-clients/get-app-auth-client.js'; const router = Router(); router.get( - '/:appAuthClientId', + '/', authenticateUser, authorizeAdmin, checkIsEnterprise, asyncHandler(getAdminAppAuthClientsAction) ); +router.get( + '/:appAuthClientId', + authenticateUser, + authorizeAdmin, + checkIsEnterprise, + asyncHandler(getAdminAppAuthClientAction) +); + export default router; diff --git a/packages/backend/test/factories/app-config.js b/packages/backend/test/factories/app-config.js index 4d81cce6..d71ee998 100644 --- a/packages/backend/test/factories/app-config.js +++ b/packages/backend/test/factories/app-config.js @@ -1,7 +1,8 @@ import AppConfig from '../../src/models/app-config.js'; +import { faker } from '@faker-js/faker'; export const createAppConfig = async (params = {}) => { - params.key = params?.key || 'gitlab'; + params.key = params?.key || faker.lorem.word(); const appConfig = await AppConfig.query().insertAndFetch(params); diff --git a/packages/backend/test/mocks/rest/api/v1/admin/app-auth-clients/get-app-auth-clients.js b/packages/backend/test/mocks/rest/api/v1/admin/app-auth-clients/get-app-auth-clients.js new file mode 100644 index 00000000..cb40da1a --- /dev/null +++ b/packages/backend/test/mocks/rest/api/v1/admin/app-auth-clients/get-app-auth-clients.js @@ -0,0 +1,19 @@ +const getAdminAppAuthClientsMock = (appAuthClients) => { + return { + data: appAuthClients.map((appAuthClient) => ({ + appConfigId: appAuthClient.appConfigId, + name: appAuthClient.name, + id: appAuthClient.id, + active: appAuthClient.active, + })), + meta: { + count: appAuthClients.length, + currentPage: null, + isArray: true, + totalPages: null, + type: 'AppAuthClient', + }, + }; +}; + +export default getAdminAppAuthClientsMock; From d2cb434b7b9c6f463b9e9e9683b966bc30554559 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Fri, 22 Mar 2024 14:44:35 +0100 Subject: [PATCH 2/4] refactor: Move admin get app auth client mock to correct folder --- .../api/v1/admin/app-auth-clients/get-app-auth-client.test.js | 2 +- .../api/v1/admin/{ => app-auth-clients}/get-app-auth-client.js | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename packages/backend/test/mocks/rest/api/v1/admin/{ => app-auth-clients}/get-app-auth-client.js (100%) diff --git a/packages/backend/src/controllers/api/v1/admin/app-auth-clients/get-app-auth-client.test.js b/packages/backend/src/controllers/api/v1/admin/app-auth-clients/get-app-auth-client.test.js index fcd6d842..e9d18222 100644 --- a/packages/backend/src/controllers/api/v1/admin/app-auth-clients/get-app-auth-client.test.js +++ b/packages/backend/src/controllers/api/v1/admin/app-auth-clients/get-app-auth-client.test.js @@ -4,7 +4,7 @@ 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 getAdminAppAuthClientMock from '../../../../../../test/mocks/rest/api/v1/admin/get-app-auth-client.js'; +import getAdminAppAuthClientMock from '../../../../../../test/mocks/rest/api/v1/admin/app-auth-clients/get-app-auth-client.js'; import { createAppAuthClient } from '../../../../../../test/factories/app-auth-client.js'; import { createRole } from '../../../../../../test/factories/role.js'; import * as license from '../../../../../helpers/license.ee.js'; diff --git a/packages/backend/test/mocks/rest/api/v1/admin/get-app-auth-client.js b/packages/backend/test/mocks/rest/api/v1/admin/app-auth-clients/get-app-auth-client.js similarity index 100% rename from packages/backend/test/mocks/rest/api/v1/admin/get-app-auth-client.js rename to packages/backend/test/mocks/rest/api/v1/admin/app-auth-clients/get-app-auth-client.js From 280575df88e9b148be19d36745fb9434e333d606 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Fri, 22 Mar 2024 14:46:43 +0100 Subject: [PATCH 3/4] refactor: Move app auth client mock to correct folder --- .../api/v1/app-auth-clients/get-app-auth-client.test.js | 2 +- .../rest/api/v1/{ => app-auth-clients}/get-app-auth-client.js | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename packages/backend/test/mocks/rest/api/v1/{ => app-auth-clients}/get-app-auth-client.js (100%) diff --git a/packages/backend/src/controllers/api/v1/app-auth-clients/get-app-auth-client.test.js b/packages/backend/src/controllers/api/v1/app-auth-clients/get-app-auth-client.test.js index 6fcd494f..6eef721f 100644 --- a/packages/backend/src/controllers/api/v1/app-auth-clients/get-app-auth-client.test.js +++ b/packages/backend/src/controllers/api/v1/app-auth-clients/get-app-auth-client.test.js @@ -4,7 +4,7 @@ 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/admin/get-app-auth-client.js'; +import getAppAuthClientMock from '../../../../../test/mocks/rest/api/v1/app-auth-clients/get-app-auth-client.js'; import { createAppAuthClient } from '../../../../../test/factories/app-auth-client.js'; import * as license from '../../../../helpers/license.ee.js'; diff --git a/packages/backend/test/mocks/rest/api/v1/get-app-auth-client.js b/packages/backend/test/mocks/rest/api/v1/app-auth-clients/get-app-auth-client.js similarity index 100% rename from packages/backend/test/mocks/rest/api/v1/get-app-auth-client.js rename to packages/backend/test/mocks/rest/api/v1/app-auth-clients/get-app-auth-client.js From 7057317446d2e8e54b201bd57bbfdef2b05db853 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Fri, 22 Mar 2024 14:48:46 +0100 Subject: [PATCH 4/4] refactor: Use ee extension for admin app auth clients --- .../{get-app-auth-client.js => get-app-auth-client.ee.js} | 0 ...app-auth-client.test.js => get-app-auth-client.ee.test.js} | 0 .../{get-app-auth-clients.js => get-app-auth-clients.ee.js} | 0 ...p-auth-clients.test.js => get-app-auth-clients.ee.test.js} | 0 .../v1/admin/{app-auth-clients.js => app-auth-clients.ee.js} | 4 ++-- packages/backend/src/routes/index.js | 2 +- 6 files changed, 3 insertions(+), 3 deletions(-) rename packages/backend/src/controllers/api/v1/admin/app-auth-clients/{get-app-auth-client.js => get-app-auth-client.ee.js} (100%) rename packages/backend/src/controllers/api/v1/admin/app-auth-clients/{get-app-auth-client.test.js => get-app-auth-client.ee.test.js} (100%) rename packages/backend/src/controllers/api/v1/admin/app-auth-clients/{get-app-auth-clients.js => get-app-auth-clients.ee.js} (100%) rename packages/backend/src/controllers/api/v1/admin/app-auth-clients/{get-app-auth-clients.test.js => get-app-auth-clients.ee.test.js} (100%) rename packages/backend/src/routes/api/v1/admin/{app-auth-clients.js => app-auth-clients.ee.js} (86%) diff --git a/packages/backend/src/controllers/api/v1/admin/app-auth-clients/get-app-auth-client.js b/packages/backend/src/controllers/api/v1/admin/app-auth-clients/get-app-auth-client.ee.js similarity index 100% rename from packages/backend/src/controllers/api/v1/admin/app-auth-clients/get-app-auth-client.js rename to packages/backend/src/controllers/api/v1/admin/app-auth-clients/get-app-auth-client.ee.js diff --git a/packages/backend/src/controllers/api/v1/admin/app-auth-clients/get-app-auth-client.test.js b/packages/backend/src/controllers/api/v1/admin/app-auth-clients/get-app-auth-client.ee.test.js similarity index 100% rename from packages/backend/src/controllers/api/v1/admin/app-auth-clients/get-app-auth-client.test.js rename to packages/backend/src/controllers/api/v1/admin/app-auth-clients/get-app-auth-client.ee.test.js diff --git a/packages/backend/src/controllers/api/v1/admin/app-auth-clients/get-app-auth-clients.js b/packages/backend/src/controllers/api/v1/admin/app-auth-clients/get-app-auth-clients.ee.js similarity index 100% rename from packages/backend/src/controllers/api/v1/admin/app-auth-clients/get-app-auth-clients.js rename to packages/backend/src/controllers/api/v1/admin/app-auth-clients/get-app-auth-clients.ee.js diff --git a/packages/backend/src/controllers/api/v1/admin/app-auth-clients/get-app-auth-clients.test.js b/packages/backend/src/controllers/api/v1/admin/app-auth-clients/get-app-auth-clients.ee.test.js similarity index 100% rename from packages/backend/src/controllers/api/v1/admin/app-auth-clients/get-app-auth-clients.test.js rename to packages/backend/src/controllers/api/v1/admin/app-auth-clients/get-app-auth-clients.ee.test.js diff --git a/packages/backend/src/routes/api/v1/admin/app-auth-clients.js b/packages/backend/src/routes/api/v1/admin/app-auth-clients.ee.js similarity index 86% rename from packages/backend/src/routes/api/v1/admin/app-auth-clients.js rename to packages/backend/src/routes/api/v1/admin/app-auth-clients.ee.js index 37035570..cda5e2e0 100644 --- a/packages/backend/src/routes/api/v1/admin/app-auth-clients.js +++ b/packages/backend/src/routes/api/v1/admin/app-auth-clients.ee.js @@ -3,8 +3,8 @@ import asyncHandler from 'express-async-handler'; import { authenticateUser } from '../../../../helpers/authentication.js'; import { authorizeAdmin } from '../../../../helpers/authorization.js'; import { checkIsEnterprise } from '../../../../helpers/check-is-enterprise.js'; -import getAdminAppAuthClientsAction from '../../../../controllers/api/v1/admin/app-auth-clients/get-app-auth-clients.js'; -import getAdminAppAuthClientAction from '../../../../controllers/api/v1/admin/app-auth-clients/get-app-auth-client.js'; +import getAdminAppAuthClientsAction from '../../../../controllers/api/v1/admin/app-auth-clients/get-app-auth-clients.ee.js'; +import getAdminAppAuthClientAction from '../../../../controllers/api/v1/admin/app-auth-clients/get-app-auth-client.ee.js'; const router = Router(); diff --git a/packages/backend/src/routes/index.js b/packages/backend/src/routes/index.js index ffe22cab..b0bc516d 100644 --- a/packages/backend/src/routes/index.js +++ b/packages/backend/src/routes/index.js @@ -18,7 +18,7 @@ import adminSamlAuthProvidersRouter from './api/v1/admin/saml-auth-providers.ee. import rolesRouter from './api/v1/admin/roles.ee.js'; import permissionsRouter from './api/v1/admin/permissions.ee.js'; import adminUsersRouter from './api/v1/admin/users.ee.js'; -import adminAppAuthClientsRouter from './api/v1/admin/app-auth-clients.js'; +import adminAppAuthClientsRouter from './api/v1/admin/app-auth-clients.ee.js'; const router = Router();