From 279d9ca859e97de326015ac00e6238b3ed0863ed Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Fri, 25 Apr 2025 12:43:48 +0000 Subject: [PATCH] feat(api): add delete user endpoint --- .../api/v1/users/delete-user.ee.js | 11 +++++ .../api/v1/users/delete-user.ee.test.js | 41 +++++++++++++++++++ .../backend/src/routes/api/v1/users.ee.js | 2 + 3 files changed, 54 insertions(+) create mode 100644 packages/backend/src/controllers/api/v1/users/delete-user.ee.js create mode 100644 packages/backend/src/controllers/api/v1/users/delete-user.ee.test.js diff --git a/packages/backend/src/controllers/api/v1/users/delete-user.ee.js b/packages/backend/src/controllers/api/v1/users/delete-user.ee.js new file mode 100644 index 00000000..d24ef0a9 --- /dev/null +++ b/packages/backend/src/controllers/api/v1/users/delete-user.ee.js @@ -0,0 +1,11 @@ +import User from '../../../../models/user.js'; + +export default async (request, response) => { + const user = await User.query() + .findById(request.params.userId) + .throwIfNotFound(); + + await user.softRemove(); + + response.status(204).end(); +}; diff --git a/packages/backend/src/controllers/api/v1/users/delete-user.ee.test.js b/packages/backend/src/controllers/api/v1/users/delete-user.ee.test.js new file mode 100644 index 00000000..93f04e28 --- /dev/null +++ b/packages/backend/src/controllers/api/v1/users/delete-user.ee.test.js @@ -0,0 +1,41 @@ +import Crypto from 'node:crypto'; +import request from 'supertest'; +import { beforeEach, describe, it, vi } from 'vitest'; +import { createUser } from '../../../../../test/factories/user.js'; +import { createApiToken } from '../../../../../test/factories/api-token.js'; +import app from '../../../../app.js'; +import * as license from '../../../../helpers/license.ee.js'; + +describe('DELETE /api/v1/users/:userId', () => { + let user, token; + + beforeEach(async () => { + vi.spyOn(license, 'hasValidLicense').mockResolvedValue(true); + + user = await createUser(); + token = (await createApiToken()).token; + }); + + it('should soft delete user and respond with no content', async () => { + await request(app) + .delete(`/api/v1/users/${user.id}`) + .set('x-api-token', token) + .expect(204); + }); + + it('should return not found response for not existing user UUID', async () => { + const notExistingUserUUID = Crypto.randomUUID(); + + await request(app) + .delete(`/api/v1/users/${notExistingUserUUID}`) + .set('x-api-token', token) + .expect(404); + }); + + it('should return bad request response for invalid UUID', async () => { + await request(app) + .delete('/api/v1/users/invalidUserUUID') + .set('x-api-token', token) + .expect(400); + }); +}); diff --git a/packages/backend/src/routes/api/v1/users.ee.js b/packages/backend/src/routes/api/v1/users.ee.js index b4bd45d8..5579819b 100644 --- a/packages/backend/src/routes/api/v1/users.ee.js +++ b/packages/backend/src/routes/api/v1/users.ee.js @@ -3,12 +3,14 @@ import createFlowAction from '../../../controllers/api/v1/users/create-flow.ee.j import createFolderAction from '../../../controllers/api/v1/users/create-folder.ee.js'; import getFoldersAction from '../../../controllers/api/v1/users/get-folders.ee.js'; import getUserAction from '../../../controllers/api/v1/users/get-user.ee.js'; +import deleteUserAction from '../../../controllers/api/v1/users/delete-user.ee.js'; import getUsersAction from '../../../controllers/api/v1/users/get-users.ee.js'; const router = Router(); router.get('/', getUsersAction); router.get('/:userId', getUserAction); +router.delete('/:userId', deleteUserAction); router.post('/:userId/flows', createFlowAction); router.get('/:userId/folders', getFoldersAction); router.post('/:userId/folders', createFolderAction);