feat: Implement rest API endpoint to remove current user

This commit is contained in:
Faruk AYDIN
2024-09-03 15:50:44 +03:00
parent c524277665
commit f8c25ae508
4 changed files with 64 additions and 0 deletions

View File

@@ -0,0 +1,5 @@
export default async (request, response) => {
await request.currentUser.softRemove();
response.status(204).end();
};

View File

@@ -0,0 +1,21 @@
import { describe, it, beforeEach } from 'vitest';
import request from 'supertest';
import app from '../../../../app.js';
import createAuthTokenByUserId from '../../../../helpers/create-auth-token-by-user-id.js';
import { createUser } from '../../../../../test/factories/user.js';
describe('DELETE /api/v1/users/:userId', () => {
let currentUser, token;
beforeEach(async () => {
currentUser = await createUser();
token = await createAuthTokenByUserId(currentUser.id);
});
it('should remove user and return 204 no content', async () => {
await request(app)
.delete(`/api/v1/users/${currentUser.id}`)
.set('Authorization', token)
.expect(204);
});
});

View File

@@ -12,6 +12,7 @@ import AccessToken from './access-token.js';
import Connection from './connection.js'; import Connection from './connection.js';
import Config from './config.js'; import Config from './config.js';
import Execution from './execution.js'; import Execution from './execution.js';
import ExecutionStep from './execution-step.js';
import Flow from './flow.js'; import Flow from './flow.js';
import Identity from './identity.ee.js'; import Identity from './identity.ee.js';
import Permission from './permission.js'; import Permission from './permission.js';
@@ -23,6 +24,7 @@ import Billing from '../helpers/billing/index.ee.js';
import NotAuthorizedError from '../errors/not-authorized.js'; import NotAuthorizedError from '../errors/not-authorized.js';
import deleteUserQueue from '../queues/delete-user.ee.js'; import deleteUserQueue from '../queues/delete-user.ee.js';
import flowQueue from '../queues/flow.js';
import emailQueue from '../queues/email.js'; import emailQueue from '../queues/email.js';
import { import {
REMOVE_AFTER_30_DAYS_OR_150_JOBS, REMOVE_AFTER_30_DAYS_OR_150_JOBS,
@@ -258,6 +260,40 @@ class User extends Base {
}; };
await deleteUserQueue.add(jobName, jobPayload, jobOptions); await deleteUserQueue.add(jobName, jobPayload, jobOptions);
await this.softRemoveAssociations();
}
async softRemoveAssociations() {
const flows = await this.$relatedQuery('flows').where({
active: true,
});
const repeatableJobs = await flowQueue.getRepeatableJobs();
for (const flow of flows) {
const job = repeatableJobs.find((job) => job.id === flow.id);
if (job) {
await flowQueue.removeRepeatableByKey(job.key);
}
}
const executionIds = (
await this.$relatedQuery('executions').select('executions.id')
).map((execution) => execution.id);
const flowIds = flows.map((flow) => flow.id);
await ExecutionStep.query().delete().whereIn('execution_id', executionIds);
await this.$relatedQuery('executions').delete();
await this.$relatedQuery('steps').delete();
await Flow.query().whereIn('id', flowIds).delete();
await this.$relatedQuery('connections').delete();
await this.$relatedQuery('identities').delete();
if (appConfig.isCloud) {
await this.$relatedQuery('subscriptions').delete();
await this.$relatedQuery('usageData').delete();
}
} }
async sendResetPasswordEmail() { async sendResetPasswordEmail() {

View File

@@ -4,6 +4,7 @@ import { authorizeUser } from '../../../helpers/authorization.js';
import checkIsCloud from '../../../helpers/check-is-cloud.js'; import checkIsCloud from '../../../helpers/check-is-cloud.js';
import getCurrentUserAction from '../../../controllers/api/v1/users/get-current-user.js'; import getCurrentUserAction from '../../../controllers/api/v1/users/get-current-user.js';
import updateCurrentUserAction from '../../../controllers/api/v1/users/update-current-user.js'; import updateCurrentUserAction from '../../../controllers/api/v1/users/update-current-user.js';
import deleteCurrentUserAction from '../../../controllers/api/v1/users/delete-current-user.js';
import getUserTrialAction from '../../../controllers/api/v1/users/get-user-trial.ee.js'; import getUserTrialAction from '../../../controllers/api/v1/users/get-user-trial.ee.js';
import getAppsAction from '../../../controllers/api/v1/users/get-apps.js'; import getAppsAction from '../../../controllers/api/v1/users/get-apps.js';
import getInvoicesAction from '../../../controllers/api/v1/users/get-invoices.ee.js'; import getInvoicesAction from '../../../controllers/api/v1/users/get-invoices.ee.js';
@@ -19,6 +20,7 @@ router.get('/me', authenticateUser, getCurrentUserAction);
router.patch('/:userId', authenticateUser, updateCurrentUserAction); router.patch('/:userId', authenticateUser, updateCurrentUserAction);
router.get('/:userId/apps', authenticateUser, authorizeUser, getAppsAction); router.get('/:userId/apps', authenticateUser, authorizeUser, getAppsAction);
router.get('/invoices', authenticateUser, checkIsCloud, getInvoicesAction); router.get('/invoices', authenticateUser, checkIsCloud, getInvoicesAction);
router.delete('/:userId', authenticateUser, deleteCurrentUserAction);
router.get( router.get(
'/:userId/trial', '/:userId/trial',