diff --git a/apps/ecosystem/interfaces/ecosystem.interfaces.ts b/apps/ecosystem/interfaces/ecosystem.interfaces.ts index 50040f120..0fc061f0a 100644 --- a/apps/ecosystem/interfaces/ecosystem.interfaces.ts +++ b/apps/ecosystem/interfaces/ecosystem.interfaces.ts @@ -66,6 +66,7 @@ export interface CredDefMessage { schemaId: string; schema: Record; credentialDefinitionRequest: string; + credentialDefinition: Record; }; registrationMetadata: Record; schemaMetadata: Record; @@ -116,6 +117,8 @@ interface CredentialDefinitionPayload { tag: string; issuerId: string; schemaId: string; + type: string; + value: Record; } export interface submitTransactionPayload { diff --git a/apps/ecosystem/src/ecosystem.repository.ts b/apps/ecosystem/src/ecosystem.repository.ts index 19ba3355a..5269530d1 100644 --- a/apps/ecosystem/src/ecosystem.repository.ts +++ b/apps/ecosystem/src/ecosystem.repository.ts @@ -109,19 +109,19 @@ export class EcosystemRepository { const ecosystemDetails = await this.prisma.ecosystem.findMany({ where: { ecosystemOrgs: { - some: { - orgId - } + some: { + orgId + } } }, - include:{ + include: { ecosystemOrgs: { - where: { - orgId - }, - include:{ - ecosystemRole: true - } + where: { + orgId + }, + include: { + ecosystemRole: true + } } } }); @@ -166,11 +166,11 @@ export class EcosystemRepository { } catch (error) { this.logger.error(`error: ${JSON.stringify(error)}`); throw new InternalServerErrorException(error); - } + } } - async getEcosystemMembersCount (ecosystemId: string): Promise { + async getEcosystemMembersCount(ecosystemId: string): Promise { try { const membersCount = await this.prisma.ecosystem_orgs.count( { @@ -179,24 +179,24 @@ export class EcosystemRepository { } } ); - return membersCount; + return membersCount; } catch (error) { this.logger.error(`error: ${JSON.stringify(error)}`); throw new InternalServerErrorException(error); } } - async getEcosystemEndorsementsCount (ecosystemId: string): Promise { + async getEcosystemEndorsementsCount(ecosystemId: string): Promise { try { const endorsementsCount = await this.prisma.endorsement_transaction.count({ where: { ecosystemOrgs: { ecosystemId - + } } }); - return endorsementsCount; + return endorsementsCount; } catch (error) { this.logger.error(`error: ${JSON.stringify(error)}`); throw new InternalServerErrorException(error); @@ -385,7 +385,7 @@ export class EcosystemRepository { }, include: { ecosystem: true, - ecosystemRole:true + ecosystemRole: true }, take: pageSize, skip: (pageNumber - 1) * pageSize, @@ -665,6 +665,26 @@ export class EcosystemRepository { } } + // eslint-disable-next-line camelcase + async findRecordsByNameAndVersion(name: string, version: string): Promise { + try { + return this.prisma.$queryRaw`SELECT * FROM endorsement_transaction WHERE "requestBody"->>'name' = ${name} AND "requestBody"->>'version' = ${version}`; + } catch (error) { + this.logger.error(`Error in getting ecosystem schema: ${error.message} `); + throw error; + } + } + + // eslint-disable-next-line camelcase + async findRecordsByCredDefTag(tag: string): Promise { + try { + return this.prisma.$queryRaw`SELECT * FROM endorsement_transaction WHERE "requestBody"->>'tag' = ${tag}`; + } catch (error) { + this.logger.error(`Error in getting ecosystem credential-definition: ${error.message} `); + throw error; + } + } + async updateTransactionDetails( endorsementId: string, schemaTransactionRequest: string @@ -732,7 +752,7 @@ export class EcosystemRepository { throw error; } } - + // eslint-disable-next-line camelcase async saveCredDef(credDefResult: saveCredDef): Promise { try { @@ -771,35 +791,35 @@ export class EcosystemRepository { async updateEndorsementRequestStatus(ecosystemId: string, endorsementId: string): Promise { try { - - const endorsementTransaction = await this.prisma.endorsement_transaction.findUnique({ - where: { id: endorsementId, status: endorsementTransactionStatus.REQUESTED } - }); - - if (!endorsementTransaction) { - throw new NotFoundException(ResponseMessages.ecosystem.error.EndorsementTransactionNotFoundException); - } - const { ecosystemOrgId } = endorsementTransaction; - - const endorsementTransactionEcosystemOrg = await this.prisma.ecosystem_orgs.findUnique({ - where: { id: ecosystemOrgId } - }); - - if (endorsementTransactionEcosystemOrg.ecosystemId === ecosystemId) { - const updatedEndorsementTransaction = await this.prisma.endorsement_transaction.update({ - where: { id: endorsementId }, - data: { - status: endorsementTransactionStatus.DECLINED - } - }); - - return updatedEndorsementTransaction; - } else { - throw new NotFoundException(ResponseMessages.ecosystem.error.OrgOrEcosystemNotFoundExceptionForEndorsementTransaction); - } + + const endorsementTransaction = await this.prisma.endorsement_transaction.findUnique({ + where: { id: endorsementId, status: endorsementTransactionStatus.REQUESTED } + }); + + if (!endorsementTransaction) { + throw new NotFoundException(ResponseMessages.ecosystem.error.EndorsementTransactionNotFoundException); + } + const { ecosystemOrgId } = endorsementTransaction; + + const endorsementTransactionEcosystemOrg = await this.prisma.ecosystem_orgs.findUnique({ + where: { id: ecosystemOrgId } + }); + + if (endorsementTransactionEcosystemOrg.ecosystemId === ecosystemId) { + const updatedEndorsementTransaction = await this.prisma.endorsement_transaction.update({ + where: { id: endorsementId }, + data: { + status: endorsementTransactionStatus.DECLINED + } + }); + + return updatedEndorsementTransaction; + } else { + throw new NotFoundException(ResponseMessages.ecosystem.error.OrgOrEcosystemNotFoundExceptionForEndorsementTransaction); + } } catch (error) { - this.logger.error(`Error in updating endorsement transaction status: ${error.message}`); - throw error; - } + this.logger.error(`Error in updating endorsement transaction status: ${error.message}`); + throw error; } + } } diff --git a/apps/ecosystem/src/ecosystem.service.ts b/apps/ecosystem/src/ecosystem.service.ts index 3d6b2a26e..2a31a045f 100644 --- a/apps/ecosystem/src/ecosystem.service.ts +++ b/apps/ecosystem/src/ecosystem.service.ts @@ -69,8 +69,8 @@ export class EcosystemService { // eslint-disable-next-line camelcase async getAllEcosystem(payload: { orgId: string }): Promise { - const getAllEcosystemDetails = await this.ecosystemRepository.getAllEcosystemDetails(payload.orgId); - + const getAllEcosystemDetails = await this.ecosystemRepository.getAllEcosystemDetails(payload.orgId); + if (!getAllEcosystemDetails) { throw new NotFoundException(ResponseMessages.ecosystem.error.update); } @@ -82,15 +82,15 @@ export class EcosystemService { * * @returns ecosystem dashboard details */ - async getEcosystemDashboardDetails(ecosystemId: string): Promise { - try { - return await this.ecosystemRepository.getEcosystemDashboardDetails(ecosystemId); - } catch (error) { - this.logger.error(`In ecosystem dashboard details : ${JSON.stringify(error)}`); - throw new RpcException(error.response ? error.response : error); - } + async getEcosystemDashboardDetails(ecosystemId: string): Promise { + try { + return await this.ecosystemRepository.getEcosystemDashboardDetails(ecosystemId); + } catch (error) { + this.logger.error(`In ecosystem dashboard details : ${JSON.stringify(error)}`); + throw new RpcException(error.response ? error.response : error); } - + } + /** * Description: get an ecosystem invitation * @returns Get sent ecosystem invitation details @@ -157,7 +157,7 @@ export class EcosystemService { */ async acceptRejectEcosystemInvitations(acceptRejectInvitation: AcceptRejectEcosystemInvitationDto): Promise { try { - + const { orgId, status, invitationId, orgName, orgDid } = acceptRejectInvitation; const invitation = await this.ecosystemRepository.getEcosystemInvitationById(invitationId); @@ -286,6 +286,11 @@ export class EcosystemService { */ async requestSchemaEndorsement(requestSchemaPayload: RequestSchemaEndorsement, orgId: number, ecosystemId: string): Promise { try { + const schemaRequestExist = await this.ecosystemRepository.findRecordsByNameAndVersion(requestSchemaPayload?.name, requestSchemaPayload?.version); + + if (0 !== schemaRequestExist.length) { + throw new ConflictException(ResponseMessages.ecosystem.error.schemaAlreadyExist); + } const ecosystemMemberDetails = await this.ecosystemRepository.getAgentDetails(orgId); if (!ecosystemMemberDetails) { @@ -340,6 +345,13 @@ export class EcosystemService { async requestCredDeffEndorsement(requestCredDefPayload: RequestCredDeffEndorsement, orgId: number, ecosystemId: string): Promise { try { + + const credDefRequestExist = await this.ecosystemRepository.findRecordsByCredDefTag(requestCredDefPayload?.tag); + + if (0 !== credDefRequestExist.length) { + throw new ConflictException(ResponseMessages.ecosystem.error.credDefAlreadyExist); + } + const ecosystemMemberDetails = await this.ecosystemRepository.getAgentDetails(orgId); if (!ecosystemMemberDetails) { throw new InternalServerErrorException(ResponseMessages.ecosystem.error.notFound); @@ -383,7 +395,8 @@ export class EcosystemService { throw new InternalServerErrorException(ResponseMessages.ecosystem.error.requestCredDefTransaction); } - return this.ecosystemRepository.storeTransactionRequest(schemaTransactionResponse, requestCredDefPayload, endorsementTransactionType.CREDENTIAL_DEFINITION); + const requestBody = credDefTransactionRequest.message.credentialDefinitionState.credentialDefinition; + return this.ecosystemRepository.storeTransactionRequest(schemaTransactionResponse, requestBody, endorsementTransactionType.CREDENTIAL_DEFINITION); } catch (error) { this.logger.error(`In request cred-def endorsement : ${JSON.stringify(error)}`); @@ -562,7 +575,9 @@ export class EcosystemService { payload.credentialDefinition = { tag: parsedRequestPayload.operation.tag, issuerId: ecosystemMemberDetails.orgDid, - schemaId: endorsementTransactionPayload.requestBody['schemaId'] + schemaId: endorsementTransactionPayload.requestBody['schemaId'], + type: endorsementTransactionPayload.requestBody['type'], + value: endorsementTransactionPayload.requestBody['value'] }; } @@ -602,6 +617,7 @@ export class EcosystemService { } return saveSchemaDetails; } else if (endorsementTransactionPayload.type === endorsementTransactionType.CREDENTIAL_DEFINITION) { + const schemaDetails = await this.ecosystemRepository.getSchemaDetailsById(endorsementTransactionPayload.requestBody['schemaId']); const saveCredentialDefinition: saveCredDef = { schemaLedgerId: endorsementTransactionPayload.requestBody['schemaId'], @@ -612,6 +628,7 @@ export class EcosystemService { orgId: ecosystemMemberDetails.orgId, schemaId: schemaDetails.id }; + const saveCredDefDetails = await this.ecosystemRepository.saveCredDef(saveCredentialDefinition); if (!saveCredDefDetails) { throw new InternalServerErrorException(ResponseMessages.ecosystem.error.saveCredDef); @@ -752,12 +769,12 @@ export class EcosystemService { ] }; - const ecosystemOrgData = await this.ecosystemRepository.fetchEcosystemOrg(queryEcoOrgs); + const ecosystemOrgData = await this.ecosystemRepository.fetchEcosystemOrg(queryEcoOrgs); if (ecosystemOrgData['ecosystemRole']['name'] !== EcosystemRoles.ECOSYSTEM_LEAD) { query.ecosystemOrgs['orgId'] = orgId; } - + if (type) { query['type'] = type; } @@ -770,13 +787,13 @@ export class EcosystemService { } - /** - * - * @param ecosystemId - * @param endorsementId - * @param orgId - * @returns EndorsementTransactionRequest Status message - */ + /** + * + * @param ecosystemId + * @param endorsementId + * @param orgId + * @returns EndorsementTransactionRequest Status message + */ async declineEndorsementRequestByLead(ecosystemId:string, endorsementId:string): Promise { try { diff --git a/libs/common/src/response-messages/index.ts b/libs/common/src/response-messages/index.ts index 18564fbaa..001d51bdf 100644 --- a/libs/common/src/response-messages/index.ts +++ b/libs/common/src/response-messages/index.ts @@ -214,6 +214,8 @@ export const ResponseMessages = { requestCredDefTransaction: 'Error while submitting transaction', notFound: 'Organization not found', leadNotFound: 'Lead details not found', + schemaAlreadyExist: 'Schema name and schema version already exist', + credDefAlreadyExist: 'Credential definition already exist', saveSchema: 'Error while storing the schema details', saveCredDef: 'Error while storing the credential-definition details', invalidOrgId: 'Invalid organization Id',