fix: use withSoftDeleted scope to remove user associations permanently (#1239)

This commit is contained in:
Ömer Faruk Aydın
2023-08-24 16:34:07 +02:00
committed by GitHub
parent d5e4a1b1ad
commit e9ba37b8de
2 changed files with 31 additions and 10 deletions

View File

@@ -5,6 +5,7 @@ import flowQueue from '../../queues/flow';
import Flow from '../../models/flow'; import Flow from '../../models/flow';
import Execution from '../../models/execution'; import Execution from '../../models/execution';
import ExecutionStep from '../../models/execution-step'; import ExecutionStep from '../../models/execution-step';
import appConfig from '../../config/app';
const deleteCurrentUser = async ( const deleteCurrentUser = async (
_parent: unknown, _parent: unknown,
@@ -14,7 +15,7 @@ const deleteCurrentUser = async (
const id = context.currentUser.id; const id = context.currentUser.id;
const flows = await context.currentUser.$relatedQuery('flows').where({ const flows = await context.currentUser.$relatedQuery('flows').where({
status: 'active', active: true,
}); });
const repeatableJobs = await flowQueue.getRepeatableJobs(); const repeatableJobs = await flowQueue.getRepeatableJobs();
@@ -39,6 +40,12 @@ const deleteCurrentUser = async (
await context.currentUser.$relatedQuery('steps').delete(); await context.currentUser.$relatedQuery('steps').delete();
await Flow.query().whereIn('id', flowIds).delete(); await Flow.query().whereIn('id', flowIds).delete();
await context.currentUser.$relatedQuery('connections').delete(); await context.currentUser.$relatedQuery('connections').delete();
await context.currentUser.$relatedQuery('identities').delete();
if (appConfig.isCloud) {
await context.currentUser.$relatedQuery('subscriptions').delete();
await context.currentUser.$relatedQuery('usageData').delete();
}
await context.currentUser.$query().delete(); await context.currentUser.$query().delete();

View File

@@ -3,6 +3,7 @@ import { Worker } from 'bullmq';
import * as Sentry from '../helpers/sentry.ee'; import * as Sentry from '../helpers/sentry.ee';
import redisConfig from '../config/redis'; import redisConfig from '../config/redis';
import logger from '../helpers/logger'; import logger from '../helpers/logger';
import appConfig from '../config/app';
import User from '../models/user'; import User from '../models/user';
import Execution from '../models/execution'; import Execution from '../models/execution';
import ExecutionStep from '../models/execution-step'; import ExecutionStep from '../models/execution-step';
@@ -12,21 +13,34 @@ export const worker = new Worker(
async (job) => { async (job) => {
const { id } = job.data; const { id } = job.data;
const user = await User.query().findById(id).throwIfNotFound(); const user = await User.query()
.withSoftDeleted()
.findById(id)
.throwIfNotFound();
const executionIds = ( const executionIds = (
await user.$relatedQuery('executions').select('executions.id') await user
.$relatedQuery('executions')
.withSoftDeleted()
.select('executions.id')
).map((execution: Execution) => execution.id); ).map((execution: Execution) => execution.id);
await ExecutionStep.query() await ExecutionStep.query()
.hardDelete() .withSoftDeleted()
.whereIn('execution_id', executionIds); .whereIn('execution_id', executionIds)
await user.$relatedQuery('executions').hardDelete(); .hardDelete();
await user.$relatedQuery('steps').hardDelete(); await user.$relatedQuery('executions').withSoftDeleted().hardDelete();
await user.$relatedQuery('flows').hardDelete(); await user.$relatedQuery('steps').withSoftDeleted().hardDelete();
await user.$relatedQuery('connections').hardDelete(); await user.$relatedQuery('flows').withSoftDeleted().hardDelete();
await user.$relatedQuery('connections').withSoftDeleted().hardDelete();
await user.$relatedQuery('identities').withSoftDeleted().hardDelete();
await user.$query().hardDelete(); if (appConfig.isCloud) {
await user.$relatedQuery('subscriptions').withSoftDeleted().hardDelete();
await user.$relatedQuery('usageData').withSoftDeleted().hardDelete();
}
await user.$query().withSoftDeleted().hardDelete();
}, },
{ connection: redisConfig } { connection: redisConfig }
); );