From 061a1ffeebd50761f85ea26afccf006a1024e062 Mon Sep 17 00:00:00 2001 From: Yannick1712 <52333989+Yannick1712@users.noreply.github.com> Date: Sat, 24 Jan 2026 11:18:03 +0100 Subject: [PATCH] [DEV-4540] block userData root --- .../recommendation/recommendation.service.ts | 25 +++++++++++++++++++ .../models/user-data/user-data.controller.ts | 10 ++++++++ .../user/models/user-data/user-data.entity.ts | 8 ++++++ .../models/user-data/user-data.service.ts | 5 ++++ 4 files changed, 48 insertions(+) diff --git a/src/subdomains/generic/user/models/recommendation/recommendation.service.ts b/src/subdomains/generic/user/models/recommendation/recommendation.service.ts index 3e4d3309ad..92a49e23f8 100644 --- a/src/subdomains/generic/user/models/recommendation/recommendation.service.ts +++ b/src/subdomains/generic/user/models/recommendation/recommendation.service.ts @@ -273,6 +273,31 @@ export class RecommendationService { return this.updateRecommendationInternal(entity, { isConfirmed: true, confirmationDate: new Date() }); } + async blockUserDataRoot(userDataId: number): Promise { + const userData = await this.userDataService.getUserData(userDataId); + + const recommendations = await this.getAllRecommendationForUserData(userData.id); + let sourceRecommendation = await this.recommendationRepo.findOne({ + where: { recommended: { id: userData.id } }, + relations: { recommender: true }, + }); + + await this.userDataService.blockUserData(userData, 'manual root block'); + + for (const recommendation of recommendations) { + await this.userDataService.blockUserData(recommendation.recommender, 'manual root block - recommended'); + } + + while (sourceRecommendation) { + await this.userDataService.blockUserData(sourceRecommendation.recommender, 'manual root block - recommender'); + + sourceRecommendation = await this.recommendationRepo.findOne({ + where: { recommended: { id: sourceRecommendation.recommender.id } }, + relations: { recommender: true }, + }); + } + } + // --- NOTIFICATIONS --- // private async sendInvitationMail(entity: Recommendation): Promise { try { diff --git a/src/subdomains/generic/user/models/user-data/user-data.controller.ts b/src/subdomains/generic/user/models/user-data/user-data.controller.ts index 0653eb9183..d6988b897d 100644 --- a/src/subdomains/generic/user/models/user-data/user-data.controller.ts +++ b/src/subdomains/generic/user/models/user-data/user-data.controller.ts @@ -26,6 +26,7 @@ import { BankDataService } from 'src/subdomains/generic/user/models/bank-data/ba import { CreateBankDataDto } from 'src/subdomains/generic/user/models/bank-data/dto/create-bank-data.dto'; import { UploadFileDto } from 'src/subdomains/generic/user/models/user-data/dto/upload-file.dto'; import { FeeService } from 'src/subdomains/supporting/payment/services/fee.service'; +import { RecommendationService } from '../recommendation/recommendation.service'; import { DownloadUserDataDto } from '../user/dto/download-user-data.dto'; import { CreateUserDataDto } from './dto/create-user-data.dto'; import { UpdateUserDataDto } from './dto/update-user-data.dto'; @@ -44,6 +45,7 @@ export class UserDataController { private readonly feeService: FeeService, private readonly documentService: KycDocumentService, private readonly kycLogService: KycLogService, + private readonly recommendationService: RecommendationService, ) {} @Get() @@ -115,6 +117,14 @@ export class UserDataController { return this.userDataService.createUserData({ ...dto, status: UserDataStatus.KYC_ONLY }); } + @Delete(':id/root') + @ApiBearerAuth() + @ApiExcludeEndpoint() + @UseGuards(AuthGuard(), RoleGuard(UserRole.ADMIN), UserActiveGuard()) + async blockUserDataRoot(@Param('id') id: string): Promise { + return this.recommendationService.blockUserDataRoot(+id); + } + // --- DISCOUNT CODES --- // @Put(':id/fee') diff --git a/src/subdomains/generic/user/models/user-data/user-data.entity.ts b/src/subdomains/generic/user/models/user-data/user-data.entity.ts index 70c22c1cb2..23331a4214 100644 --- a/src/subdomains/generic/user/models/user-data/user-data.entity.ts +++ b/src/subdomains/generic/user/models/user-data/user-data.entity.ts @@ -409,6 +409,14 @@ export class UserData extends IEntity { return [this.id, update]; } + blockUserData(): UpdateResult { + const update: Partial = { status: UserDataStatus.BLOCKED }; + + Object.assign(this, update); + + return [this.id, update]; + } + deactivateUserData(): UpdateResult { const update: Partial = { status: UserDataStatus.DEACTIVATED, diff --git a/src/subdomains/generic/user/models/user-data/user-data.service.ts b/src/subdomains/generic/user/models/user-data/user-data.service.ts index acdc49e8cb..9d8f0c9e0d 100644 --- a/src/subdomains/generic/user/models/user-data/user-data.service.ts +++ b/src/subdomains/generic/user/models/user-data/user-data.service.ts @@ -561,6 +561,11 @@ export class UserDataService { await this.userDataNotificationService.deactivateAccountMail(userData); } + async blockUserData(userData: UserData, reason: string): Promise { + await this.userDataRepo.update(...userData.blockUserData()); + await this.kycLogService.createLogInternal(userData, KycLogType.RISK_STATUS, `UserData blocked: ${reason}`); + } + async refreshLastNameCheckDate(userData: UserData): Promise { await this.userDataRepo.update(...userData.refreshLastCheckedTimestamp()); }