Skip to content

Commit

Permalink
feat: delete verification records by orgId (#779)
Browse files Browse the repository at this point in the history
* feat: delete verification records

Signed-off-by: bhavanakarwade <[email protected]>

* fix: refactored enum

Signed-off-by: bhavanakarwade <[email protected]>

---------

Signed-off-by: bhavanakarwade <[email protected]>
  • Loading branch information
bhavanakarwade authored Jun 17, 2024
1 parent 7bb71cc commit 368e1eb
Show file tree
Hide file tree
Showing 8 changed files with 65 additions and 39 deletions.
10 changes: 6 additions & 4 deletions apps/api-gateway/src/verification/verification.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ import { User } from '../authz/decorators/user.decorator';
import { GetAllProofRequestsDto } from './dto/get-all-proof-requests.dto';
import { IProofRequestSearchCriteria } from './interfaces/verification.interface';
import { ProofRequestType, SortFields } from './enum/verification.enum';
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import { user } from '@prisma/client';

@UseFilters(CustomExceptionFilter)
@Controller()
Expand Down Expand Up @@ -342,20 +344,20 @@ export class VerificationController {
@ApiBearerAuth()
@Roles(OrgRoles.OWNER)
@UseGuards(AuthGuard('jwt'), OrgRolesGuard)
async deleteOrganizationInvitation(
async deleteVerificationRecordsByOrgId(
@Param(
'orgId',
new ParseUUIDPipe({
exceptionFactory: (): Error => {
throw new BadRequestException(`Invalid format for orgId`);
throw new BadRequestException(ResponseMessages.organisation.error.invalidOrgId);
}
})
)
orgId: string,
@User() user: IUserRequest,
@User() user: user,
@Res() res: Response
): Promise<Response> {
await this.verificationService.deleteVerificationRecord(orgId, user?.['id']);
await this.verificationService.deleteVerificationRecords(orgId, user);
const finalResponse: IResponse = {
statusCode: HttpStatus.OK,
message: ResponseMessages.verification.success.deleteVerificationRecord
Expand Down
7 changes: 4 additions & 3 deletions apps/api-gateway/src/verification/verification.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { IPresentation, IProofRequest, IProofRequestSearchCriteria } from './int
import { IProofPresentation } from './interfaces/verification.interface';
// To do make a similar interface in API-gateway
import { IRequestProof } from 'apps/verification/src/interfaces/verification.interface';
import { user } from '@prisma/client';


@Injectable()
Expand Down Expand Up @@ -128,8 +129,8 @@ export class VerificationService extends BaseService {
}
}

async deleteVerificationRecord(orgId: string, userId: string): Promise<IVerificationRecords> {
const payload = { orgId, userId };
return this.sendNatsMessage(this.verificationServiceProxy, 'delete-verification-record', payload);
async deleteVerificationRecords(orgId: string, userDetails: user): Promise<IVerificationRecords> {
const payload = { orgId, userDetails };
return this.sendNatsMessage(this.verificationServiceProxy, 'delete-verification-records', payload);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -235,5 +235,5 @@ export class VerificationRepository {
throw error;
}
}

}
10 changes: 5 additions & 5 deletions apps/verification/src/verification.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { VerificationService } from './verification.service';
import { MessagePattern } from '@nestjs/microservices';
import { IProofPresentation, IProofPresentationData, IProofRequests, IRequestProof, ISendProofRequestPayload } from './interfaces/verification.interface';
import { IUserRequest } from '@credebl/user-request/user-request.interface';
import { presentations } from '@prisma/client';
import { presentations, user } from '@prisma/client';
import { IProofPresentationDetails, IProofPresentationList, IVerificationRecords } from '@credebl/common/interfaces/verification.interface';

@Controller()
Expand Down Expand Up @@ -79,9 +79,9 @@ export class VerificationController {
return this.verificationService.getVerifiedProofdetails(proofId, orgId);
}

@MessagePattern({ cmd: 'delete-verification-record' })
async deleteVerificationRecord(payload: {orgId: string, userId: string}): Promise<IVerificationRecords> {
const { orgId, userId } = payload;
return this.verificationService.deleteVerificationRecord(orgId, userId);
@MessagePattern({ cmd: 'delete-verification-records' })
async deleteVerificationRecord(payload: {orgId: string, userDetails: user}): Promise<IVerificationRecords> {
const { orgId, userDetails } = payload;
return this.verificationService.deleteVerificationRecords(orgId, userDetails);
}
}
42 changes: 35 additions & 7 deletions apps/verification/src/verification.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import { map } from 'rxjs/operators';
import { IGetAllProofPresentations, IProofRequestSearchCriteria, IGetProofPresentationById, IProofPresentation, IProofRequestPayload, IRequestProof, ISendProofRequestPayload, IVerifyPresentation, IVerifiedProofData, IInvitation } from './interfaces/verification.interface';
import { VerificationRepository } from './repositories/verification.repository';
import { CommonConstants } from '@credebl/common/common.constant';
import { RecordType, agent_invitations, org_agents, organisation, presentations } from '@prisma/client';
import { AutoAccept, OrgAgentType } from '@credebl/enum/enum';
import { RecordType, agent_invitations, org_agents, organisation, presentations, user } from '@prisma/client';
import { AutoAccept, OrgAgentType, VerificationProcessState } from '@credebl/enum/enum';
import { ResponseMessages } from '@credebl/common/response-messages';
import * as QRCode from 'qrcode';
import { OutOfBandVerification } from '../templates/out-of-band-verification.template';
Expand All @@ -19,6 +19,7 @@ import { IProofPresentationDetails, IProofPresentationList, IVerificationRecords
import { ProofRequestType } from 'apps/api-gateway/src/verification/enum/verification.enum';
import { UserActivityService } from '@credebl/user-activity';
import { convertUrlToDeepLinkUrl } from '@credebl/common/common.utils';
import { UserActivityRepository } from 'libs/user-activity/repositories';

@Injectable()
export class VerificationService {
Expand All @@ -28,6 +29,7 @@ export class VerificationService {
constructor(
@Inject('NATS_CLIENT') private readonly verificationServiceProxy: ClientProxy,
private readonly verificationRepository: VerificationRepository,
private readonly userActivityRepository: UserActivityRepository,
private readonly outOfBandVerification: OutOfBandVerification,
private readonly userActivityService: UserActivityService,
private readonly emailData: EmailDto,
Expand Down Expand Up @@ -932,16 +934,42 @@ export class VerificationService {
return new Promise(resolve => setTimeout(resolve, ms));
}

async deleteVerificationRecord(orgId: string, userId: string): Promise<IVerificationRecords> {
async deleteVerificationRecords(orgId: string, userDetails: user): Promise<IVerificationRecords> {
try {
const deleteProofRecords = await this.verificationRepository.deleteVerificationRecordsByOrgId(orgId);


if (0 === deleteProofRecords?.deleteResult?.count) {
throw new NotFoundException(ResponseMessages.verification.error.verificationRecordsNotFound);
}

const statusCounts = {
[VerificationProcessState.PROPOSAL_SENT]: 0,
[VerificationProcessState.PROPOSAL_RECEIVED]: 0,
[VerificationProcessState.REQUEST_SENT]: 0,
[VerificationProcessState.REQUEST_RECEIVED]: 0,
[VerificationProcessState.PRESENTATION_RECEIVED]: 0,
[VerificationProcessState.PRESENTATION_SENT]: 0,
[VerificationProcessState.DONE]: 0,
[VerificationProcessState.DECLIEND]: 0,
[VerificationProcessState.ABANDONED]: 0
};

await Promise.all(deleteProofRecords.recordsToDelete.map(async (record) => {
statusCounts[record.state]++;
}));

const filteredStatusCounts = Object.fromEntries(
Object.entries(statusCounts).filter(entry => 0 < entry[1])
);

const deletedVerificationData = {
deletedProofRecordsCount : deleteProofRecords?.deleteResult?.count
deletedProofRecordsCount : deleteProofRecords?.deleteResult?.count,
deletedRecordsStatusCount : filteredStatusCounts
};

await this.userActivityService.deletedRecordsDetails(userId, orgId, RecordType.VERIFICATION_RECORD, deletedVerificationData);
return deleteProofRecords;
await this.userActivityRepository._orgDeletedActivity(orgId, userDetails, deletedVerificationData, RecordType.VERIFICATION_RECORD);

return deleteProofRecords;
} catch (error) {
this.logger.error(`[deleteVerificationRecords] - error in deleting verification records: ${JSON.stringify(error)}`);
throw new RpcException(error.response ? error.response : error);
Expand Down
12 changes: 12 additions & 0 deletions libs/enum/src/enum.ts
Original file line number Diff line number Diff line change
Expand Up @@ -144,4 +144,16 @@ export enum TemplateIdentifier {
export enum PromiseResult {
REJECTED = 'rejected',
FULFILLED = 'fulfilled'
}

export enum VerificationProcessState {
PROPOSAL_SENT = 'proposal-sent',
PROPOSAL_RECEIVED = 'proposal-received',
REQUEST_SENT = 'request-sent',
REQUEST_RECEIVED = 'request-received',
PRESENTATION_SENT = 'presentation-sent',
PRESENTATION_RECEIVED = 'presentation-received',
DECLIEND = 'declined',
ABANDONED = 'abandoned',
DONE = 'done'
}
15 changes: 1 addition & 14 deletions libs/user-activity/repositories/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import { HttpException, Inject, Injectable, Logger } from '@nestjs/common';
import { IUsersActivity} from '../interface';
import { PrismaService } from '@credebl/prisma-service';
import { RecordType, user, user_activity, user_org_delete_activity } from '@prisma/client';
import { RecordType, user, user_activity } from '@prisma/client';
import { map } from 'rxjs';
import { ClientProxy } from '@nestjs/microservices';

Expand All @@ -26,19 +26,6 @@ export class UserActivityRepository {
});
}

async deletedActivity(userId: string, orgId: string, recordType: RecordType, txnMetadata:object, userEmail?: string): Promise<user_org_delete_activity> {
return this.prisma.user_org_delete_activity.create({
data: {
userId,
orgId,
recordType,
txnMetadata,
deletedBy: userId,
userEmail
}
});
}

async getRecentActivities(userId: string, limit: number): Promise<IUsersActivity[]> {
return this.prisma.user_activity.findMany({
where: {
Expand Down
6 changes: 1 addition & 5 deletions libs/user-activity/src/user-activity.service.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/* eslint-disable camelcase */
import { Injectable } from '@nestjs/common';
import { UserActivityRepository } from '../repositories';
import { RecordType, user_activity, user_org_delete_activity } from '@prisma/client';
import { user_activity } from '@prisma/client';
import { IUsersActivity } from '../interface';

@Injectable()
Expand All @@ -16,10 +16,6 @@ export class UserActivityService {
return this.userActivityRepository.logActivity(userId, orgId, action, details);
}

async deletedRecordsDetails(userId: string, orgId: string, recordType: RecordType, txnMetadata:object): Promise<user_org_delete_activity> {
return this.userActivityRepository.deletedActivity(userId, orgId, recordType, txnMetadata);
}

async getUserActivity(userId: string, limit: number): Promise<IUsersActivity[]> {
return this.userActivityRepository.getRecentActivities(userId, limit);
}
Expand Down

0 comments on commit 368e1eb

Please sign in to comment.