From 7c368af5ed945389017655f0125bb901ab3d6484 Mon Sep 17 00:00:00 2001 From: Faruk AYDIN Date: Sat, 2 Mar 2024 16:13:13 +0100 Subject: [PATCH] feat: Implement get app actions API endpoint --- .../controllers/api/v1/apps/get-actions.js | 8 +++++ .../api/v1/apps/get-actions.test.js | 35 +++++++++++++++++++ packages/backend/src/routes/api/v1/apps.js | 7 ++++ .../mocks/rest/api/v1/apps/get-actions.js | 22 ++++++++++++ 4 files changed, 72 insertions(+) create mode 100644 packages/backend/src/controllers/api/v1/apps/get-actions.js create mode 100644 packages/backend/src/controllers/api/v1/apps/get-actions.test.js create mode 100644 packages/backend/test/mocks/rest/api/v1/apps/get-actions.js diff --git a/packages/backend/src/controllers/api/v1/apps/get-actions.js b/packages/backend/src/controllers/api/v1/apps/get-actions.js new file mode 100644 index 00000000..78d45fde --- /dev/null +++ b/packages/backend/src/controllers/api/v1/apps/get-actions.js @@ -0,0 +1,8 @@ +import App from '../../../../models/app.js'; +import { renderObject } from '../../../../helpers/renderer.js'; + +export default async (request, response) => { + const actions = await App.findActionsByKey(request.params.appKey); + + renderObject(response, actions, { serializer: 'Action' }); +}; diff --git a/packages/backend/src/controllers/api/v1/apps/get-actions.test.js b/packages/backend/src/controllers/api/v1/apps/get-actions.test.js new file mode 100644 index 00000000..24748dce --- /dev/null +++ b/packages/backend/src/controllers/api/v1/apps/get-actions.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 getActionsMock from '../../../../../test/mocks/rest/api/v1/apps/get-actions.js'; + +describe('GET /api/v1/apps/:appKey/actions', () => { + let currentUser, token; + + beforeEach(async () => { + currentUser = await createUser(); + token = createAuthTokenByUserId(currentUser.id); + }); + + it('should return the app actions', async () => { + const exampleApp = await App.findOneByKey('github'); + + const response = await request(app) + .get(`/api/v1/apps/${exampleApp.key}/actions`) + .set('Authorization', token) + .expect(200); + + const expectedPayload = getActionsMock(exampleApp.actions); + 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/actions') + .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 82da4e65..399cd71c 100644 --- a/packages/backend/src/routes/api/v1/apps.js +++ b/packages/backend/src/routes/api/v1/apps.js @@ -6,6 +6,7 @@ import getAppsAction from '../../../controllers/api/v1/apps/get-apps.js'; import getAuthAction from '../../../controllers/api/v1/apps/get-auth.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'; const router = Router(); @@ -25,4 +26,10 @@ router.get( asyncHandler(getTriggerSubstepsAction) ); +router.get( + '/:appKey/actions', + authenticateUser, + asyncHandler(getActionsAction) +); + export default router; diff --git a/packages/backend/test/mocks/rest/api/v1/apps/get-actions.js b/packages/backend/test/mocks/rest/api/v1/apps/get-actions.js new file mode 100644 index 00000000..913d134a --- /dev/null +++ b/packages/backend/test/mocks/rest/api/v1/apps/get-actions.js @@ -0,0 +1,22 @@ +const getActionsMock = (actions) => { + const actionsData = actions.map((trigger) => { + return { + name: trigger.name, + key: trigger.key, + description: trigger.description, + }; + }); + + return { + data: actionsData, + meta: { + count: actions.length, + currentPage: null, + isArray: true, + totalPages: null, + type: 'Object', + }, + }; +}; + +export default getActionsMock;