Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: get all proof presentations API #384

Merged
merged 4 commits into from
Dec 28, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 28 additions & 14 deletions apps/api-gateway/src/verification/dto/get-all-proof-requests.dto.ts
Original file line number Diff line number Diff line change
@@ -1,27 +1,41 @@
import { ApiProperty } from "@nestjs/swagger";
import { Type } from "class-transformer";
import { IsOptional } from "class-validator";
import { SortValue } from "../../enum";
import { ApiProperty } from '@nestjs/swagger';
import { Transform, Type } from 'class-transformer';
import { IsEnum, IsOptional } from 'class-validator';
import { SortValue } from '../../enum';
import { trim } from '@credebl/common/cast.helper';
import { SortFields } from '../enum/verification.enum';

export class GetAllProofRequestsDto {
@ApiProperty({ required: false })
@ApiProperty({ required: false, example: '1' })
@IsOptional()
pageNumber: number = 1;

@ApiProperty({ required: false })
@IsOptional()
@Transform(({ value }) => trim(value))
@Type(() => String)
searchByText: string = '';

@ApiProperty({ required: false })
@ApiProperty({ required: false, example: '10' })
@IsOptional()
pageSize: number = 10;

@ApiProperty({ required: false })

@ApiProperty({
enum: [SortValue.DESC, SortValue.ASC],
required: false
})
@Transform(({ value }) => trim(value))
@IsOptional()
sortByValue: string = SortValue.DESC;

@ApiProperty({ required: false })
@IsEnum(SortValue)
sortBy: string = SortValue.DESC;

@ApiProperty({
required: false
})
@Transform(({ value }) => trim(value))
@IsOptional()
sorting: string = 'id';
@IsEnum(SortFields)
sortField: string = SortFields.CREATED_DATE_TIME;

}

