From a5759a4311ab018a945b3bbce040aee1a4bd4e7b Mon Sep 17 00:00:00 2001 From: bhavanakarwade <137506897+bhavanakarwade@users.noreply.github.com> Date: Fri, 21 Jun 2024 19:18:48 +0530 Subject: [PATCH] fix: delete file_upload records (#803) * feat: delete issuance records Signed-off-by: bhavanakarwade * reafctor: variables names Signed-off-by: bhavanakarwade * feat: delete issuance records by orgid Signed-off-by: bhavanakarwade * fix: file upload delete changes Signed-off-by: bhavanakarwade --------- Signed-off-by: bhavanakarwade Signed-off-by: KulkarniShashank --- .../src/connection/connection.controller.ts | 2 +- .../src/issuance/issuance.controller.ts | 2 +- .../verification/verification.controller.ts | 2 +- .../interfaces/issuance.interfaces.ts | 6 ++- apps/issuance/src/issuance.repository.ts | 42 +++++++++++++++++++ apps/issuance/src/issuance.service.ts | 11 ++++- 6 files changed, 59 insertions(+), 6 deletions(-) diff --git a/apps/api-gateway/src/connection/connection.controller.ts b/apps/api-gateway/src/connection/connection.controller.ts index b3cd53c83..b04bf69ac 100644 --- a/apps/api-gateway/src/connection/connection.controller.ts +++ b/apps/api-gateway/src/connection/connection.controller.ts @@ -332,7 +332,7 @@ export class ConnectionController { return res.status(HttpStatus.CREATED).json(finalResponse); } - @Delete('/:orgId/connections') + @Delete('/orgs/:orgId/connections') @ApiOperation({ summary: 'Delete connection record', description: 'Delete connections by orgId' }) @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) @ApiBearerAuth() diff --git a/apps/api-gateway/src/issuance/issuance.controller.ts b/apps/api-gateway/src/issuance/issuance.controller.ts index 0a8e75df2..7b3d08718 100644 --- a/apps/api-gateway/src/issuance/issuance.controller.ts +++ b/apps/api-gateway/src/issuance/issuance.controller.ts @@ -759,7 +759,7 @@ issueCredentialDto.type = 'Issuance'; return res.status(HttpStatus.CREATED).json(finalResponse); } - @Delete('/:orgId/issuance-records') + @Delete('/orgs/:orgId/issuance-records') @ApiOperation({ summary: 'Delete issuance record', description: 'Delete issuance records by orgId' }) @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) @ApiBearerAuth() diff --git a/apps/api-gateway/src/verification/verification.controller.ts b/apps/api-gateway/src/verification/verification.controller.ts index 4b8a5c8fa..5f9456f26 100644 --- a/apps/api-gateway/src/verification/verification.controller.ts +++ b/apps/api-gateway/src/verification/verification.controller.ts @@ -340,7 +340,7 @@ export class VerificationController { } -@Delete('/:orgId/verification-records') +@Delete('/orgs/:orgId/verification-records') @ApiOperation({ summary: 'Delete verification record', description: 'Delete verification records by orgId' }) @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) @ApiBearerAuth() diff --git a/apps/issuance/interfaces/issuance.interfaces.ts b/apps/issuance/interfaces/issuance.interfaces.ts index 3a3e62431..0c3ee7817 100644 --- a/apps/issuance/interfaces/issuance.interfaces.ts +++ b/apps/issuance/interfaces/issuance.interfaces.ts @@ -1,7 +1,7 @@ // eslint-disable-next-line camelcase import { AutoAccept, SchemaType } from '@credebl/enum/enum'; import { IUserRequest } from '@credebl/user-request/user-request.interface'; -import { organisation } from '@prisma/client'; +import { Prisma, organisation } from '@prisma/client'; import { IUserRequestInterface } from 'apps/agent-service/src/interface/agent-service.interface'; import { IssueCredentialType } from 'apps/api-gateway/src/issuance/interfaces'; @@ -315,4 +315,8 @@ export interface IQueuePayload{ totalJobs: number; isRetry: boolean; isLastData: boolean; +} +export interface IDeletedFileUploadRecords { + deleteFileDetails: Prisma.BatchPayload; + deleteFileUploadDetails: Prisma.BatchPayload; } \ No newline at end of file diff --git a/apps/issuance/src/issuance.repository.ts b/apps/issuance/src/issuance.repository.ts index 6b5e148f1..483b39f65 100644 --- a/apps/issuance/src/issuance.repository.ts +++ b/apps/issuance/src/issuance.repository.ts @@ -16,6 +16,7 @@ import { ResponseMessages } from '@credebl/common/response-messages'; import { FileUpload, FileUploadData, + IDeletedFileUploadRecords, IssueCredentialWebhookPayload, OrgAgent, PreviewRequest, @@ -590,6 +591,47 @@ export class IssuanceRepository { } } + async getFileUploadDataByOrgId(orgId: string): Promise { + try { + const fileDetails = await this.prisma.file_upload.findMany({ + where: { + orgId + } + }); + return fileDetails; + } catch (error) { + this.logger.error(`[getting file upload details] - error: ${JSON.stringify(error)}`); + throw error; + } + } + + async deleteFileUploadData(fileUploadIds: string[], orgId: string): Promise { + try { + return await this.prisma.$transaction(async (prisma) => { + + const deleteFileDetails = await prisma.file_data.deleteMany({ + where: { + fileUploadId: { + in: fileUploadIds + } + } + }); + + const deleteFileUploadDetails = await prisma.file_upload.deleteMany({ + where: { + orgId + } + }); + + return { deleteFileDetails, deleteFileUploadDetails }; + + }); + } catch (error) { + this.logger.error(`[Error in deleting file data] - error: ${JSON.stringify(error)}`); + throw error; + } + } + async deleteIssuanceRecordsByOrgId(orgId: string): Promise { try { const tablesToCheck = [`${PrismaTables.PRESENTATIONS}`]; diff --git a/apps/issuance/src/issuance.service.ts b/apps/issuance/src/issuance.service.ts index 3b8a24c72..195c191ac 100644 --- a/apps/issuance/src/issuance.service.ts +++ b/apps/issuance/src/issuance.service.ts @@ -1448,11 +1448,18 @@ async sendEmailForCredentialOffer(sendEmailCredentialOffer: SendEmailCredentialO async deleteIssuanceRecords(orgId: string, userDetails: user): Promise { try { + + const getFileUploadData = await this.issuanceRepository.getFileUploadDataByOrgId(orgId); + + const getFileUploadIds = getFileUploadData.map(fileData => fileData.id); + + await this.issuanceRepository.deleteFileUploadData(getFileUploadIds, orgId); + const deletedCredentialsRecords = await this.issuanceRepository.deleteIssuanceRecordsByOrgId(orgId); if (0 === deletedCredentialsRecords?.deleteResult?.count) { throw new NotFoundException(ResponseMessages.issuance.error.issuanceRecordsNotFound); - } + } const statusCounts = { [IssuanceProcessState.REQUEST_SENT]: 0, @@ -1482,7 +1489,7 @@ async sendEmailForCredentialOffer(sendEmailCredentialOffer: SendEmailCredentialO }; await this.userActivityRepository._orgDeletedActivity(orgId, userDetails, deletedIssuanceData, RecordType.ISSUANCE_RECORD); - + return deletedCredentialsRecords; } catch (error) { this.logger.error(`[deleteIssuanceRecords] - error in deleting issuance records: ${JSON.stringify(error)}`);