diff --git a/packages/backend/src/controllers/api/v1/apps/get-triggers.js b/packages/backend/src/controllers/api/v1/apps/get-triggers.js new file mode 100644 index 00000000..19cd9095 --- /dev/null +++ b/packages/backend/src/controllers/api/v1/apps/get-triggers.js @@ -0,0 +1,8 @@ +import App from '../../../../models/app.js'; +import { renderObject } from '../../../../helpers/renderer.js'; + +export default async (request, response) => { + const triggers = await App.findTriggersByKey(request.params.appKey); + + renderObject(response, triggers, { serializer: 'Trigger' }); +}; diff --git a/packages/backend/src/controllers/api/v1/apps/get-triggers.test.js b/packages/backend/src/controllers/api/v1/apps/get-triggers.test.js new file mode 100644 index 00000000..c8261681 --- /dev/null +++ b/packages/backend/src/controllers/api/v1/apps/get-triggers.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 getTriggersMock from '../../../../../test/mocks/rest/api/v1/apps/get-triggers.js'; + +describe('GET /api/v1/apps/:appKey/triggers', () => { + let currentUser, token; + + beforeEach(async () => { + currentUser = await createUser(); + token = createAuthTokenByUserId(currentUser.id); + }); + + it('should return the app triggers', async () => { + const exampleApp = await App.findOneByKey('github'); + + const response = await request(app) + .get(`/api/v1/apps/${exampleApp.key}/triggers`) + .set('Authorization', token) + .expect(200); + + const expectedPayload = getTriggersMock(exampleApp.triggers); + 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/triggers') + .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 ef69b97e..fd681426 100644 --- a/packages/backend/src/routes/api/v1/apps.js +++ b/packages/backend/src/routes/api/v1/apps.js @@ -4,6 +4,7 @@ import { authenticateUser } from '../../../helpers/authentication.js'; import getAppAction from '../../../controllers/api/v1/apps/get-app.js'; 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'; const router = Router(); @@ -11,4 +12,10 @@ router.get('/', authenticateUser, asyncHandler(getAppsAction)); router.get('/:appKey', authenticateUser, asyncHandler(getAppAction)); router.get('/:appKey/auth', authenticateUser, asyncHandler(getAuthAction)); +router.get( + '/:appKey/triggers', + authenticateUser, + asyncHandler(getTriggersAction) +); + export default router; diff --git a/packages/backend/test/mocks/rest/api/v1/apps/get-triggers.js b/packages/backend/test/mocks/rest/api/v1/apps/get-triggers.js new file mode 100644 index 00000000..cca01326 --- /dev/null +++ b/packages/backend/test/mocks/rest/api/v1/apps/get-triggers.js @@ -0,0 +1,25 @@ +const getTriggersMock = (triggers) => { + const triggersData = triggers.map((trigger) => { + return { + description: trigger.description, + key: trigger.key, + name: trigger.name, + pollInterval: trigger.pollInterval, + showWebhookUrl: trigger.showWebhookUrl, + type: trigger.type, + }; + }); + + return { + data: triggersData, + meta: { + count: triggers.length, + currentPage: null, + isArray: true, + totalPages: null, + type: 'Object', + }, + }; +}; + +export default getTriggersMock;