6 changes: 6 additions & 0 deletions apps/api-gateway/src/verification/enum/verification.enum.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
export enum SortFields {
CREATED_DATE_TIME = 'createDateTime',
STATUS = 'state',
CONNECTION_ID = 'connectionId',
PRESENTATION_ID = 'presentationId'
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@ export interface IProofRequestAttribute {
credentialName: string;
}

export interface IProofRequestsSearchCriteria {
export interface IProofRequestSearchCriteria {
pageNumber: number;
pageSize: number;
sorting: string;
sortByValue: string;
sortField: string;
sortBy: string;
searchByText: string;
user?: IUserRequestInterface
}

59 changes: 19 additions & 40 deletions apps/api-gateway/src/verification/verification.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import { UnauthorizedErrorDto } from '../dtos/unauthorized-error.dto';
import { ForbiddenErrorDto } from '../dtos/forbidden-error.dto';
import { OutOfBandRequestProof, RequestProof } from './dto/request-proof.dto';
import { VerificationService } from './verification.service';
import IResponseType from '@credebl/common/interfaces/response.interface';
import IResponseType, { IResponse } from '@credebl/common/interfaces/response.interface';
import { Response } from 'express';
import { ResponseMessages } from '@credebl/common/response-messages';
import { IUserRequest } from '@credebl/user-request/user-request.interface';
Expand All @@ -31,7 +31,8 @@ import { CustomExceptionFilter } from 'apps/api-gateway/common/exception-handler
import { ImageServiceService } from '@credebl/image-service';
import { User } from '../authz/decorators/user.decorator';
import { GetAllProofRequestsDto } from './dto/get-all-proof-requests.dto';
import { IProofRequestsSearchCriteria } from './interfaces/verification.interface';
import { IProofRequestSearchCriteria } from './interfaces/verification.interface';
import { SortFields } from './enum/verification.enum';

@UseFilters(CustomExceptionFilter)
@Controller()
Expand Down Expand Up @@ -107,43 +108,21 @@ export class VerificationController {
* Get all proof presentations
* @param user
* @param orgId
* @returns Get all proof presentation
* @returns All proof presentations details
*/
@Get('/orgs/:orgId/proofs')
@ApiOperation({
summary: `Get all proof presentations`,
description: `Get all proof presentations`
})

@ApiQuery({
name: 'pageNumber',
type: Number,
required: false
summary: `Get all proof presentations by orgId`,
description: `Get all proof presentations by orgId`
})
@ApiQuery({
name: 'pageSize',
type: Number,
name: 'sortField',
enum: SortFields,
required: false
})
@ApiQuery({
name: 'searchByText',
type: String,
required: false
})
@ApiQuery({
name: 'sorting',
type: String,
required: false
})
@ApiQuery({
name: 'sortByValue',
type: String,
required: false
})

@ApiResponse({ status: 200, description: 'Success', type: ApiResponseDto })
@ApiUnauthorizedResponse({ status: 401, description: 'Unauthorized', type: UnauthorizedErrorDto })
@ApiForbiddenResponse({ status: 403, description: 'Forbidden', type: ForbiddenErrorDto })
})
@ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto })
@ApiUnauthorizedResponse({ status: HttpStatus.UNAUTHORIZED, description: 'Unauthorized', type: UnauthorizedErrorDto })
@ApiForbiddenResponse({ status: HttpStatus.FORBIDDEN, description: 'Forbidden', type: ForbiddenErrorDto })
@ApiBearerAuth()
@Roles(OrgRoles.OWNER, OrgRoles.ADMIN, OrgRoles.ISSUER, OrgRoles.VERIFIER, OrgRoles.MEMBER, OrgRoles.HOLDER)
@UseGuards(AuthGuard('jwt'), OrgRolesGuard)
Expand All @@ -152,21 +131,21 @@ export class VerificationController {
@Res() res: Response,
@User() user: IUserRequest,
@Param('orgId') orgId: string
): Promise<object> {
const { pageSize, searchByText, pageNumber, sorting, sortByValue } = getAllProofRequests;
const proofRequestsSearchCriteria: IProofRequestsSearchCriteria = {
): Promise<Response> {
const { pageSize, searchByText, pageNumber, sortField, sortBy } = getAllProofRequests;
const proofRequestsSearchCriteria: IProofRequestSearchCriteria = {
pageNumber,
searchByText,
pageSize,
sorting,
sortByValue
sortField,
sortBy
};

const proofPresentationDetails = await this.verificationService.getProofPresentations(proofRequestsSearchCriteria, user, orgId);
const finalResponse: IResponseType = {
const finalResponse: IResponse = {
statusCode: HttpStatus.OK,
message: ResponseMessages.verification.success.fetch,
data: proofPresentationDetails.response
data: proofPresentationDetails
};
return res.status(HttpStatus.OK).json(finalResponse);
}
Expand Down
11 changes: 5 additions & 6 deletions apps/api-gateway/src/verification/verification.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ import { BaseService } from 'libs/service/base.service';
import { OutOfBandRequestProof, RequestProof } from './dto/request-proof.dto';
import { IUserRequest } from '@credebl/user-request/user-request.interface';
import { WebhookPresentationProof } from './dto/webhook-proof.dto';
import { IProofRequestsSearchCriteria } from './interfaces/verification.interface';
import { IProofRequestSearchCriteria } from './interfaces/verification.interface';
import { IProofPresentationList } from '@credebl/common/interfaces/verification.interface';


@Injectable()
Expand All @@ -18,13 +19,11 @@ export class VerificationService extends BaseService {
/**
* Get all proof presentations
* @param orgId
* @param user
* @returns Get all proof presentation
* @returns All proof presentations details
*/

getProofPresentations(proofRequestsSearchCriteria: IProofRequestsSearchCriteria, user: IUserRequest, orgId: string): Promise<{ response: object }> {
getProofPresentations(proofRequestsSearchCriteria: IProofRequestSearchCriteria, user: IUserRequest, orgId: string): Promise<IProofPresentationList> {
const payload = { proofRequestsSearchCriteria, user, orgId };
return this.sendNats(this.verificationServiceProxy, 'get-proof-presentations', payload);
return this.sendNatsMessage(this.verificationServiceProxy, 'get-all-proof-presentations', payload);
}

/**
Expand Down
8 changes: 4 additions & 4 deletions apps/verification/src/interfaces/verification.interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -125,16 +125,16 @@ export interface ProofPresentationPayload {
}

export interface IProofRequests {
proofRequestsSearchCriteria: IProofRequestsSearchCriteria;
proofRequestsSearchCriteria: IProofRequestSearchCriteria;
user: IUserRequest;
orgId: string;
}

export interface IProofRequestsSearchCriteria {
export interface IProofRequestSearchCriteria {
pageNumber: number;
pageSize: number;
sorting: string;
sortByValue: string;
sortField: string;
sortBy: string;
searchByText: string;
}

32 changes: 12 additions & 20 deletions apps/verification/src/repositories/verification.repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@ import { PrismaService } from '@credebl/prisma-service';
import { Injectable, Logger, NotFoundException } from '@nestjs/common';
// eslint-disable-next-line camelcase
import { org_agents, organisation, platform_config, presentations } from '@prisma/client';
import { ProofPresentationPayload } from '../interfaces/verification.interface';
import { IProofRequestSearchCriteria, ProofPresentationPayload } from '../interfaces/verification.interface';
import { IUserRequest } from '@credebl/user-request/user-request.interface';
import { IProofRequestsSearchCriteria } from 'apps/api-gateway/src/verification/interfaces/verification.interface';
import { IProofPresentationsListCount } from '@credebl/common/interfaces/verification.interface';
import { SortValue } from '@credebl/enum/enum';

@Injectable()
export class VerificationRepository {
Expand Down Expand Up @@ -56,24 +57,16 @@ export class VerificationRepository {
async getAllProofRequests(
user: IUserRequest,
orgId: string,
proofRequestsSearchCriteria: IProofRequestsSearchCriteria
): Promise<{
proofRequestsCount: number;
proofRequestsList: {
createDateTime: Date;
createdBy: string;
connectionId: string;
state: string;
orgId: string;
}[];
}> {
proofRequestsSearchCriteria: IProofRequestSearchCriteria
): Promise<IProofPresentationsListCount> {
try {
const proofRequestsList = await this.prisma.presentations.findMany({
where: {
orgId,
OR: [
{ connectionId: { contains: proofRequestsSearchCriteria.searchByText, mode: 'insensitive' } },
{ state: { contains: proofRequestsSearchCriteria.searchByText, mode: 'insensitive' } }
{ state: { contains: proofRequestsSearchCriteria.searchByText, mode: 'insensitive' } },
{ presentationId: { contains: proofRequestsSearchCriteria.searchByText, mode: 'insensitive' } }
]
},
select: {
Expand All @@ -86,11 +79,9 @@ export class VerificationRepository {
presentationId: true
},
orderBy: {
[proofRequestsSearchCriteria?.sorting || 'createDateTime']:
'DESC' === proofRequestsSearchCriteria?.sortByValue
? 'desc'
: 'asc'
[proofRequestsSearchCriteria.sortField]: SortValue.ASC === proofRequestsSearchCriteria.sortBy ? 'asc' : 'desc'
},

take: Number(proofRequestsSearchCriteria.pageSize),
skip: (proofRequestsSearchCriteria.pageNumber - 1) * proofRequestsSearchCriteria.pageSize
});
Expand All @@ -99,8 +90,9 @@ export class VerificationRepository {
orgId,
OR: [
{ connectionId: { contains: proofRequestsSearchCriteria.searchByText, mode: 'insensitive' } },
{ state: { contains: proofRequestsSearchCriteria.searchByText, mode: 'insensitive' } }
]
{ state: { contains: proofRequestsSearchCriteria.searchByText, mode: 'insensitive' } },
{ presentationId: { contains: proofRequestsSearchCriteria.searchByText, mode: 'insensitive' } }
]
}
});

Expand Down
5 changes: 3 additions & 2 deletions apps/verification/src/verification.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { MessagePattern } from '@nestjs/microservices';
import { IProofRequests, IRequestProof, ProofFormData, ProofPresentationPayload } from './interfaces/verification.interface';
import { IUserRequest } from '@credebl/user-request/user-request.interface';
import { presentations } from '@prisma/client';
import { IProofPresentationList } from '@credebl/common/interfaces/verification.interface';

@Controller()
export class VerificationController {
Expand All @@ -14,8 +15,8 @@ export class VerificationController {
* @param payload
* @returns Get all proof presentation
*/
@MessagePattern({ cmd: 'get-proof-presentations' })
async getProofPresentations(payload: IProofRequests): Promise<object> {
@MessagePattern({ cmd: 'get-all-proof-presentations' })
async getProofPresentations(payload: IProofRequests): Promise<IProofPresentationList> {
const { user, orgId, proofRequestsSearchCriteria} = payload;
return this.verificationService.getProofPresentations(user, orgId, proofRequestsSearchCriteria);
}
Expand Down
Loading