From 79fa61fad89d6b1a4121cf819294cd55d9fefb15 Mon Sep 17 00:00:00 2001 From: Sujit Date: Tue, 19 Aug 2025 08:25:51 +0530 Subject: [PATCH 1/6] fix/schema name save for connection and email Signed-off-by: Sujit --- apps/issuance/src/issuance.repository.ts | 14 ++++++++++++ apps/issuance/src/issuance.service.ts | 27 +++++++++++++++++++++++- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/apps/issuance/src/issuance.repository.ts b/apps/issuance/src/issuance.repository.ts index d85a9849b..1e97e9d77 100644 --- a/apps/issuance/src/issuance.repository.ts +++ b/apps/issuance/src/issuance.repository.ts @@ -741,4 +741,18 @@ export class IssuanceRepository { throw error; } } + + async saveSchemaIdIssuance(threadId: string, schemaId: string): Promise { + try { + await this.prisma.credentials.update({ + where: { threadId }, + data: { + schemaId + } + }); + } catch (error) { + this.logger.error(`[saveSchemaIdIssuance] - error: ${JSON.stringify(error)}`); + throw error; + } + } } diff --git a/apps/issuance/src/issuance.service.ts b/apps/issuance/src/issuance.service.ts index c315acab2..1c90cc1cd 100644 --- a/apps/issuance/src/issuance.service.ts +++ b/apps/issuance/src/issuance.service.ts @@ -281,6 +281,18 @@ export class IssuanceService { if (allSuccessful) { finalStatusCode = HttpStatus.CREATED; + const context = payload?.credentialData[0]?.credential?.['@context'] as string[]; + + if (Array.isArray(context) && context.includes('https://www.w3.org/2018/credentials/v1')) { + const filterData = context.filter((item) => 'https://www.w3.org/2018/credentials/v1' !== item); + const [schemaId] = filterData; + results.forEach((val) => { + if ('fulfilled' === val.status && val?.value?.threadId) { + this.issuanceRepository.saveSchemaIdIssuance(val?.value?.threadId, schemaId); + } + }); + } + finalMessage = ResponseMessages.issuance.success.create; } else if (allFailed) { finalStatusCode = HttpStatus.BAD_REQUEST; @@ -889,7 +901,6 @@ export class IssuanceService { await this.delay(500); // Wait for 0.5 seconds const sendOobOffer = await this.sendEmailForCredentialOffer(sendEmailCredentialOffer); - arraycredentialOfferResponse.push(sendOobOffer); } if (0 < errors.length) { @@ -1064,6 +1075,20 @@ export class IssuanceService { return false; } + if (isEmailSent) { + const w3cSchemaId = outOfBandIssuancePayload?.credentialFormats?.jsonld?.credential?.['@context'] as string[]; + if (w3cSchemaId && w3cSchemaId.includes('https://www.w3.org/2018/credentials/v1')) { + const filterData = w3cSchemaId.filter((item) => 'https://www.w3.org/2018/credentials/v1' !== item); + const [schemaId] = filterData; + if (credentialCreateOfferDetails.response.credentialRequestThId) { + this.issuanceRepository.saveSchemaIdIssuance( + credentialCreateOfferDetails.response.credentialRequestThId, + schemaId + ); + } + } + } + return isEmailSent; } catch (error) { const iterationNoMessage = ` at position ${iterationNo}`; From efd42766004df6fa61d4806eb52e259fba37dfb9 Mon Sep 17 00:00:00 2001 From: Sujit Date: Wed, 20 Aug 2025 20:57:45 +0530 Subject: [PATCH 2/6] fix/issues in the flow Signed-off-by: Sujit --- apps/issuance/src/issuance.repository.ts | 4 ++-- apps/issuance/src/issuance.service.ts | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/issuance/src/issuance.repository.ts b/apps/issuance/src/issuance.repository.ts index 1e97e9d77..93b16f632 100644 --- a/apps/issuance/src/issuance.repository.ts +++ b/apps/issuance/src/issuance.repository.ts @@ -230,8 +230,8 @@ export class IssuanceRepository { threadId: issueCredentialDto?.threadId, connectionId: issueCredentialDto?.connectionId, state: issueCredentialDto?.state, - schemaId, - credDefId + credDefId, + ...(schemaId ? { schemaId } : {}) }, create: { createDateTime: issueCredentialDto?.createDateTime, diff --git a/apps/issuance/src/issuance.service.ts b/apps/issuance/src/issuance.service.ts index 1c90cc1cd..dbf5e514f 100644 --- a/apps/issuance/src/issuance.service.ts +++ b/apps/issuance/src/issuance.service.ts @@ -283,11 +283,11 @@ export class IssuanceService { finalStatusCode = HttpStatus.CREATED; const context = payload?.credentialData[0]?.credential?.['@context'] as string[]; - if (Array.isArray(context) && context.includes('https://www.w3.org/2018/credentials/v1')) { - const filterData = context.filter((item) => 'https://www.w3.org/2018/credentials/v1' !== item); + if (Array.isArray(context) && context.includes(CommonConstants.W3C_SCHEMA_URL)) { + const filterData = context.filter((item) => CommonConstants.W3C_SCHEMA_URL !== item); const [schemaId] = filterData; results.forEach((val) => { - if ('fulfilled' === val.status && val?.value?.threadId) { + if (PromiseResult.FULFILLED === val.status && val?.value?.threadId) { this.issuanceRepository.saveSchemaIdIssuance(val?.value?.threadId, schemaId); } }); @@ -1077,8 +1077,8 @@ export class IssuanceService { if (isEmailSent) { const w3cSchemaId = outOfBandIssuancePayload?.credentialFormats?.jsonld?.credential?.['@context'] as string[]; - if (w3cSchemaId && w3cSchemaId.includes('https://www.w3.org/2018/credentials/v1')) { - const filterData = w3cSchemaId.filter((item) => 'https://www.w3.org/2018/credentials/v1' !== item); + if (w3cSchemaId && w3cSchemaId.includes(CommonConstants.W3C_SCHEMA_URL)) { + const filterData = w3cSchemaId.filter((item) => CommonConstants.W3C_SCHEMA_URL !== item); const [schemaId] = filterData; if (credentialCreateOfferDetails.response.credentialRequestThId) { this.issuanceRepository.saveSchemaIdIssuance( From 679cfcd45552012915140fe6fdcfdfd9983be06f Mon Sep 17 00:00:00 2001 From: Sujit Date: Thu, 21 Aug 2025 10:09:55 +0530 Subject: [PATCH 3/6] added missing constats file update Signed-off-by: Sujit --- libs/common/src/common.constant.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libs/common/src/common.constant.ts b/libs/common/src/common.constant.ts index dd282e009..734c88f77 100644 --- a/libs/common/src/common.constant.ts +++ b/libs/common/src/common.constant.ts @@ -45,6 +45,9 @@ export enum CommonConstants { URL_LEDG_GET_TAA = '/ledger/taa', URL_LEDG_POST_TAA_ACCEPT = '/ledger/taa/accept', + //W3cSCHEMA + W3C_SCHEMA_URL = 'https://www.w3.org/2018/credentials/v1', + // MESSAGING SERVICES URL_MSG_SEND_MESSAGE = '/connections/#/send-message', URL_MSG_TRUST_PING = '/connections/#/send-ping', From 3e00a4e88d5e233800455acb469e192c23870f57 Mon Sep 17 00:00:00 2001 From: Sujit Date: Fri, 22 Aug 2025 17:54:47 +0530 Subject: [PATCH 4/6] fix/resolved comments Signed-off-by: Sujit --- apps/issuance/src/issuance.repository.ts | 2 +- apps/issuance/src/issuance.service.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/issuance/src/issuance.repository.ts b/apps/issuance/src/issuance.repository.ts index 93b16f632..a3d8eff39 100644 --- a/apps/issuance/src/issuance.repository.ts +++ b/apps/issuance/src/issuance.repository.ts @@ -742,7 +742,7 @@ export class IssuanceRepository { } } - async saveSchemaIdIssuance(threadId: string, schemaId: string): Promise { + async updateSchemaIdByThreadId(threadId: string, schemaId: string): Promise { try { await this.prisma.credentials.update({ where: { threadId }, diff --git a/apps/issuance/src/issuance.service.ts b/apps/issuance/src/issuance.service.ts index dbf5e514f..c8268baad 100644 --- a/apps/issuance/src/issuance.service.ts +++ b/apps/issuance/src/issuance.service.ts @@ -286,9 +286,9 @@ export class IssuanceService { if (Array.isArray(context) && context.includes(CommonConstants.W3C_SCHEMA_URL)) { const filterData = context.filter((item) => CommonConstants.W3C_SCHEMA_URL !== item); const [schemaId] = filterData; - results.forEach((val) => { - if (PromiseResult.FULFILLED === val.status && val?.value?.threadId) { - this.issuanceRepository.saveSchemaIdIssuance(val?.value?.threadId, schemaId); + results.forEach((record) => { + if (PromiseResult.FULFILLED === record.status && record?.value?.threadId) { + this.issuanceRepository.updateSchemaIdByThreadId(record?.value?.threadId, schemaId); } }); } @@ -1081,7 +1081,7 @@ export class IssuanceService { const filterData = w3cSchemaId.filter((item) => CommonConstants.W3C_SCHEMA_URL !== item); const [schemaId] = filterData; if (credentialCreateOfferDetails.response.credentialRequestThId) { - this.issuanceRepository.saveSchemaIdIssuance( + this.issuanceRepository.updateSchemaIdByThreadId( credentialCreateOfferDetails.response.credentialRequestThId, schemaId ); From 759dd3b65594bdb9d1bd7efc4eb24520eebd93a7 Mon Sep 17 00:00:00 2001 From: Sujit Date: Fri, 22 Aug 2025 17:58:04 +0530 Subject: [PATCH 5/6] fix/change name in error for updateSchemaId Signed-off-by: Sujit --- apps/issuance/src/issuance.repository.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/issuance/src/issuance.repository.ts b/apps/issuance/src/issuance.repository.ts index a3d8eff39..7b0ea6abf 100644 --- a/apps/issuance/src/issuance.repository.ts +++ b/apps/issuance/src/issuance.repository.ts @@ -751,7 +751,7 @@ export class IssuanceRepository { } }); } catch (error) { - this.logger.error(`[saveSchemaIdIssuance] - error: ${JSON.stringify(error)}`); + this.logger.error(`[updateSchemaIdByThreadId] - error: ${JSON.stringify(error)}`); throw error; } } From 89caf050ba37979838bb1d8e314ca1e9a7a22810 Mon Sep 17 00:00:00 2001 From: shitrerohit Date: Sun, 24 Aug 2025 10:58:37 +0530 Subject: [PATCH 6/6] fix:changes in accept invitation url Signed-off-by: shitrerohit --- .../organization-invitation.template.ts | 39 ++++++++----------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/apps/organization/templates/organization-invitation.template.ts b/apps/organization/templates/organization-invitation.template.ts index e3fb38f58..b40a05ab8 100644 --- a/apps/organization/templates/organization-invitation.template.ts +++ b/apps/organization/templates/organization-invitation.template.ts @@ -1,25 +1,23 @@ export class OrganizationInviteTemplate { + public sendInviteEmailTemplate( + email: string, + orgName: string, + orgRolesDetails: object[], + firstName: string, + isUserExist: boolean + ): string { + const validUrl = isUserExist ? `${process.env.FRONT_END_URL}/sign-in` : `${process.env.FRONT_END_URL}/sign-up`; - public sendInviteEmailTemplate( - email: string, - orgName: string, - orgRolesDetails: object[], - firstName: string, - isUserExist: boolean - ): string { + const message = isUserExist + ? `Please accept the invitation using the following link:` + : `To get started, kindly register on ${process.env.PLATFORM_NAME} platform using this link:`; - const validUrl = isUserExist ? `${process.env.FRONT_END_URL}/authentication/sign-in` : `${process.env.FRONT_END_URL}/authentication/sign-up`; + const secondMessage = isUserExist + ? `After successful login into ${process.env.PLATFORM_NAME} click on "Accept Organization Invitation" link on your dashboard.` + : `After successful registration, you can log in to the platform and click on “Accept Organization Invitation” on your dashboard.`; - const message = isUserExist - ? `Please accept the invitation using the following link:` - : `To get started, kindly register on ${process.env.PLATFORM_NAME} platform using this link:`; + const Button = isUserExist ? `Accept Organization Invitation` : `Register on ${process.env.PLATFORM_NAME}`; - const secondMessage = isUserExist - ? `After successful login into ${process.env.PLATFORM_NAME} click on "Accept Organization Invitation" link on your dashboard.` - : `After successful registration, you can log in to the platform and click on “Accept Organization Invitation” on your dashboard.`; - - const Button = isUserExist ? `Accept Organization Invitation` : `Register on ${process.env.PLATFORM_NAME}`; - return ` @@ -75,8 +73,5 @@ export class OrganizationInviteTemplate { `; - - } - - -} \ No newline at end of file + } +}