2022-11-07 16:53:47 -05:00
|
|
|
import { APP_UPLOAD_LOCATION, userUtils } from '@app/common';
|
2023-01-11 21:34:36 -05:00
|
|
|
import { APIKeyEntity, AssetEntity, UserEntity } from '@app/infra';
|
2023-01-17 09:43:45 -05:00
|
|
|
import { QueueName, JobName } from '@app/job';
|
2022-11-07 16:53:47 -05:00
|
|
|
import { IUserDeletionJob } from '@app/job/interfaces/user-deletion.interface';
|
|
|
|
|
import { Process, Processor } from '@nestjs/bull';
|
2023-01-04 16:33:13 -05:00
|
|
|
import { Logger } from '@nestjs/common';
|
2022-11-07 16:53:47 -05:00
|
|
|
import { InjectRepository } from '@nestjs/typeorm';
|
|
|
|
|
import { Job } from 'bull';
|
|
|
|
|
import { join } from 'path';
|
|
|
|
|
import fs from 'fs';
|
|
|
|
|
import { Repository } from 'typeorm';
|
|
|
|
|
|
2023-01-17 09:43:45 -05:00
|
|
|
@Processor(QueueName.USER_DELETION)
|
2022-11-07 16:53:47 -05:00
|
|
|
export class UserDeletionProcessor {
|
2023-01-04 16:33:13 -05:00
|
|
|
private logger = new Logger(UserDeletionProcessor.name);
|
|
|
|
|
|
2022-11-07 16:53:47 -05:00
|
|
|
constructor(
|
|
|
|
|
@InjectRepository(UserEntity)
|
|
|
|
|
private userRepository: Repository<UserEntity>,
|
|
|
|
|
|
|
|
|
|
@InjectRepository(AssetEntity)
|
|
|
|
|
private assetRepository: Repository<AssetEntity>,
|
2023-01-02 15:22:33 -05:00
|
|
|
|
|
|
|
|
@InjectRepository(APIKeyEntity)
|
|
|
|
|
private apiKeyRepository: Repository<APIKeyEntity>,
|
2022-11-07 16:53:47 -05:00
|
|
|
) {}
|
|
|
|
|
|
2023-01-17 09:43:45 -05:00
|
|
|
@Process(JobName.USER_DELETION)
|
2022-11-07 16:53:47 -05:00
|
|
|
async processUserDeletion(job: Job<IUserDeletionJob>) {
|
|
|
|
|
const { user } = job.data;
|
2023-01-04 16:33:13 -05:00
|
|
|
|
2022-11-07 16:53:47 -05:00
|
|
|
// just for extra protection here
|
2023-01-04 16:33:13 -05:00
|
|
|
if (!userUtils.isReadyForDeletion(user)) {
|
|
|
|
|
this.logger.warn(`Skipped user that was not ready for deletion: id=${user.id}`);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.logger.log(`Deleting user: ${user.id}`);
|
|
|
|
|
|
|
|
|
|
try {
|
2022-11-07 16:53:47 -05:00
|
|
|
const basePath = APP_UPLOAD_LOCATION;
|
2022-12-10 18:01:29 -06:00
|
|
|
const userAssetDir = join(basePath, user.id);
|
2023-01-04 16:33:13 -05:00
|
|
|
this.logger.warn(`Removing user from filesystem: ${userAssetDir}`);
|
2022-12-10 18:01:29 -06:00
|
|
|
fs.rmSync(userAssetDir, { recursive: true, force: true });
|
2023-01-04 16:33:13 -05:00
|
|
|
|
|
|
|
|
this.logger.warn(`Removing user from database: ${user.id}`);
|
2023-01-02 15:22:33 -05:00
|
|
|
await this.apiKeyRepository.delete({ userId: user.id });
|
2022-12-10 18:01:29 -06:00
|
|
|
await this.assetRepository.delete({ userId: user.id });
|
2022-11-07 16:53:47 -05:00
|
|
|
await this.userRepository.remove(user);
|
2023-01-04 16:33:13 -05:00
|
|
|
} catch (error: any) {
|
|
|
|
|
this.logger.error(`Failed to remove user`);
|
|
|
|
|
this.logger.error(error, error?.stack);
|
|
|
|
|
throw error;
|
2022-11-07 16:53:47 -05:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|