From 0031d7911d5fc840ee75fb1ca953a0c56ec4045f Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Tue, 27 Feb 2024 16:22:28 +0100 Subject: [PATCH 1/4] fix: Adjust description of app serializer test --- packages/backend/src/serializers/app.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend/src/serializers/app.test.js b/packages/backend/src/serializers/app.test.js index 8527f103..c2714dc2 100644 --- a/packages/backend/src/serializers/app.test.js +++ b/packages/backend/src/serializers/app.test.js @@ -3,7 +3,7 @@ import App from '../models/app'; import appSerializer from './app'; describe('appSerializer', () => { - it('should return permission data', async () => { + it('should return app data', async () => { const app = await App.findOneByKey('deepl'); const expectedPayload = { From 63c944212667ec62314f19a70033c715c2314f86 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Tue, 27 Feb 2024 16:24:17 +0100 Subject: [PATCH 2/4] feat: Add find by auth method to App model --- packages/backend/src/models/app.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/backend/src/models/app.js b/packages/backend/src/models/app.js index 6131f014..865f9a3e 100644 --- a/packages/backend/src/models/app.js +++ b/packages/backend/src/models/app.js @@ -39,6 +39,13 @@ class App { return appInfoConverter(rawAppData); } + static async findAuthByKey(key, stripFuncs = false) { + const rawAppData = await getApp(key, stripFuncs); + const appData = appInfoConverter(rawAppData); + + return appData.auth; + } + static async checkAppAndAction(appKey, actionKey) { const app = await this.findOneByKey(appKey); From 356668a68d8f3ec3d1659dbf55641a0ea97fdc44 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Tue, 27 Feb 2024 16:24:32 +0100 Subject: [PATCH 3/4] feat: Implement auth serializer --- packages/backend/src/serializers/auth.js | 9 +++++++++ packages/backend/src/serializers/auth.test.js | 17 +++++++++++++++++ packages/backend/src/serializers/index.js | 2 ++ 3 files changed, 28 insertions(+) create mode 100644 packages/backend/src/serializers/auth.js create mode 100644 packages/backend/src/serializers/auth.test.js diff --git a/packages/backend/src/serializers/auth.js b/packages/backend/src/serializers/auth.js new file mode 100644 index 00000000..c5d60a4e --- /dev/null +++ b/packages/backend/src/serializers/auth.js @@ -0,0 +1,9 @@ +const authSerializer = (auth) => { + return { + fields: auth.fields, + authenticationSteps: auth.authenticationSteps, + reconnectionSteps: auth.reconnectionSteps, + }; +}; + +export default authSerializer; diff --git a/packages/backend/src/serializers/auth.test.js b/packages/backend/src/serializers/auth.test.js new file mode 100644 index 00000000..6746c559 --- /dev/null +++ b/packages/backend/src/serializers/auth.test.js @@ -0,0 +1,17 @@ +import { describe, it, expect } from 'vitest'; +import App from '../models/app'; +import authSerializer from './auth'; + +describe('authSerializer', () => { + it('should return auth data', async () => { + const auth = await App.findAuthByKey('deepl'); + + const expectedPayload = { + fields: auth.fields, + authenticationSteps: auth.authenticationSteps, + reconnectionSteps: auth.reconnectionSteps, + }; + + expect(authSerializer(auth)).toEqual(expectedPayload); + }); +}); diff --git a/packages/backend/src/serializers/index.js b/packages/backend/src/serializers/index.js index 9a63ca72..1732ac62 100644 --- a/packages/backend/src/serializers/index.js +++ b/packages/backend/src/serializers/index.js @@ -6,6 +6,7 @@ import appAuthClientSerializer from './app-auth-client.js'; import flowSerializer from './flow.js'; import stepSerializer from './step.js'; import appSerializer from './app.js'; +import authSerializer from './auth.js'; const serializers = { User: userSerializer, @@ -16,6 +17,7 @@ const serializers = { Flow: flowSerializer, Step: stepSerializer, App: appSerializer, + Auth: authSerializer, }; export default serializers; From 5dca0191d2efe744cfd5c5a47142813969187b1e Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Wed, 28 Feb 2024 16:16:08 +0100 Subject: [PATCH 4/4] feat: Implement get app auth API endpoint --- .../src/controllers/api/v1/apps/get-auth.js | 8 +++++ .../controllers/api/v1/apps/get-auth.test.js | 35 +++++++++++++++++++ packages/backend/src/routes/api/v1/apps.js | 2 ++ .../test/mocks/rest/api/v1/apps/get-auth.js | 18 ++++++++++ 4 files changed, 63 insertions(+) create mode 100644 packages/backend/src/controllers/api/v1/apps/get-auth.js create mode 100644 packages/backend/src/controllers/api/v1/apps/get-auth.test.js create mode 100644 packages/backend/test/mocks/rest/api/v1/apps/get-auth.js diff --git a/packages/backend/src/controllers/api/v1/apps/get-auth.js b/packages/backend/src/controllers/api/v1/apps/get-auth.js new file mode 100644 index 00000000..37b30753 --- /dev/null +++ b/packages/backend/src/controllers/api/v1/apps/get-auth.js @@ -0,0 +1,8 @@ +import App from '../../../../models/app.js'; +import { renderObject } from '../../../../helpers/renderer.js'; + +export default async (request, response) => { + const auth = await App.findAuthByKey(request.params.appKey); + + renderObject(response, auth, { serializer: 'Auth' }); +}; diff --git a/packages/backend/src/controllers/api/v1/apps/get-auth.test.js b/packages/backend/src/controllers/api/v1/apps/get-auth.test.js new file mode 100644 index 00000000..b846e607 --- /dev/null +++ b/packages/backend/src/controllers/api/v1/apps/get-auth.test.js @@ -0,0 +1,35 @@ +import { describe, it, expect, beforeEach } from 'vitest'; +import request from 'supertest'; +import App from '../../../../models/app'; +import app from '../../../../app.js'; +import createAuthTokenByUserId from '../../../../helpers/create-auth-token-by-user-id'; +import { createUser } from '../../../../../test/factories/user'; +import getAuthMock from '../../../../../test/mocks/rest/api/v1/apps/get-auth.js'; + +describe('GET /api/v1/apps/:appKey/auth', () => { + let currentUser, token; + + beforeEach(async () => { + currentUser = await createUser(); + token = createAuthTokenByUserId(currentUser.id); + }); + + it('should return the app auth info', async () => { + const exampleApp = await App.findOneByKey('github'); + + const response = await request(app) + .get(`/api/v1/apps/${exampleApp.key}/auth`) + .set('Authorization', token) + .expect(200); + + const expectedPayload = getAuthMock(exampleApp.auth); + expect(response.body).toEqual(expectedPayload); + }); + + it('should return not found response for invalid app key', async () => { + await request(app) + .get('/api/v1/apps/invalid-app-key') + .set('Authorization', token) + .expect(404); + }); +}); diff --git a/packages/backend/src/routes/api/v1/apps.js b/packages/backend/src/routes/api/v1/apps.js index b5d23b4a..2f696bb1 100644 --- a/packages/backend/src/routes/api/v1/apps.js +++ b/packages/backend/src/routes/api/v1/apps.js @@ -2,9 +2,11 @@ import { Router } from 'express'; import asyncHandler from 'express-async-handler'; import { authenticateUser } from '../../../helpers/authentication.js'; import getAppAction from '../../../controllers/api/v1/apps/get-app.js'; +import getAuthAction from '../../../controllers/api/v1/apps/get-auth.js'; const router = Router(); router.get('/:appKey', authenticateUser, asyncHandler(getAppAction)); +router.get('/:appKey/auth', authenticateUser, asyncHandler(getAuthAction)); export default router; diff --git a/packages/backend/test/mocks/rest/api/v1/apps/get-auth.js b/packages/backend/test/mocks/rest/api/v1/apps/get-auth.js new file mode 100644 index 00000000..68ea18cd --- /dev/null +++ b/packages/backend/test/mocks/rest/api/v1/apps/get-auth.js @@ -0,0 +1,18 @@ +const getAuthMock = (auth) => { + return { + data: { + fields: auth.fields, + authenticationSteps: auth.authenticationSteps, + reconnectionSteps: auth.reconnectionSteps, + }, + meta: { + count: 1, + currentPage: null, + isArray: false, + totalPages: null, + type: 'Object', + }, + }; +}; + +export default getAuthMock;