diff --git a/apps/api-gateway/src/interfaces/ISchemaSearch.interface.ts b/apps/api-gateway/src/interfaces/ISchemaSearch.interface.ts index 51c10b237..5dcda31f4 100644 --- a/apps/api-gateway/src/interfaces/ISchemaSearch.interface.ts +++ b/apps/api-gateway/src/interfaces/ISchemaSearch.interface.ts @@ -21,3 +21,19 @@ export interface W3CSchemaPayload { type: string, title: string } + + export interface ILedgers { + id: string; + createDateTime: string; + lastChangedDateTime: string; + name: string; + networkType: string; + poolConfig: string; + isActive: boolean; + networkString: string; + registerDIDEndpoint: string; + registerDIDPayload: string; + indyNamespace: string; + networkUrl: string | null; + } + \ No newline at end of file diff --git a/apps/api-gateway/src/platform/platform.controller.ts b/apps/api-gateway/src/platform/platform.controller.ts index 997928d26..d526ad3f1 100644 --- a/apps/api-gateway/src/platform/platform.controller.ts +++ b/apps/api-gateway/src/platform/platform.controller.ts @@ -1,17 +1,18 @@ import { Controller, Get, HttpStatus, Logger, Param, Query, Res, UseFilters, UseGuards } from '@nestjs/common'; import { PlatformService } from './platform.service'; -import { ApiBearerAuth, ApiExcludeEndpoint, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; +import { ApiBearerAuth, ApiExcludeEndpoint, ApiOperation, ApiQuery, ApiResponse, ApiTags } from '@nestjs/swagger'; import { ApiResponseDto } from '../dtos/apiResponse.dto'; import { GetAllSchemaByPlatformDto } from '../schema/dtos/get-all-schema.dto'; import { IUserRequestInterface } from '../interfaces/IUserRequestInterface'; import { User } from '../authz/decorators/user.decorator'; import { Response } from 'express'; import { ISchemaSearchPayload } from '../interfaces/ISchemaSearch.interface'; -import IResponseType, { IResponse } from '@credebl/common/interfaces/response.interface'; +import { IResponse } from '@credebl/common/interfaces/response.interface'; 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 'apps/ledger/src/schema/enum/schema.enum'; @Controller('') @@ -27,6 +28,11 @@ export class PlatformController { summary: 'Get all schemas from platform.', description: 'Get all schemas from platform.' }) + @ApiQuery({ + name: 'sortField', + enum: SortFields, + required: false + }) @ApiBearerAuth() @UseGuards(AuthGuard('jwt')) @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) @@ -34,7 +40,7 @@ export class PlatformController { @Query() getAllSchemaDto: GetAllSchemaByPlatformDto, @Res() res: Response, @User() user: IUserRequestInterface - ): Promise { + ): Promise { const { ledgerId, pageSize, searchByText, pageNumber, sorting, sortByValue } = getAllSchemaDto; const schemaSearchCriteria: ISchemaSearchPayload = { ledgerId, @@ -45,10 +51,10 @@ export class PlatformController { sortBy: sortByValue }; const schemasResponse = await this.platformService.getAllSchema(schemaSearchCriteria, user); - const finalResponse: IResponseType = { + const finalResponse: IResponse = { statusCode: HttpStatus.OK, message: ResponseMessages.schema.success.fetch, - data: schemasResponse.response + data: schemasResponse }; return res.status(HttpStatus.OK).json(finalResponse); } @@ -67,10 +73,10 @@ export class PlatformController { ): Promise { const networksResponse = await this.platformService.getAllLedgers(); - const finalResponse: IResponseType = { + const finalResponse: IResponse = { statusCode: HttpStatus.OK, message: ResponseMessages.ledger.success.fetch, - data: networksResponse.response + data: networksResponse }; return res.status(HttpStatus.OK).json(finalResponse); } @@ -87,13 +93,13 @@ export class PlatformController { async getNetwrkUrl( @Param('indyNamespace') indyNamespace: string, @Res() res: Response - ): Promise { + ): Promise { const networksResponse = await this.platformService.getNetworkUrl(indyNamespace); - const finalResponse: IResponseType = { + const finalResponse: IResponse = { statusCode: HttpStatus.OK, - message: ResponseMessages.ledger.success.fetch, - data: networksResponse.response + message: ResponseMessages.ledger.success.fetchNetworkUrl, + data: networksResponse }; return res.status(HttpStatus.OK).json(finalResponse); } diff --git a/apps/api-gateway/src/platform/platform.service.ts b/apps/api-gateway/src/platform/platform.service.ts index a11e1858c..266f8c6ab 100644 --- a/apps/api-gateway/src/platform/platform.service.ts +++ b/apps/api-gateway/src/platform/platform.service.ts @@ -1,8 +1,9 @@ import { Injectable, Inject } from '@nestjs/common'; import { ClientProxy } from '@nestjs/microservices'; import { BaseService } from '../../../../libs/service/base.service'; -import { ISchemaSearchPayload } from '../interfaces/ISchemaSearch.interface'; +import { ILedgers, ISchemaSearchPayload } from '../interfaces/ISchemaSearch.interface'; import { IUserRequestInterface } from '../interfaces/IUserRequestInterface'; +import { INetworkUrl, ISchemaDetails } from '@credebl/common/interfaces/schema.interface'; @Injectable() export class PlatformService extends BaseService { @@ -12,28 +13,19 @@ export class PlatformService extends BaseService { super('PlatformService'); } - async getAllSchema(schemaSearchCriteria: ISchemaSearchPayload, user: IUserRequestInterface): Promise<{ - response: object; - }> { + async getAllSchema(schemaSearchCriteria: ISchemaSearchPayload, user: IUserRequestInterface): Promise { const schemaSearch = { schemaSearchCriteria, user }; - return this.sendNats(this.platformServiceProxy, 'get-all-schemas', schemaSearch); + return this.sendNatsMessage(this.platformServiceProxy, 'get-all-schemas', schemaSearch); } - async getAllLedgers(): Promise<{ - response: object; - }> { + async getAllLedgers(): Promise { const payload = {}; - return this.sendNats(this.platformServiceProxy, 'get-all-ledgers', payload); + return this.sendNatsMessage(this.platformServiceProxy, 'get-all-ledgers', payload); } - async getNetworkUrl(indyNamespace: string): Promise<{ - response: object; - }> { - const payload = { - indyNamespace - }; - return this.sendNats(this.platformServiceProxy, 'get-network-url', payload); + async getNetworkUrl(indyNamespace: string): Promise { + return this.sendNatsMessage(this.platformServiceProxy, 'get-network-url', indyNamespace); } async getShorteningUrlById(referenceId: string): Promise { 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 e16ec07c2..5946b0171 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 @@ -3,8 +3,8 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { SortValue } from '../../enum'; import { Transform, Type } from 'class-transformer'; -import { IsEnum, IsOptional } from 'class-validator'; -import { trim } from '@credebl/common/cast.helper'; +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'; export class GetAllSchemaDto { @@ -73,15 +73,19 @@ export class GetCredentialDefinitionBySchemaIdDto { orgId: string; } + export class GetAllSchemaByPlatformDto { - @ApiProperty() + @ApiProperty({ example: '1a7eac11-ff05-40d7-8351-4d7467687cad'}) @ApiPropertyOptional() @IsOptional() + @IsUUID('4', { message: 'Invalid format of ledgerId' }) ledgerId?: string; - @ApiProperty({ required: false }) + @ApiProperty({ required: false, default: 1 }) @IsOptional() + @Transform(({ value }) => toNumber(value)) + @Min(1, { message: 'Page number must be greater than 0' }) pageNumber: number = 1; @ApiProperty({ required: false }) @@ -89,15 +93,22 @@ export class GetAllSchemaByPlatformDto { @Type(() => String) searchByText: string = ''; - @ApiProperty({ required: false }) + @ApiProperty({ required: false, default: 10 }) @IsOptional() + @Transform(({ value }) => toNumber(value)) + @Min(1, { message: 'Page size must be greater than 0' }) pageSize: number = 10; - @ApiProperty({ required: false }) + @ApiProperty({ + required: false + }) + @Transform(({ value }) => trim(value)) @IsOptional() - sorting: string = 'id'; + @IsEnum(SortFields) + sorting: string = SortFields.CREATED_DATE_TIME; @ApiProperty({ required: false }) @IsOptional() sortByValue: string = SortValue.DESC; + } \ No newline at end of file diff --git a/apps/ledger/src/ledger.controller.ts b/apps/ledger/src/ledger.controller.ts index 02c337b59..fcd87a072 100644 --- a/apps/ledger/src/ledger.controller.ts +++ b/apps/ledger/src/ledger.controller.ts @@ -3,6 +3,7 @@ import { LedgerService } from './ledger.service'; import { MessagePattern } from '@nestjs/microservices'; import { ledgers } from '@prisma/client'; import { LedgerDetails } from './interfaces/ledgers.interface'; +import { INetworkUrl } from '@credebl/common/interfaces/schema.interface'; @Controller() export class LedgerController { @@ -14,10 +15,8 @@ export class LedgerController { } @MessagePattern({ cmd: 'get-network-url' }) - async getNetworkUrl(payload: object): Promise<{ - networkUrl: string; - }> { - return this.ledgerService.getNetworkUrl(payload); + async getNetworkUrl(indyNamespace: string): Promise { + return this.ledgerService.getNetworkUrl(indyNamespace); } @MessagePattern({ cmd: 'get-network-details-by-id' }) diff --git a/apps/ledger/src/ledger.service.ts b/apps/ledger/src/ledger.service.ts index dda91313a..c18d6c753 100644 --- a/apps/ledger/src/ledger.service.ts +++ b/apps/ledger/src/ledger.service.ts @@ -5,6 +5,7 @@ import { RpcException } from '@nestjs/microservices'; import { ledgers } from '@prisma/client'; import { ResponseMessages } from '@credebl/common/response-messages'; import { LedgerDetails } from './interfaces/ledgers.interface'; +import { INetworkUrl } from '@credebl/common/interfaces/schema.interface'; @Injectable() export class LedgerService extends BaseService { @@ -30,11 +31,9 @@ export class LedgerService extends BaseService { } } - async getNetworkUrl(payload: object): Promise<{ - networkUrl: string; - }> { + async getNetworkUrl(indyNamespace: string): Promise { try { - const getNetworkUrl = await this.ledgerRepository.getNetworkUrl(payload); + const getNetworkUrl = await this.ledgerRepository.getNetworkUrl(indyNamespace); if (!getNetworkUrl) { throw new NotFoundException(ResponseMessages.ledger.error.NotFound); diff --git a/apps/ledger/src/repositories/ledger.repository.ts b/apps/ledger/src/repositories/ledger.repository.ts index dcfd68aac..4240de525 100644 --- a/apps/ledger/src/repositories/ledger.repository.ts +++ b/apps/ledger/src/repositories/ledger.repository.ts @@ -1,7 +1,8 @@ -import { PrismaService } from "@credebl/prisma-service"; -import { Injectable, Logger } from "@nestjs/common"; -import { ledgers } from "@prisma/client"; -import { LedgerDetails } from "../interfaces/ledgers.interface"; +import { PrismaService } from '@credebl/prisma-service'; +import { Injectable, Logger } from '@nestjs/common'; +import { ledgers } from '@prisma/client'; +import { LedgerDetails } from '../interfaces/ledgers.interface'; +import { INetworkUrl } from '@credebl/common/interfaces/schema.interface'; @Injectable() @@ -21,18 +22,16 @@ export class LedgerRepository { } } - async getNetworkUrl(payload: object): Promise<{ - networkUrl: string; - }> { + async getNetworkUrl(indyNamespace: string): Promise { try { return this.prisma.ledgers.findFirst({ - where: { - indyNamespace: payload["indyNamespace"] - }, - select: { - networkUrl: true - } + where: { + indyNamespace + }, + select: { + networkUrl: true + } }); } catch (error) { this.logger.error(`Error in getNetworkUrl: ${error}`); diff --git a/apps/ledger/src/schema/repositories/schema.repository.ts b/apps/ledger/src/schema/repositories/schema.repository.ts index bd84b2785..c8ce83fda 100644 --- a/apps/ledger/src/schema/repositories/schema.repository.ts +++ b/apps/ledger/src/schema/repositories/schema.repository.ts @@ -6,7 +6,8 @@ import { ISchema, ISchemaExist, ISchemaSearchCriteria } from '../interfaces/sche import { ResponseMessages } from '@credebl/common/response-messages'; import { AgentDetails, ISchemasWithCount } from '../interfaces/schema.interface'; import { SortValue } from '@credebl/enum/enum'; -import { ICredDefWithCount } from '@credebl/common/interfaces/schema.interface'; +import { ICredDefWithCount, IPlatformSchemas } from '@credebl/common/interfaces/schema.interface'; +import { sortValue } from 'apps/api-gateway/src/enum'; @Injectable() export class SchemaRepository { @@ -192,20 +193,7 @@ export class SchemaRepository { } } - async getAllSchemaDetails(payload: ISchemaSearchCriteria): Promise<{ - schemasCount: number; - schemasResult: { - createDateTime: Date; - createdBy: string; - name: string; - version: string; - attributes: string; - schemaLedgerId: string; - publisherDid: string; - issuerId: string; - orgId: string; - }[]; - }> { + async getAllSchemaDetails(payload: ISchemaSearchCriteria): Promise { try { const schemasResult = await this.prisma.schema.findMany({ where: { @@ -229,7 +217,7 @@ export class SchemaRepository { issuerId: true }, orderBy: { - [payload.sortField]: 'desc' === payload.sortBy ? 'desc' : 'asc' + [payload.sortField]: sortValue.DESC === payload.sortBy ? sortValue.DESC : sortValue.ASC }, take: Number(payload.pageSize), skip: (payload.pageNumber - 1) * payload.pageSize diff --git a/apps/ledger/src/schema/schema.controller.ts b/apps/ledger/src/schema/schema.controller.ts index e428607a0..22c953cee 100644 --- a/apps/ledger/src/schema/schema.controller.ts +++ b/apps/ledger/src/schema/schema.controller.ts @@ -12,6 +12,7 @@ import { schema } from '@prisma/client'; import { ICredDefWithPagination, ISchemaData, + ISchemaDetails, ISchemasWithPagination } from '@credebl/common/interfaces/schema.interface'; @@ -49,24 +50,7 @@ export class SchemaController { } @MessagePattern({ cmd: 'get-all-schemas' }) - async getAllSchema(schemaSearch: ISchemaSearchPayload): Promise<{ - totalItems: number; - hasNextPage: boolean; - hasPreviousPage: boolean; - nextPage: number; - previousPage: number; - lastPage: number; - data: { - createDateTime: Date; - createdBy: string; - name: string; - schemaLedgerId: string; - version: string; - attributes: string; - publisherDid: string; - issuerId: string; - }[]; - }> { + async getAllSchema(schemaSearch: ISchemaSearchPayload): Promise { const { schemaSearchCriteria } = schemaSearch; return this.schemaService.getAllSchema(schemaSearchCriteria); } diff --git a/apps/ledger/src/schema/schema.service.ts b/apps/ledger/src/schema/schema.service.ts index a5c71aa9c..aecf32a38 100644 --- a/apps/ledger/src/schema/schema.service.ts +++ b/apps/ledger/src/schema/schema.service.ts @@ -17,7 +17,7 @@ import { IUserRequestInterface } from './interfaces/schema.interface'; import { CreateSchemaAgentRedirection, GetSchemaAgentRedirection } from './schema.interface'; import { map } from 'rxjs/operators'; import { OrgAgentType } from '@credebl/enum/enum'; -import { ICredDefWithPagination, ISchemaData, ISchemasWithPagination } from '@credebl/common/interfaces/schema.interface'; +import { ICredDefWithPagination, ISchemaData, ISchemaDetails, ISchemasWithPagination } from '@credebl/common/interfaces/schema.interface'; import { Cache } from 'cache-manager'; import { CACHE_MANAGER } from '@nestjs/cache-manager'; import { CommonConstants } from '@credebl/common/common.constant'; @@ -656,24 +656,7 @@ export class SchemaService extends BaseService { } } - async getAllSchema(schemaSearchCriteria: ISchemaSearchCriteria): Promise<{ - totalItems: number; - hasNextPage: boolean; - hasPreviousPage: boolean; - nextPage: number; - previousPage: number; - lastPage: number; - data: { - createDateTime: Date; - createdBy: string; - name: string; - schemaLedgerId: string; - version: string; - attributes: string; - publisherDid: string; - issuerId: string; - }[]; - }> { + async getAllSchema(schemaSearchCriteria: ISchemaSearchCriteria): Promise { try { const response = await this.schemaRepository.getAllSchemaDetails(schemaSearchCriteria); diff --git a/libs/common/src/interfaces/schema.interface.ts b/libs/common/src/interfaces/schema.interface.ts index c773c206a..b85f61775 100644 --- a/libs/common/src/interfaces/schema.interface.ts +++ b/libs/common/src/interfaces/schema.interface.ts @@ -13,18 +13,31 @@ export interface ISchemasWithPagination extends IPaginationDetails{ data: ISchemaData[]; } - export interface ISchemaData { + export interface ISchemaData extends ISchema { + orgId: string; + } + + export interface ISchemaDetails extends IPaginationDetails{ + data: ISchema[]; + } + + interface ISchema { createDateTime: Date; createdBy: string; name: string; + schemaLedgerId: string; version: string; attributes: string; - schemaLedgerId: string; publisherDid: string; issuerId: string; - orgId: string; } + + export interface IPlatformSchemas { + schemasCount: number; + schemasResult: ISchemaData[]; + } + export interface ICredDefData { tag: string; credentialDefinitionId: string; @@ -41,4 +54,7 @@ export interface ISchemasWithPagination extends IPaginationDetails{ credDefCount: number; credDefResult: ICredDefData[]; } - \ No newline at end of file + + export interface INetworkUrl { + networkUrl: string; + } diff --git a/libs/common/src/response-messages/index.ts b/libs/common/src/response-messages/index.ts index 89d149584..85c2c27db 100644 --- a/libs/common/src/response-messages/index.ts +++ b/libs/common/src/response-messages/index.ts @@ -181,7 +181,8 @@ export const ResponseMessages = { }, ledger: { success: { - fetch: 'Ledgers retrieved successfully.' + fetch: 'Ledgers retrieved successfully.', + fetchNetworkUrl: 'Network url retrieved successfully' }, error: { NotFound: 'No ledgers found.'