From 3b240617c21f2b417f57d60c3488eea0120df64a Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Wed, 23 Apr 2025 17:28:20 +0000 Subject: [PATCH] feat(api): add get-folders endpoint --- .../api/v1/folders/get-folders.ee.js | 8 ++++ .../api/v1/folders/get-folders.ee.test.js | 47 +++++++++++++++++++ packages/backend/src/routes/api/index.js | 4 +- .../src/routes/api/v1/{apps.js => apps.ee.js} | 0 .../backend/src/routes/api/v1/folders.ee.js | 8 ++++ .../mocks/rest/api/v1/folders/get-folders.js | 23 +++++++++ 6 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 packages/backend/src/controllers/api/v1/folders/get-folders.ee.js create mode 100644 packages/backend/src/controllers/api/v1/folders/get-folders.ee.test.js rename packages/backend/src/routes/api/v1/{apps.js => apps.ee.js} (100%) create mode 100644 packages/backend/src/routes/api/v1/folders.ee.js create mode 100644 packages/backend/test/mocks/rest/api/v1/folders/get-folders.js diff --git a/packages/backend/src/controllers/api/v1/folders/get-folders.ee.js b/packages/backend/src/controllers/api/v1/folders/get-folders.ee.js new file mode 100644 index 00000000..dda1da5d --- /dev/null +++ b/packages/backend/src/controllers/api/v1/folders/get-folders.ee.js @@ -0,0 +1,8 @@ +import { renderObject } from '../../../../helpers/renderer.js'; +import Folder from '../../../../models/folder.js'; + +export default async (request, response) => { + const folders = await Folder.query().orderBy('name', 'asc'); + + renderObject(response, folders); +}; diff --git a/packages/backend/src/controllers/api/v1/folders/get-folders.ee.test.js b/packages/backend/src/controllers/api/v1/folders/get-folders.ee.test.js new file mode 100644 index 00000000..2dbbcd6f --- /dev/null +++ b/packages/backend/src/controllers/api/v1/folders/get-folders.ee.test.js @@ -0,0 +1,47 @@ +import { vi, describe, it, expect, beforeEach } from 'vitest'; +import request from 'supertest'; +import app from '../../../../app.js'; +import { createApiToken } from '../../../../../test/factories/api-token.js'; +import { createUser } from '../../../../../test/factories/user.js'; +import { createFolder } from '../../../../../test/factories/folder.js'; +import getFoldersMock from '../../../../../test/mocks/rest/api/v1/folders/get-folders.js'; +import * as license from '../../../../helpers/license.ee.js'; + +describe('GET /api/v1/folders', () => { + let folderA, folderB, folderC, currentUser, anotherUser, token; + + beforeEach(async () => { + vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true); + + currentUser = await createUser(); + anotherUser = await createUser(); + + folderC = await createFolder({ + name: 'Folder C', + userId: currentUser.id, + }); + + folderA = await createFolder({ + name: 'Folder A', + userId: anotherUser.id, + }); + + folderB = await createFolder({ + name: 'Folder B', + userId: anotherUser.id, + }); + + token = (await createApiToken()).token; + }); + + it('should return all folders', async () => { + const response = await request(app) + .get('/api/v1/folders') + .set('x-api-token', token) + .expect(200); + + const expectedPayload = await getFoldersMock([folderA, folderB, folderC]); + + expect(response.body).toStrictEqual(expectedPayload); + }); +}); diff --git a/packages/backend/src/routes/api/index.js b/packages/backend/src/routes/api/index.js index f05545e6..c0076783 100644 --- a/packages/backend/src/routes/api/index.js +++ b/packages/backend/src/routes/api/index.js @@ -1,8 +1,10 @@ import { Router } from 'express'; -import appsRouter from './v1/apps.js'; +import appsRouter from './v1/apps.ee.js'; +import foldersRouter from './v1/folders.ee.js'; const router = Router(); router.use('/v1/apps', appsRouter); +router.use('/v1/folders', foldersRouter); export default router; diff --git a/packages/backend/src/routes/api/v1/apps.js b/packages/backend/src/routes/api/v1/apps.ee.js similarity index 100% rename from packages/backend/src/routes/api/v1/apps.js rename to packages/backend/src/routes/api/v1/apps.ee.js diff --git a/packages/backend/src/routes/api/v1/folders.ee.js b/packages/backend/src/routes/api/v1/folders.ee.js new file mode 100644 index 00000000..7e0d9099 --- /dev/null +++ b/packages/backend/src/routes/api/v1/folders.ee.js @@ -0,0 +1,8 @@ +import { Router } from 'express'; +import getFoldersAction from '../../../controllers/api/v1/folders/get-folders.ee.js'; + +const router = Router(); + +router.get('/', getFoldersAction); + +export default router; diff --git a/packages/backend/test/mocks/rest/api/v1/folders/get-folders.js b/packages/backend/test/mocks/rest/api/v1/folders/get-folders.js new file mode 100644 index 00000000..2dc7fbbe --- /dev/null +++ b/packages/backend/test/mocks/rest/api/v1/folders/get-folders.js @@ -0,0 +1,23 @@ +const getFoldersMock = async (folders) => { + const data = folders.map((folder) => { + return { + id: folder.id, + name: folder.name, + createdAt: folder.createdAt.getTime(), + updatedAt: folder.updatedAt.getTime(), + }; + }); + + return { + data: data, + meta: { + count: data.length, + currentPage: null, + isArray: true, + totalPages: null, + type: 'Folder', + }, + }; +}; + +export default getFoldersMock;