From 0c818f282d2ad24da2b7c312b6512ec2d5283f9f Mon Sep 17 00:00:00 2001 From: AbhilashKD <124042593+AbhilashKD@users.noreply.github.com> Date: Mon, 23 Sep 2024 13:03:21 +0530 Subject: [PATCH 1/2] Update dev-pratham-eks-deployment.yaml --- .github/workflows/dev-pratham-eks-deployment.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dev-pratham-eks-deployment.yaml b/.github/workflows/dev-pratham-eks-deployment.yaml index 98742251..a27bc03d 100644 --- a/.github/workflows/dev-pratham-eks-deployment.yaml +++ b/.github/workflows/dev-pratham-eks-deployment.yaml @@ -31,7 +31,7 @@ jobs: - name: Copy .env file env: ENV_FILE_CONTENT: ${{ secrets.ENV_FILE_CONTENT }} - run: printf "%s" "$ENV_FILE_CONTENT"" > manifest/configmap.yaml + run: printf "%s" "$ENV_FILE_CONTENT" > manifest/configmap.yaml #echo "$ENV_FILE_CONTENT" > manifest/configmap.yaml - name: Show PWD and list content and Latest 3 commits run: | From 88949752cdd2ad3a11d9c3a27fc1a8c66de8ebed Mon Sep 17 00:00:00 2001 From: poojakarma Date: Mon, 23 Sep 2024 17:17:12 +0530 Subject: [PATCH 2/2] added changes for reset api and integrate email after reset successfully --- src/adapters/postgres/user-adapter.ts | 42 +++++++++++++++++++++--- src/common/utils/formatTimeConversion.ts | 6 ++-- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/src/adapters/postgres/user-adapter.ts b/src/adapters/postgres/user-adapter.ts index 95584fa7..0d1b6996 100644 --- a/src/adapters/postgres/user-adapter.ts +++ b/src/adapters/postgres/user-adapter.ts @@ -100,7 +100,8 @@ export class PostgresUserService implements IServicelocator { //Generate Token for password Reset const tokenPayload = { - sub: userData.userId + sub: userData.userId, + email: emailOfUser } const jwtExpireTime = this.jwt_password_reset_expires_In; const jwtSecretKey = this.jwt_secret; @@ -109,6 +110,9 @@ export class PostgresUserService implements IServicelocator { // Format expiration time const time = formatTime(jwtExpireTime); + const programName = userData?.tenantData[0]?.tenantName; + const capilatizeFirstLettterOfProgram = programName ? programName.charAt(0).toUpperCase() + programName.slice(1) : ''; + //Send Notification const notificationPayload = { @@ -116,9 +120,9 @@ export class PostgresUserService implements IServicelocator { context: 'USER', key: "OnForgotPasswordReset", replacements: { - "{username}": username, + "{username}": userData?.name, "{resetToken}": resetToken, - "{programName}": userData?.tenantData[0]?.tenantName, + "{programName}": capilatizeFirstLettterOfProgram, "{expireTime}": time, "{frontEndUrl}": frontEndUrl }, @@ -159,12 +163,14 @@ export class PostgresUserService implements IServicelocator { if (!userDetail) { return APIResponse.error(response, apiId, API_RESPONSES.NOT_FOUND, API_RESPONSES.USER_NOT_FOUND, HttpStatus.NOT_FOUND); } + const userData: any = await this.findUserDetails(null, userDetail.username); const keycloakResponse = await getKeycloakAdminToken(); const keyClocktoken = keycloakResponse.data.access_token; let apiResponse: any; try { apiResponse = await this.resetKeycloakPassword( request, + userData, keyClocktoken, body.newPassword, userDetail.userId @@ -914,11 +920,13 @@ export class PostgresUserService implements IServicelocator { try { apiResponse = await this.resetKeycloakPassword( request, + userData, resToken, newPassword, userId ); - } catch (e) { + } + catch (e) { return APIResponse.error(response, apiId, "Internal Server Error", `Error : ${e?.response?.data.error}`, HttpStatus.INTERNAL_SERVER_ERROR); } @@ -939,6 +947,7 @@ export class PostgresUserService implements IServicelocator { public async resetKeycloakPassword( request: any, + userData: any, token: string, newPassword: string, userId: string @@ -981,6 +990,31 @@ export class PostgresUserService implements IServicelocator { } if (apiResponse.status === 204) { + if (userData.email) { + //Send Notification + const notificationPayload = { + isQueue: false, + context: 'USER', + key: "OnPasswordReset", + replacements: { + "{username}": userData.name, + "{programName}": userData?.tenantData?.[0]?.tenantName + ? userData.tenantData[0].tenantName.charAt(0).toUpperCase() + userData.tenantData[0].tenantName.slice(1) + : '' + }, + email: { + receipients: [userData.email] + } + }; + try { + const mailSend = await this.notificationRequest.sendNotification(notificationPayload); + if (mailSend?.result?.email?.errors.length > 0) { + // error messgae if generated by notification service + } + } catch (error) { + // error + } + } return new SuccessResponse({ statusCode: apiResponse.status, message: apiResponse.statusText, diff --git a/src/common/utils/formatTimeConversion.ts b/src/common/utils/formatTimeConversion.ts index 511388d8..62550425 100644 --- a/src/common/utils/formatTimeConversion.ts +++ b/src/common/utils/formatTimeConversion.ts @@ -1,12 +1,12 @@ export function formatTime(milliseconds) { const seconds = Math.floor(milliseconds / 1000); if (seconds < 60) { - return `${seconds} seconds`; + return `${seconds} second${seconds === 1 ? '' : 's'}`; } else if (seconds < 3600) { // less than 1 hour const minutes = Math.floor(seconds / 60); - return `${minutes} minutes`; + return `${minutes} minute${minutes === 1 ? '' : 's'}`; } else { const hours = Math.floor(seconds / 3600); - return `${hours} hours`; + return `${hours} hour${hours === 1 ? '' : 's'}`; } } \ No newline at end of file