From 4c391d243bfc87e0084ae2554daa1e5c42e7784d Mon Sep 17 00:00:00 2001 From: bhavanakarwade Date: Thu, 25 Apr 2024 20:53:48 +0530 Subject: [PATCH 1/2] feat: get all platform cred defs Signed-off-by: bhavanakarwade --- .../dto/get-all-platform-cred-defs.dto.ts | 28 +++++++++++ .../src/platform/platform.controller.ts | 33 ++++++++++++- .../src/platform/platform.service.ts | 7 +++ .../src/schema/dtos/get-all-schema.dto.ts | 3 +- .../src/schema/schema.controller.ts | 2 +- .../credential-definition.controller.ts | 9 +++- .../credential-definition.service.ts | 32 +++++++++++- .../create-credential-definition.interface.ts | 11 ++++- .../credential-definition.repository.ts | 49 ++++++++++++++++++- apps/ledger/src/schema/enum/schema.enum.ts | 8 --- libs/common/src/dtos/pagination.dto.ts | 6 +-- .../src/interfaces/cred-def.interface.ts | 27 +++++++--- libs/enum/src/enum.ts | 7 +++ 13 files changed, 193 insertions(+), 29 deletions(-) create mode 100644 apps/api-gateway/src/credential-definition/dto/get-all-platform-cred-defs.dto.ts diff --git a/apps/api-gateway/src/credential-definition/dto/get-all-platform-cred-defs.dto.ts b/apps/api-gateway/src/credential-definition/dto/get-all-platform-cred-defs.dto.ts new file mode 100644 index 000000000..c8408a921 --- /dev/null +++ b/apps/api-gateway/src/credential-definition/dto/get-all-platform-cred-defs.dto.ts @@ -0,0 +1,28 @@ +import { trim } from '@credebl/common/cast.helper'; +import { PaginationDto } from '@credebl/common/dtos/pagination.dto'; +import { CredDefSortFields, SortValue } from '@credebl/enum/enum'; +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; +import { Transform } from 'class-transformer'; +import { IsEnum, IsOptional, IsUUID } from 'class-validator'; + +export class GetAllPlatformCredDefsDto extends PaginationDto { + + @ApiProperty({ example: '1a7eac11-ff05-40d7-8351-4d7467687cad'}) + @ApiPropertyOptional() + @IsOptional() + @IsUUID('4', { message: 'Invalid format of ledgerId' }) + ledgerId?: string; + + @ApiProperty({ + required: false + }) + @Transform(({ value }) => trim(value)) + @IsOptional() + @IsEnum(CredDefSortFields) + sortField: string = CredDefSortFields.CREATED_DATE_TIME; + + @ApiProperty({ required: false }) + @IsOptional() + sortBy: string = SortValue.DESC; + +} diff --git a/apps/api-gateway/src/platform/platform.controller.ts b/apps/api-gateway/src/platform/platform.controller.ts index 6eb091a6e..1359e1b45 100644 --- a/apps/api-gateway/src/platform/platform.controller.ts +++ b/apps/api-gateway/src/platform/platform.controller.ts @@ -12,7 +12,8 @@ import { ResponseMessages } from '@credebl/common/response-messages'; import { CustomExceptionFilter } from 'apps/api-gateway/common/exception-handler'; import { AuthGuard } from '@nestjs/passport'; import * as QRCode from 'qrcode'; -import { SortFields } from '@credebl/enum/enum'; +import { CredDefSortFields, SortFields } from '@credebl/enum/enum'; +import { GetAllPlatformCredDefsDto } from '../credential-definition/dto/get-all-platform-cred-defs.dto'; @Controller('') @UseFilters(CustomExceptionFilter) @@ -58,6 +59,36 @@ export class PlatformController { return res.status(HttpStatus.OK).json(finalResponse); } + + @Get('/platform/cred-defs') + @ApiTags('credential-definitions') + @ApiOperation({ + summary: 'Get all credential-definitions from platform.', + description: 'Get all credential-definitions list from platform.' + }) + @ApiQuery({ + name: 'sortField', + enum: CredDefSortFields, + required: false + }) + @ApiBearerAuth() + @UseGuards(AuthGuard('jwt')) + @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) + async getAllCredDefs( + @Query() getAllPlatformCredDefs: GetAllPlatformCredDefsDto, + @Res() res: Response, + @User() user: IUserRequestInterface + ): Promise { + const schemasResponse = await this.platformService.getAllPlatformCredDefs(getAllPlatformCredDefs, user); + const finalResponse: IResponse = { + statusCode: HttpStatus.OK, + message: ResponseMessages.credentialDefinition.success.fetch, + data: schemasResponse + }; + return res.status(HttpStatus.OK).json(finalResponse); + } + + @Get('/platform/ledgers') @ApiTags('ledgers') @ApiOperation({ diff --git a/apps/api-gateway/src/platform/platform.service.ts b/apps/api-gateway/src/platform/platform.service.ts index b0063e3eb..6bfa64dfd 100644 --- a/apps/api-gateway/src/platform/platform.service.ts +++ b/apps/api-gateway/src/platform/platform.service.ts @@ -4,6 +4,8 @@ import { BaseService } from '../../../../libs/service/base.service'; import { ILedgers, ISchemaSearchPayload } from '../interfaces/ISchemaSearch.interface'; import { IUserRequestInterface } from '../interfaces/IUserRequestInterface'; import { INetworkUrl, ISchemaDetails } from '@credebl/common/interfaces/schema.interface'; +import { GetAllPlatformCredDefsDto } from '../credential-definition/dto/get-all-platform-cred-defs.dto'; +import { IPlatformCredDefsData } from '@credebl/common/interfaces/cred-def.interface'; @Injectable() export class PlatformService extends BaseService { @@ -19,6 +21,11 @@ export class PlatformService extends BaseService { } + async getAllPlatformCredDefs(getAllPlatformCredDefs: GetAllPlatformCredDefsDto, user: IUserRequestInterface): Promise { + const credDefs = { ...getAllPlatformCredDefs, user }; + return this.sendNatsMessage(this.platformServiceProxy, 'get-all-platform-cred-defs', credDefs); + } + async getAllLedgers(): Promise { const payload = {}; return this.sendNatsMessage(this.platformServiceProxy, 'get-all-ledgers', payload); diff --git a/apps/api-gateway/src/schema/dtos/get-all-schema.dto.ts b/apps/api-gateway/src/schema/dtos/get-all-schema.dto.ts index 4fa5e3280..3af21ac57 100644 --- a/apps/api-gateway/src/schema/dtos/get-all-schema.dto.ts +++ b/apps/api-gateway/src/schema/dtos/get-all-schema.dto.ts @@ -4,8 +4,7 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { Transform, Type } from 'class-transformer'; import { IsEnum, IsOptional, IsUUID, Min } from 'class-validator'; import { toNumber, trim } from '@credebl/common/cast.helper'; -import { CredDefSortFields, SortFields } from 'apps/ledger/src/schema/enum/schema.enum'; -import { SortValue } from '@credebl/enum/enum'; +import { CredDefSortFields, SortFields, SortValue } from '@credebl/enum/enum'; export class GetAllSchemaDto { @ApiProperty({ required: false }) diff --git a/apps/api-gateway/src/schema/schema.controller.ts b/apps/api-gateway/src/schema/schema.controller.ts index 9a1a172c3..f20450a13 100644 --- a/apps/api-gateway/src/schema/schema.controller.ts +++ b/apps/api-gateway/src/schema/schema.controller.ts @@ -19,7 +19,7 @@ import { IUserRequestInterface } from './interfaces'; import { OrgRolesGuard } from '../authz/guards/org-roles.guard'; import { CreateSchemaDto, CreateW3CSchemaDto } from '../dtos/create-schema.dto'; import { CustomExceptionFilter } from 'apps/api-gateway/common/exception-handler'; -import { CredDefSortFields, SortFields } from 'apps/ledger/src/schema/enum/schema.enum'; +import { CredDefSortFields, SortFields } from '@credebl/enum/enum'; @UseFilters(CustomExceptionFilter) @Controller('orgs') diff --git a/apps/ledger/src/credential-definition/credential-definition.controller.ts b/apps/ledger/src/credential-definition/credential-definition.controller.ts index 8bf48516b..36bd6d1c3 100644 --- a/apps/ledger/src/credential-definition/credential-definition.controller.ts +++ b/apps/ledger/src/credential-definition/credential-definition.controller.ts @@ -4,11 +4,11 @@ import { Controller, Logger } from '@nestjs/common'; import { CredentialDefinitionService } from './credential-definition.service'; import { MessagePattern } from '@nestjs/microservices'; -import { GetAllCredDefsPayload, GetCredDefBySchemaId } from './interfaces/create-credential-definition.interface'; +import { GetAllCredDefsPayload, GetCredDefBySchemaId, IPlatformCredDefs } from './interfaces/create-credential-definition.interface'; import { CreateCredDefPayload, GetCredDefPayload } from './interfaces/create-credential-definition.interface'; import { credential_definition } from '@prisma/client'; import { CredDefSchema } from './interfaces/credential-definition.interface'; -import { ICredDefDetails } from '@credebl/common/interfaces/cred-def.interface'; +import { ICredDefDetails, IPlatformCredDefsData } from '@credebl/common/interfaces/cred-def.interface'; @Controller('credential-definitions') export class CredentialDefinitionController { private logger = new Logger(); @@ -25,6 +25,11 @@ export class CredentialDefinitionController { return this.credDefService.getCredentialDefinitionById(payload); } + @MessagePattern({ cmd: 'get-all-platform-cred-defs' }) + async getAllSchema(credDefPayload: IPlatformCredDefs): Promise { + return this.credDefService.getAllPlatformCredDefs(credDefPayload); + } + @MessagePattern({ cmd: 'get-all-credential-definitions' }) async getAllCredDefs(payload: GetAllCredDefsPayload): Promise { return this.credDefService.getAllCredDefs(payload); diff --git a/apps/ledger/src/credential-definition/credential-definition.service.ts b/apps/ledger/src/credential-definition/credential-definition.service.ts index 5d03ca2e7..08616c574 100644 --- a/apps/ledger/src/credential-definition/credential-definition.service.ts +++ b/apps/ledger/src/credential-definition/credential-definition.service.ts @@ -9,7 +9,7 @@ import { import { ClientProxy, RpcException } from '@nestjs/microservices'; import { BaseService } from 'libs/service/base.service'; import { CredentialDefinitionRepository } from './repositories/credential-definition.repository'; -import { CreateCredDefPayload, CredDefPayload, GetAllCredDefsPayload, GetCredDefBySchemaId, GetCredDefPayload } from './interfaces/create-credential-definition.interface'; +import { CreateCredDefPayload, CredDefPayload, GetAllCredDefsPayload, GetCredDefBySchemaId, GetCredDefPayload, IPlatformCredDefs } from './interfaces/create-credential-definition.interface'; import { credential_definition } from '@prisma/client'; import { ResponseMessages } from '@credebl/common/response-messages'; import { CreateCredDefAgentRedirection, CredDefSchema, GetCredDefAgentRedirection } from './interfaces/credential-definition.interface'; @@ -17,7 +17,7 @@ import { map } from 'rxjs/operators'; import { OrgAgentType, SortValue } from '@credebl/enum/enum'; import { Cache } from 'cache-manager'; import { CACHE_MANAGER } from '@nestjs/cache-manager'; -import { ICredDefDetails } from '@credebl/common/interfaces/cred-def.interface'; +import { ICredDefDetails, IPlatformCredDefsData } from '@credebl/common/interfaces/cred-def.interface'; @Injectable() export class CredentialDefinitionService extends BaseService { constructor( @@ -171,6 +171,34 @@ export class CredentialDefinitionService extends BaseService { } } + async getAllPlatformCredDefs(credDefsPayload: IPlatformCredDefs): Promise { + try { + const response = await this.credentialDefinitionRepository.getAllPlatformCredDefsDetails(credDefsPayload); + + const credDefResponse: IPlatformCredDefsData = { + totalItems: response.credDefCount, + hasNextPage: credDefsPayload.pageSize * credDefsPayload.pageNumber < response.credDefCount, + hasPreviousPage: 1 < credDefsPayload.pageNumber, + nextPage: credDefsPayload.pageNumber + 1, + previousPage: credDefsPayload.pageNumber - 1, + lastPage: Math.ceil(response.credDefCount / credDefsPayload.pageSize), + data: response.credDefResult + }; + + if (0 !== response.credDefCount) { + return credDefResponse; + + } else { + throw new NotFoundException(ResponseMessages.credentialDefinition.error.NotFound); + } + + + } catch (error) { + this.logger.error(`Error in retrieving all credential definitions: ${error}`); + throw new RpcException(error.response ? error.response : error); + } + } + async getCredentialDefinitionById(payload: GetCredDefPayload): Promise { try { const { credentialDefinitionId, orgId } = payload; diff --git a/apps/ledger/src/credential-definition/interfaces/create-credential-definition.interface.ts b/apps/ledger/src/credential-definition/interfaces/create-credential-definition.interface.ts index 7067508a5..0309d173f 100644 --- a/apps/ledger/src/credential-definition/interfaces/create-credential-definition.interface.ts +++ b/apps/ledger/src/credential-definition/interfaces/create-credential-definition.interface.ts @@ -22,6 +22,16 @@ export interface CreateCredDefPayload { orgId?: string; } +export interface IPlatformCredDefs { + ledgerId?: string; + pageNumber?: number; + pageSize?: number; + sortField?: string; + sortBy?: string; + search?: string; + user?: IUserRequestInterface +} + export interface CredDefPayload { userId?: string, schemaId?: string; @@ -46,7 +56,6 @@ export class GetAllCredDefsDto { revocable?: boolean; sortByValue?: string; } - export interface GetAllCredDefsPayload { credDefSearchCriteria: GetAllCredDefsDto, user: IUserRequestInterface, diff --git a/apps/ledger/src/credential-definition/repositories/credential-definition.repository.ts b/apps/ledger/src/credential-definition/repositories/credential-definition.repository.ts index d0b67b1f5..8345d6fce 100644 --- a/apps/ledger/src/credential-definition/repositories/credential-definition.repository.ts +++ b/apps/ledger/src/credential-definition/repositories/credential-definition.repository.ts @@ -1,11 +1,11 @@ /* eslint-disable camelcase */ -import { CredDefPayload, GetAllCredDefsDto } from '../interfaces/create-credential-definition.interface'; +import { CredDefPayload, GetAllCredDefsDto, IPlatformCredDefs } from '../interfaces/create-credential-definition.interface'; import { PrismaService } from '@credebl/prisma-service'; import { credential_definition, org_agents, org_agents_type, organisation, schema } from '@prisma/client'; import { Injectable, Logger } from '@nestjs/common'; import { ResponseMessages } from '@credebl/common/response-messages'; import { BulkCredDefSchema, CredDefSchema } from '../interfaces/credential-definition.interface'; -import { ICredDefData } from '@credebl/common/interfaces/cred-def.interface'; +import { ICredDefData, IPlatformCredDefDetails } from '@credebl/common/interfaces/cred-def.interface'; import { SortValue } from '@credebl/enum/enum'; @Injectable() @@ -57,6 +57,51 @@ export class CredentialDefinitionRepository { } } + async getAllPlatformCredDefsDetails(credDefsPayload: IPlatformCredDefs): Promise { + try { + const { ledgerId, search, sortBy, sortField, pageNumber, pageSize } = credDefsPayload || {}; + const credDefResult = await this.prisma.credential_definition.findMany({ + where: { + schema: { + ledgerId + }, + OR: [ + { tag: { contains: search, mode: 'insensitive' } }, + { credentialDefinitionId: { contains: search, mode: 'insensitive' } }, + { schemaLedgerId: { contains: search, mode: 'insensitive' } } + ] + }, + select: { + createDateTime: true, + tag: true, + schemaId: true, + orgId: true, + schemaLedgerId: true, + createdBy: true, + credentialDefinitionId: true, + revocable: true + }, + orderBy: { + [sortField]: SortValue.DESC === sortBy ? SortValue.DESC : SortValue.ASC + }, + take: Number(pageSize), + skip: (pageNumber - 1) * pageSize + }); + + const credDefCount = await this.prisma.credential_definition.count({ + where: { + schema: { + ledgerId + } + } + }); + return { credDefCount, credDefResult }; + } catch (error) { + this.logger.error(`Error in getting credential definitions: ${error}`); + throw error; + } + } + async getByAttribute(schema: string, tag: string): Promise { try { const response = await this.prisma.credential_definition.findFirst({ where: { schemaLedgerId: schema, tag: { contains: tag, mode: 'insensitive' } } }); diff --git a/apps/ledger/src/schema/enum/schema.enum.ts b/apps/ledger/src/schema/enum/schema.enum.ts index cafabff1d..ada972ce4 100644 --- a/apps/ledger/src/schema/enum/schema.enum.ts +++ b/apps/ledger/src/schema/enum/schema.enum.ts @@ -9,11 +9,3 @@ export enum SortFields { PUBLISHER_DID = 'publisherDid', ISSUER_ID = 'issuerId' } - -export enum CredDefSortFields { - ID = 'id', - CREATED_DATE_TIME = 'createDateTime', - TAG = 'tag', - LEDGER_ID = 'schemaLedgerId', - CRED_DEF_ID= 'credentialDefinitionId' -} \ No newline at end of file diff --git a/libs/common/src/dtos/pagination.dto.ts b/libs/common/src/dtos/pagination.dto.ts index 0805416b7..f321c0ed3 100644 --- a/libs/common/src/dtos/pagination.dto.ts +++ b/libs/common/src/dtos/pagination.dto.ts @@ -8,18 +8,18 @@ export class PaginationDto { @IsOptional() @Transform(({ value }) => toNumber(value)) @Min(1, { message: 'Page number must be greater than 0' }) - pageNumber = 1; + pageNumber: number = 1; @ApiProperty({ required: false }) @IsOptional() @Type(() => String) - search = ''; + search: string = ''; @ApiProperty({ required: false, default: 10 }) @IsOptional() @Transform(({ value }) => toNumber(value)) @Min(1, { message: 'Page size must be greater than 0' }) @Max(100, { message: 'Page size must be less than 100' }) - pageSize = 10; + pageSize: number = 10; } diff --git a/libs/common/src/interfaces/cred-def.interface.ts b/libs/common/src/interfaces/cred-def.interface.ts index ec6b204fd..dc9a45f0f 100644 --- a/libs/common/src/interfaces/cred-def.interface.ts +++ b/libs/common/src/interfaces/cred-def.interface.ts @@ -1,10 +1,4 @@ -export interface ICredDefDetails { - totalItems: number; - hasNextPage: boolean; - hasPreviousPage: boolean; - nextPage: number; - previousPage: number; - lastPage: number; +export interface ICredDefDetails extends IPaginationDetails{ data: ICredDefData[]; } @@ -18,3 +12,22 @@ export interface ICredDefData { orgId: string; revocable: boolean; } + +export interface IPlatformCredDefDetails { + credDefCount: number; + credDefResult: ICredDefData[]; + } + + export interface IPaginationDetails { + totalItems: number; + hasNextPage: boolean; + hasPreviousPage: boolean; + nextPage: number; + previousPage: number; + lastPage: number; + } + + export interface IPlatformCredDefsData extends IPaginationDetails{ + data: ICredDefData[]; + } + \ No newline at end of file diff --git a/libs/enum/src/enum.ts b/libs/enum/src/enum.ts index 7e4c028ce..d5af443fd 100644 --- a/libs/enum/src/enum.ts +++ b/libs/enum/src/enum.ts @@ -13,6 +13,13 @@ export enum SortFields { ISSUER_ID = 'issuerId' } +export enum CredDefSortFields { + CREATED_DATE_TIME = 'createDateTime', + TAG = 'tag', + LEDGER_ID = 'schemaLedgerId', + CRED_DEF_ID= 'credentialDefinitionId' +} + export enum AgentType { AFJ = 'AFJ', ACAPY = 'ACAPY' From fc2617a6704effb5757275e11260698e53a89400 Mon Sep 17 00:00:00 2001 From: bhavanakarwade Date: Fri, 26 Apr 2024 15:29:11 +0530 Subject: [PATCH 2/2] reafctor: modify get all platform cred defs dto Signed-off-by: bhavanakarwade --- .../dto/get-all-platform-cred-defs.dto.ts | 4 ++- .../credential-definition.service.ts | 34 +++++++++---------- .../create-credential-definition.interface.ts | 2 +- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/apps/api-gateway/src/credential-definition/dto/get-all-platform-cred-defs.dto.ts b/apps/api-gateway/src/credential-definition/dto/get-all-platform-cred-defs.dto.ts index c8408a921..1224f50f0 100644 --- a/apps/api-gateway/src/credential-definition/dto/get-all-platform-cred-defs.dto.ts +++ b/apps/api-gateway/src/credential-definition/dto/get-all-platform-cred-defs.dto.ts @@ -8,10 +8,11 @@ import { IsEnum, IsOptional, IsUUID } from 'class-validator'; export class GetAllPlatformCredDefsDto extends PaginationDto { @ApiProperty({ example: '1a7eac11-ff05-40d7-8351-4d7467687cad'}) + @Transform(({ value }) => trim(value)) @ApiPropertyOptional() @IsOptional() @IsUUID('4', { message: 'Invalid format of ledgerId' }) - ledgerId?: string; + ledgerId: string; @ApiProperty({ required: false @@ -22,6 +23,7 @@ export class GetAllPlatformCredDefsDto extends PaginationDto { sortField: string = CredDefSortFields.CREATED_DATE_TIME; @ApiProperty({ required: false }) + @Transform(({ value }) => trim(value)) @IsOptional() sortBy: string = SortValue.DESC; diff --git a/apps/ledger/src/credential-definition/credential-definition.service.ts b/apps/ledger/src/credential-definition/credential-definition.service.ts index 08616c574..d9b9ed687 100644 --- a/apps/ledger/src/credential-definition/credential-definition.service.ts +++ b/apps/ledger/src/credential-definition/credential-definition.service.ts @@ -173,24 +173,24 @@ export class CredentialDefinitionService extends BaseService { async getAllPlatformCredDefs(credDefsPayload: IPlatformCredDefs): Promise { try { - const response = await this.credentialDefinitionRepository.getAllPlatformCredDefsDetails(credDefsPayload); - - const credDefResponse: IPlatformCredDefsData = { - totalItems: response.credDefCount, - hasNextPage: credDefsPayload.pageSize * credDefsPayload.pageNumber < response.credDefCount, - hasPreviousPage: 1 < credDefsPayload.pageNumber, - nextPage: credDefsPayload.pageNumber + 1, - previousPage: credDefsPayload.pageNumber - 1, - lastPage: Math.ceil(response.credDefCount / credDefsPayload.pageSize), - data: response.credDefResult - }; - - if (0 !== response.credDefCount) { - return credDefResponse; + const { pageSize, pageNumber } = credDefsPayload; + const response = await this.credentialDefinitionRepository.getAllPlatformCredDefsDetails(credDefsPayload); + + const credDefResponse: IPlatformCredDefsData = { + totalItems: response.credDefCount, + hasNextPage: pageSize * pageNumber < response.credDefCount, + hasPreviousPage: 1 < pageNumber, + nextPage: pageNumber + 1, + previousPage: pageNumber - 1, + lastPage: Math.ceil(response.credDefCount / pageSize), + data: response.credDefResult + }; - } else { - throw new NotFoundException(ResponseMessages.credentialDefinition.error.NotFound); - } + if (0 !== response.credDefCount) { + return credDefResponse; + } else { + throw new NotFoundException(ResponseMessages.credentialDefinition.error.NotFound); + } } catch (error) { diff --git a/apps/ledger/src/credential-definition/interfaces/create-credential-definition.interface.ts b/apps/ledger/src/credential-definition/interfaces/create-credential-definition.interface.ts index 0309d173f..0e8a31cbd 100644 --- a/apps/ledger/src/credential-definition/interfaces/create-credential-definition.interface.ts +++ b/apps/ledger/src/credential-definition/interfaces/create-credential-definition.interface.ts @@ -29,7 +29,7 @@ export interface IPlatformCredDefs { sortField?: string; sortBy?: string; search?: string; - user?: IUserRequestInterface + user: IUserRequestInterface } export interface CredDefPayload {