From 47b19818d6877b7ae71c4568fb5f9de4586d71fc Mon Sep 17 00:00:00 2001 From: tipusinghaw <126460794+tipusinghaw@users.noreply.github.com> Date: Mon, 22 Jul 2024 16:14:20 +0530 Subject: [PATCH] feat: implement credential APIs for cloud wallet (#865) * feat: creat cloud wallet Signed-off-by: tipusinghaw * fix: added error handling logic in common file Signed-off-by: tipusinghaw * fix: changed nkey veriable Signed-off-by: tipusinghaw * feat: creat DID for wallet Signed-off-by: tipusinghaw * resolve conflicts Signed-off-by: tipusinghaw * feat: credential APIs for cloud-wallet Signed-off-by: tipusinghaw * fix: changed create DID route Signed-off-by: tipusinghaw * fix: changed create DID route Signed-off-by: tipusinghaw --------- Signed-off-by: tipusinghaw Signed-off-by: KulkarniShashank --- .../cloud-wallet/cloud-wallet.controller.ts | 131 +++++++++++++++++- .../src/cloud-wallet/cloud-wallet.service.ts | 25 +++- .../src/cloud-wallet/dtos/cloudWallet.dto.ts | 43 ++++-- .../src/cloud-wallet.controller.ts | 23 ++- apps/cloud-wallet/src/cloud-wallet.service.ts | 102 ++++++++++++++ libs/common/src/common.constant.ts | 3 + libs/common/src/common.service.ts | 46 +++++- .../src/interfaces/cloud-wallet.interface.ts | 25 +++- libs/common/src/interfaces/interface.ts | 13 +- libs/common/src/response-messages/index.ts | 6 +- 10 files changed, 396 insertions(+), 21 deletions(-) diff --git a/apps/api-gateway/src/cloud-wallet/cloud-wallet.controller.ts b/apps/api-gateway/src/cloud-wallet/cloud-wallet.controller.ts index 779619bb7..1e1e07b06 100644 --- a/apps/api-gateway/src/cloud-wallet/cloud-wallet.controller.ts +++ b/apps/api-gateway/src/cloud-wallet/cloud-wallet.controller.ts @@ -5,7 +5,7 @@ import { ApiBearerAuth, ApiForbiddenResponse, ApiOperation, ApiQuery, ApiRespons import { ForbiddenErrorDto } from '../dtos/forbidden-error.dto'; import { UnauthorizedErrorDto } from '../dtos/unauthorized-error.dto'; import { CloudWalletService } from './cloud-wallet.service'; -import { AcceptOfferDto, CreateCloudWalletDidDto, CreateCloudWalletDto, ReceiveInvitationUrlDTO } from './dtos/cloudWallet.dto'; +import { AcceptOfferDto, CreateCloudWalletDidDto, CreateCloudWalletDto, CredentialListDto, ReceiveInvitationUrlDTO } from './dtos/cloudWallet.dto'; import { Response } from 'express'; import { CustomExceptionFilter } from 'apps/api-gateway/common/exception-handler'; import { ApiResponseDto } from '../dtos/apiResponse.dto'; @@ -18,7 +18,7 @@ import { validateDid } from '@credebl/common/did.validator'; import { CommonConstants } from '@credebl/common/common.constant'; import { UserRoleGuard } from '../authz/guards/user-role.guard'; import { AcceptProofRequestDto } from './dtos/accept-proof-request.dto'; -import { IGetProofPresentation, IGetProofPresentationById } from '@credebl/common/interfaces/cloud-wallet.interface'; +import { IConnectionDetailsById, ICredentialDetails, IGetProofPresentation, IGetProofPresentationById, IWalletDetailsForDidList } from '@credebl/common/interfaces/cloud-wallet.interface'; import { CreateConnectionDto } from './dtos/create-connection.dto'; @@ -278,7 +278,7 @@ export class CloudWalletController { * @param orgId * @returns did */ - @Post('/create-did') + @Post('/did') @ApiOperation({ summary: 'Create new did', description: 'Create new did for cloud wallet' @@ -312,4 +312,129 @@ export class CloudWalletController { return res.status(HttpStatus.CREATED).json(finalResponse); } + + /** + * Get DID list by tenant id + * @param tenantId + * @param res + * @returns DID list + */ + @Get('/did') + @ApiOperation({ summary: 'Get DID list by tenant Id', description: 'Get DID list by tenant Id' }) + @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) + @UseGuards(AuthGuard('jwt'), UserRoleGuard) + async getDidList( + @Res() res: Response, + @User() user: user + ): Promise { + const { id, email } = user; + + const walletDetails: IWalletDetailsForDidList = { + userId: id, + email + }; + + const didListDetails = await this.cloudWalletService.getDidList(walletDetails); + const finalResponse: IResponse = { + statusCode: HttpStatus.OK, + message: ResponseMessages.cloudWallet.success.didList, + data: didListDetails + }; + return res.status(HttpStatus.OK).json(finalResponse); + } + + /** + * Get connection list by tenant id and connection id + * @param tenantId + * @param connectionId + * @param res + * @returns DID list + */ + @Get('/connection/:connectionId') + @ApiOperation({ summary: 'Get connection by connection Id', description: 'Get connection by connection Id' }) + @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) + @UseGuards(AuthGuard('jwt'), UserRoleGuard) + async getconnectionById( + @Param('connectionId') connectionId: string, + @Res() res: Response, + @User() user: user + ): Promise { + const { id, email } = user; + + const connectionDetails: IConnectionDetailsById = { + userId: id, + email, + connectionId + }; + + const connectionDetailResponse = await this.cloudWalletService.getconnectionById(connectionDetails); + const finalResponse: IResponse = { + statusCode: HttpStatus.OK, + message: ResponseMessages.cloudWallet.success.connectionById, + data: connectionDetailResponse + }; + return res.status(HttpStatus.OK).json(finalResponse); + } + + /** + * Get credential list by tenant id + * @param credentialListQueryOptions + * @param res + * @returns Credential list + */ + @Get('/credential') + @ApiOperation({ summary: 'Get credential list by tenant Id', description: 'Get credential list by tenant Id' }) + @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) + @UseGuards(AuthGuard('jwt'), UserRoleGuard) + async getCredentialList( + @Query() credentialListQueryOptions: CredentialListDto, + @Res() res: Response, + @User() user: user + ): Promise { + const { id, email } = user; + + credentialListQueryOptions.userId = id; + credentialListQueryOptions.email = email; + + const connectionDetailResponse = await this.cloudWalletService.getCredentialList(credentialListQueryOptions); + const finalResponse: IResponse = { + statusCode: HttpStatus.OK, + message: ResponseMessages.cloudWallet.success.credentials, + data: connectionDetailResponse + }; + return res.status(HttpStatus.OK).json(finalResponse); + } + + /** + * Get credential list by tenant id + * @param credentialListQueryOptions + * @param res + * @returns Credential list + */ + @Get('/credential/:credentialRecordId') + @ApiOperation({ summary: 'Get credential by credential record Id', description: 'Get credential by credential record Id' }) + @ApiResponse({ status: HttpStatus.OK, description: 'Success', type: ApiResponseDto }) + @UseGuards(AuthGuard('jwt'), UserRoleGuard) + async getCredentialByCredentialRecordId( + @Param('credentialRecordId') credentialRecordId: string, + @Res() res: Response, + @User() user: user + ): Promise { + const { id, email } = user; + + const credentialDetails: ICredentialDetails = { + userId: id, + email, + credentialRecordId + }; + + const connectionDetailResponse = await this.cloudWalletService.getCredentialByCredentialRecordId(credentialDetails); + const finalResponse: IResponse = { + statusCode: HttpStatus.OK, + message: ResponseMessages.cloudWallet.success.creddentialByRecordId, + data: connectionDetailResponse + }; + return res.status(HttpStatus.OK).json(finalResponse); + } + } diff --git a/apps/api-gateway/src/cloud-wallet/cloud-wallet.service.ts b/apps/api-gateway/src/cloud-wallet/cloud-wallet.service.ts index 5fa7370ba..7fbd20038 100644 --- a/apps/api-gateway/src/cloud-wallet/cloud-wallet.service.ts +++ b/apps/api-gateway/src/cloud-wallet/cloud-wallet.service.ts @@ -1,5 +1,5 @@ -import { IAcceptOffer, ICreateCloudWallet, ICreateCloudWalletDid, IReceiveInvitation, IAcceptProofRequest, IProofRequestRes, ICloudBaseWalletConfigure, IGetProofPresentation, IGetProofPresentationById, IGetStoredWalletInfo, IStoredWalletDetails, ICreateConnection, IConnectionInvitationResponse } from '@credebl/common/interfaces/cloud-wallet.interface'; +import { IAcceptOffer, ICreateCloudWallet, ICreateCloudWalletDid, IReceiveInvitation, IAcceptProofRequest, IProofRequestRes, ICloudBaseWalletConfigure, IGetProofPresentation, IGetProofPresentationById, IGetStoredWalletInfo, IStoredWalletDetails, IWalletDetailsForDidList, IConnectionDetailsById, ITenantDetail, ICredentialDetails, ICreateConnection, IConnectionInvitationResponse } from '@credebl/common/interfaces/cloud-wallet.interface'; import { Inject, Injectable} from '@nestjs/common'; import { ClientProxy } from '@nestjs/microservices'; import { BaseService } from 'libs/service/base.service'; @@ -62,4 +62,27 @@ export class CloudWalletService extends BaseService { return this.sendNatsMessage(this.cloudWalletServiceProxy, 'create-cloud-wallet-did', createDidDetails); } +getDidList( + walletDetails: IWalletDetailsForDidList +): Promise { + return this.sendNatsMessage(this.cloudWalletServiceProxy, 'cloud-wallet-did-list', walletDetails); +} + +getconnectionById( + connectionDetails: IConnectionDetailsById +): Promise { + return this.sendNatsMessage(this.cloudWalletServiceProxy, 'get-cloud-wallet-connection-by-id', connectionDetails); +} + +getCredentialList( + tenantDetails: ITenantDetail +): Promise { + return this.sendNatsMessage(this.cloudWalletServiceProxy, 'wallet-credential-by-id', tenantDetails); +} + +getCredentialByCredentialRecordId( + credentialDetails: ICredentialDetails +): Promise { + return this.sendNatsMessage(this.cloudWalletServiceProxy, 'wallet-credential-by-record-id', credentialDetails); +} } diff --git a/apps/api-gateway/src/cloud-wallet/dtos/cloudWallet.dto.ts b/apps/api-gateway/src/cloud-wallet/dtos/cloudWallet.dto.ts index 32ba0c95d..9dbd8345c 100644 --- a/apps/api-gateway/src/cloud-wallet/dtos/cloudWallet.dto.ts +++ b/apps/api-gateway/src/cloud-wallet/dtos/cloudWallet.dto.ts @@ -124,7 +124,7 @@ export class ReceiveInvitationUrlDTO { export class CreateCloudWalletDidDto { - @ApiProperty({ example: '000000000000000000000000000Seed2' }) + @ApiProperty({ example: '000000000000000000000000000Seed1' }) @MaxLength(32, { message: 'seed must be at most 32 characters.' }) @Transform(({ value }) => trim(value)) @IsOptional() @@ -141,19 +141,19 @@ export class ReceiveInvitationUrlDTO { @IsString({ message: 'key type be in string format.' }) keyType: string; - @ApiProperty({ example: 'polygon'}) + @ApiProperty({ example: 'indy'}) @IsNotEmpty({ message: 'method is required' }) @Transform(({ value }) => trim(value)) @IsString({ message: 'method must be in string format.' }) method: string; - @ApiPropertyOptional({example: 'indicio:testnet'}) + @ApiPropertyOptional({example: 'bcovrin:testnet'}) @IsOptional() @Transform(({ value }) => trim(value)) @IsString({ message: 'network must be in string format.' }) network?: string; - @ApiPropertyOptional({example: 'www.google.com'}) + @ApiPropertyOptional({example: 'www.github.com'}) @IsOptional() @Transform(({ value }) => trim(value)) @IsString({ message: 'domain must be in string format.' }) @@ -171,7 +171,7 @@ export class ReceiveInvitationUrlDTO { @Transform(({ value }) => trim(value)) privatekey?: string; - @ApiPropertyOptional({example: 'http://localhost:4006/docs'}) + @ApiPropertyOptional({example: 'http://localhost:6006/docs'}) @IsOptional() @IsString({ message: 'endpoint must be in string format.' }) endpoint?: string; @@ -182,18 +182,37 @@ export class ReceiveInvitationUrlDTO { @IsString({ message: 'did must be in string format.' }) did?: string; - @ApiPropertyOptional({example: 'did:indy:indicio:testnet:UEeW111G1tYo1nEkPwMef'}) + @ApiPropertyOptional({example: 'did:indy:bcovrin:testnet:UEeW111G1tYo1nEkPwMcF'}) @IsOptional() @Transform(({ value }) => trim(value)) @IsString({ message: 'endorser did must be in string format.' }) - endorserDid?: string; - - @ApiProperty({example: false}) - @ApiPropertyOptional() - @IsBoolean({ message: 'isPrimaryDid did must be true or false.' }) - isPrimaryDid: boolean = false; + endorserDid?: string; email?: string; userId?: string; +} + +export class CredentialListDto { + @ApiProperty({ required: false}) + @IsNotEmpty() + @IsOptional() + @IsString() + threadId: string; + + @ApiProperty({ required: false}) + @IsNotEmpty() + @IsOptional() + @IsString() + connectionId: string; + + @ApiProperty({ required: false}) + @IsNotEmpty() + @IsOptional() + @IsString() + state: string; + + email?: string; + + userId?: string; } \ No newline at end of file diff --git a/apps/cloud-wallet/src/cloud-wallet.controller.ts b/apps/cloud-wallet/src/cloud-wallet.controller.ts index caedf1024..b5a03d73c 100644 --- a/apps/cloud-wallet/src/cloud-wallet.controller.ts +++ b/apps/cloud-wallet/src/cloud-wallet.controller.ts @@ -2,7 +2,7 @@ import { Controller } from '@nestjs/common'; // Import the common service in the library import { CloudWalletService } from './cloud-wallet.service'; // Import the common service in connection module import { MessagePattern } from '@nestjs/microservices'; // Import the nestjs microservices package -import { IAcceptOffer, ICreateCloudWalletDid, IReceiveInvitation, IAcceptProofRequest, IProofRequestRes, ICloudBaseWalletConfigure, ICreateCloudWallet, IGetProofPresentation, IGetProofPresentationById, IGetStoredWalletInfo, IStoredWalletDetails, ICreateConnection, IConnectionInvitationResponse } from '@credebl/common/interfaces/cloud-wallet.interface'; +import { IAcceptOffer, ICreateCloudWalletDid, IReceiveInvitation, IAcceptProofRequest, IProofRequestRes, ICloudBaseWalletConfigure, ICreateCloudWallet, IGetProofPresentation, IGetProofPresentationById, IGetStoredWalletInfo, IStoredWalletDetails, ICreateConnection, IConnectionInvitationResponse, IWalletDetailsForDidList, IConnectionDetailsById, ITenantDetail, ICredentialDetails } from '@credebl/common/interfaces/cloud-wallet.interface'; @Controller() export class CloudWalletController { @@ -52,4 +52,25 @@ export class CloudWalletController { async createDid(createDidDetails: ICreateCloudWalletDid): Promise { return this.cloudWalletService.createDid(createDidDetails); } + + @MessagePattern({ cmd: 'cloud-wallet-did-list' }) + async getDidList(walletDetails: IWalletDetailsForDidList): Promise { + return this.cloudWalletService.getDidList(walletDetails); + } + + @MessagePattern({ cmd: 'get-cloud-wallet-connection-by-id' }) + async getconnectionById(connectionDetails: IConnectionDetailsById): Promise { + return this.cloudWalletService.getconnectionById(connectionDetails); + } + + @MessagePattern({ cmd: 'wallet-credential-by-id' }) + async getCredentialList(tenantDetails: ITenantDetail): Promise { + return this.cloudWalletService.getCredentialListById(tenantDetails); + } + + @MessagePattern({ cmd: 'wallet-credential-by-record-id' }) + async getCredentialByCredentialRecordId(credentialDetails: ICredentialDetails): Promise { + return this.cloudWalletService.getCredentialByRecord(credentialDetails); + } + } \ No newline at end of file diff --git a/apps/cloud-wallet/src/cloud-wallet.service.ts b/apps/cloud-wallet/src/cloud-wallet.service.ts index aeed671fa..2590d92fc 100644 --- a/apps/cloud-wallet/src/cloud-wallet.service.ts +++ b/apps/cloud-wallet/src/cloud-wallet.service.ts @@ -27,6 +27,10 @@ import { IStoredWalletDetails, CloudWallet, IStoreWalletInfo, + IWalletDetailsForDidList, + IConnectionDetailsById, + ITenantDetail, + ICredentialDetails, ICreateConnection, IConnectionInvitationResponse } from '@credebl/common/interfaces/cloud-wallet.interface'; @@ -430,4 +434,102 @@ export class CloudWalletService { await this.commonService.handleError(error); } } + + /** + * Get DID list by tenant id + * @param walletDetails + * @returns DID list + */ + async getDidList(walletDetails: IWalletDetailsForDidList): Promise { + try { + const { userId } = walletDetails; + const [baseWalletDetails, getTenant, decryptedApiKey] = await this._commonCloudWalletInfo(userId); + + const { tenantId } = getTenant; + const { agentEndpoint } = baseWalletDetails; + + const url = `${agentEndpoint}${CommonConstants.CLOUD_WALLET_DID_LIST}/${tenantId}}`; + + const didList = await this.commonService.httpGet(url, { headers: { authorization: decryptedApiKey } }); + return didList; + } catch (error) { + await this.commonService.handleError(error); + throw error; + } + } + + /** + * Get connection details by tenant id and connection id + * @param connectionDetails + * @returns Connection Details + */ + async getconnectionById(connectionDetails: IConnectionDetailsById): Promise { + try { + const { userId, connectionId } = connectionDetails; + const [baseWalletDetails, getTenant, decryptedApiKey] = await this._commonCloudWalletInfo(userId); + + const { tenantId } = getTenant; + const { agentEndpoint } = baseWalletDetails; + + const url = `${agentEndpoint}${CommonConstants.CLOUD_WALLET_CONNECTION_BY_ID}/${tenantId}}/${connectionId}`; + + const connectionDetailResponse = await this.commonService.httpGet(url, { headers: { authorization: decryptedApiKey } }); + return connectionDetailResponse; + } catch (error) { + await this.commonService.handleError(error); + throw error; + } + } + + /** + * Get credential list by tenant id + * @param tenantDetails + * @returns Connection Details + */ + async getCredentialListById(tenantDetails: ITenantDetail): Promise { + try { + const { userId, connectionId, state, threadId } = tenantDetails; + const [baseWalletDetails, getTenant, decryptedApiKey] = await this._commonCloudWalletInfo(userId); + const urlOptions = { + connectionId, + state, + threadId + }; + const {tenantId} = getTenant; + const optionalParameter = await this.commonService.createDynamicUrl(urlOptions); + + const { agentEndpoint } = baseWalletDetails; + + const url = `${agentEndpoint}${CommonConstants.CLOUD_WALLET_CREDENTIAL}/${tenantId}${optionalParameter}`; + + const credentialDetailResponse = await this.commonService.httpGet(url, { headers: { authorization: decryptedApiKey } }); + return credentialDetailResponse; + } catch (error) { + await this.commonService.handleError(error); + throw error; + } + } + + /** + * Get credential by record id + * @param credentialDetails + * @returns Connection Details + */ + async getCredentialByRecord(credentialDetails: ICredentialDetails): Promise { + try { + const { userId, credentialRecordId } = credentialDetails; + const [baseWalletDetails, getTenant, decryptedApiKey] = await this._commonCloudWalletInfo(userId); + + const {tenantId} = getTenant; + const { agentEndpoint } = baseWalletDetails; + + const url = `${agentEndpoint}${CommonConstants.CLOUD_WALLET_CREDENTIAL}/${credentialRecordId}${tenantId}`; + + const credentialDetailResponse = await this.commonService.httpGet(url, { headers: { authorization: decryptedApiKey } }); + return credentialDetailResponse; + } catch (error) { + await this.commonService.handleError(error); + throw error; + } + } } diff --git a/libs/common/src/common.constant.ts b/libs/common/src/common.constant.ts index abcb2a9e6..330f4952f 100644 --- a/libs/common/src/common.constant.ts +++ b/libs/common/src/common.constant.ts @@ -333,6 +333,9 @@ CACHE_TTL_SECONDS = 604800, CLOUD_WALLET_GET_PROOF_REQUEST = '/multi-tenancy/proofs', CLOUD_WALLET_CREATE_CONNECTION_INVITATION = '/multi-tenancy/create-invitation', CLOUD_WALLET_ACCEPT_PROOF_REQUEST = '/accept-request/', +CLOUD_WALLET_DID_LIST = '/multi-tenancy/dids/', +CLOUD_WALLET_CONNECTION_BY_ID = '/multi-tenancy/connections/', +CLOUD_WALLET_CREDENTIAL = '/multi-tenancy/credentials', // Bulk-issuance BATCH_SIZE = 100, diff --git a/libs/common/src/common.service.ts b/libs/common/src/common.service.ts index ab9c6fa8b..00298689f 100644 --- a/libs/common/src/common.service.ts +++ b/libs/common/src/common.service.ts @@ -20,6 +20,7 @@ import { ResponseService } from '@credebl/response'; import * as dotenv from 'dotenv'; import { RpcException } from '@nestjs/microservices'; import { ResponseMessages } from './response-messages'; +import { IOptionalParams } from './interfaces/interface'; dotenv.config(); @Injectable() @@ -436,4 +437,47 @@ async checkAgentHealth(baseUrl: string, apiKey: string): Promise { } } -} \ No newline at end of file +async createDynamicUrl(urlOptions: IOptionalParams): Promise { + try { + const { alias, myDid, outOfBandId, state, theirDid, theirLabel, connectionId, threadId } = urlOptions; + // Create the dynamic URL for Search Criteria + const criteriaParams = []; + + if (alias) { + criteriaParams.push(`alias=${alias}`); + } + if (myDid) { + criteriaParams.push(`myDid=${myDid}`); + } + if (outOfBandId) { + criteriaParams.push(`outOfBandId=${outOfBandId}`); + } + if (state) { + criteriaParams.push(`state=${state}`); + } + if (theirDid) { + criteriaParams.push(`theirDid=${theirDid}`); + } + if (theirLabel) { + criteriaParams.push(`theirLabel=${theirLabel}`); + } + if (threadId) { + criteriaParams.push(`threadId=${threadId}`); + } + if (connectionId) { + criteriaParams.push(`connectionId=${connectionId}`); + } + + if (0 < criteriaParams.length) { + const url: string = `?${criteriaParams.join('&')}`; + return url; + } + + return ''; + } catch (error) { + throw new Error(`Failed to create dynamic URL: ${error.message}`); + } +} + + +} diff --git a/libs/common/src/interfaces/cloud-wallet.interface.ts b/libs/common/src/interfaces/cloud-wallet.interface.ts index 2bfcc5fd5..7ab89fad6 100644 --- a/libs/common/src/interfaces/cloud-wallet.interface.ts +++ b/libs/common/src/interfaces/cloud-wallet.interface.ts @@ -66,7 +66,6 @@ export interface ICreateCloudWalletDid { endpoint?: string; did?: string; endorserDid?: string; - isPrimaryDid: boolean; email?: string; userId?: string; } @@ -190,6 +189,30 @@ export interface CloudWallet { connectionImageUrl: string; } +export interface IWalletDetailsForDidList { + userId: string; + email: string; +} + +export interface IConnectionDetailsById { + userId: string; + email: string; + connectionId: string; +} + +export interface ITenantDetail { + userId?: string; + email?: string; + threadId?: string; + connectionId?: string; + state?: string; +} + +export interface ICredentialDetails { + userId: string; + email: string; + credentialRecordId: string; +} export interface Thread { pthid: string; thid: string; diff --git a/libs/common/src/interfaces/interface.ts b/libs/common/src/interfaces/interface.ts index e1b5804dc..b0c459706 100644 --- a/libs/common/src/interfaces/interface.ts +++ b/libs/common/src/interfaces/interface.ts @@ -11,4 +11,15 @@ export interface IAccessTokenData { refresh_expires_in: number; token_type: string; scope: string; -} \ No newline at end of file +} + +export interface IOptionalParams { + alias?: string; + myDid?: string; + outOfBandId?: string; + state?: string; + theirDid?: string; + theirLabel?: string; + threadId?: string; + connectionId?: string; +} \ No newline at end of file diff --git a/libs/common/src/response-messages/index.ts b/libs/common/src/response-messages/index.ts index 0b78c6b0e..90fe33a56 100644 --- a/libs/common/src/response-messages/index.ts +++ b/libs/common/src/response-messages/index.ts @@ -523,7 +523,11 @@ export const ResponseMessages = { acceptProofRequest: 'Proof request has been successfully accepted.', createConnection: 'Connection created successfully.', getProofById: 'Proof presentation has been successfully received.', - getProofPresentation: 'Proof presentations has been successfully received.' + getProofPresentation: 'Proof presentations has been successfully received.', + didList: 'DID list fetched sucessfully', + connectionById: 'Connection record fetched successfully', + credentials: 'Credentials fetched successfully', + creddentialByRecordId: 'Credential fetched successfully' }, error: { baseWalletNotFound: 'Base wallet configuration not found',