From bbd55562af99d1a625d17c9b60fb18ceb4dc7560 Mon Sep 17 00:00:00 2001 From: Mayank Mishra Date: Mon, 8 Dec 2025 15:08:05 +0530 Subject: [PATCH] Add HOST_LINK environment variable and update related configurations. Normalize email addresses to lowercase in login and registration handlers. Enhance email notifications for approved and rejected applications with HOST_LINK. --- serverless.yml | 1 + src/config/config.ts | 4 +++- .../host/handlers/Host_Admin/onboarding/login.ts | 8 +++++--- .../handlers/Host_Admin/onboarding/signUp.ts | 9 ++++++--- .../minglaradmin/handlers/loginForMinglar.ts | 8 +++++--- .../minglaradmin/handlers/registration.ts | 9 +++++++-- .../settings/teammates/inviteTeammate.ts | 6 ++++-- .../services/approvalMailtoHost.service.ts | 7 +++++-- .../services/rejectionMailtoHost.service.ts | 16 ++++++++++------ 9 files changed, 46 insertions(+), 22 deletions(-) diff --git a/serverless.yml b/serverless.yml index 3c8687e..5bbd3f7 100644 --- a/serverless.yml +++ b/serverless.yml @@ -43,6 +43,7 @@ provider: MINGLAR_ADMIN_NAME: ${env:MINGLAR_ADMIN_NAME} MINGLAR_ADMIN_EMAIL: ${env:MINGLAR_ADMIN_EMAIL} AM_INVITATION_LINK: ${env:AM_INVITATION_LINK} + HOST_LINK: ${env:HOST_LINK} iam: role: diff --git a/src/config/config.ts b/src/config/config.ts index 9c7097c..77ea883 100644 --- a/src/config/config.ts +++ b/src/config/config.ts @@ -82,7 +82,8 @@ const envVarsSchema = yup //OTP Bypass BYPASS_OTP: yup.boolean().default(false).required('Bypass OTP is required'), // Email links - AM_INVITATION_LINK: yup.string().required('Link to send in AM invitation mail is required') + AM_INVITATION_LINK: yup.string().required('Link to send in AM invitation mail is required'), + HOST_LINK: yup.string().required('Link to host panel is required') }) .noUnknown(true); @@ -161,6 +162,7 @@ function getConfig() { MinglarAdminEmail: envVars.MINGLAR_ADMIN_EMAIL, MinglarAdminName: envVars.MINGLAR_ADMIN_NAME, AM_INVITATION_LINK: envVars.AM_INVITATION_LINK, + HOST_LINK: envVars.HOST_LINK, // oneSignal: { // appID: envVars.ONESIGNAL_APPID, // restApiKey: envVars.ONESIGNAL_REST_APIKEY, diff --git a/src/modules/host/handlers/Host_Admin/onboarding/login.ts b/src/modules/host/handlers/Host_Admin/onboarding/login.ts index 5577c6f..36ac9a2 100644 --- a/src/modules/host/handlers/Host_Admin/onboarding/login.ts +++ b/src/modules/host/handlers/Host_Admin/onboarding/login.ts @@ -15,7 +15,7 @@ export const handler = safeHandler(async ( ): Promise => { // Parse request body let body: { emailAddress?: string; userPassword?: string }; - + try { body = event.body ? JSON.parse(event.body) : {}; } catch (error) { @@ -28,7 +28,9 @@ export const handler = safeHandler(async ( throw new ApiError(400, 'Email and password are required'); } - const loginForHost = await hostService.loginForHost(emailAddress, userPassword); + const emailToLowerCase = emailAddress.toLowerCase() + + const loginForHost = await hostService.loginForHost(emailToLowerCase, userPassword); if (!loginForHost) { throw new ApiError(400, 'Failed to login'); @@ -40,7 +42,7 @@ export const handler = safeHandler(async ( const generateTokenForHost = await tokenService.generateAuthToken( loginForHost.id - ); + ); if (!generateTokenForHost) { throw new ApiError(500, 'Failed to generate token'); diff --git a/src/modules/host/handlers/Host_Admin/onboarding/signUp.ts b/src/modules/host/handlers/Host_Admin/onboarding/signUp.ts index 63bef4d..ab1abcf 100644 --- a/src/modules/host/handlers/Host_Admin/onboarding/signUp.ts +++ b/src/modules/host/handlers/Host_Admin/onboarding/signUp.ts @@ -7,6 +7,7 @@ import ApiError from '../../../../../common/utils/helper/ApiError'; import { encryptUserId } from '../../../../../common/utils/helper/CodeGenerator'; import { OtpGeneratorSixDigit } from '../../../../../common/utils/helper/OtpGenerator'; import { HostService } from '../../../services/host.service'; +import { sendOtpEmailForHost } from '@/modules/host/services/sendOTPEmail.service'; const hostService = new HostService(prismaClient); @@ -44,10 +45,12 @@ export const handler = safeHandler(async ( throw new ApiError(400, 'Email is required'); } + const emailToLowerCase = email.toLowerCase() + // Use a single transaction for user creation/lookup and OTP storage const transactionResult = await prismaClient.$transaction(async (tx) => { const user = await tx.user.findUnique({ - where: { emailAddress: email }, + where: { emailAddress: emailToLowerCase }, select: { emailAddress: true, id: true, userPassword: true }, }); @@ -65,7 +68,7 @@ export const handler = safeHandler(async ( } else { // create new user record within the transaction newUserLocal = await tx.user.create({ - data: { emailAddress: email, roleXid: ROLE.HOST, userRefNumber: referenceNumber }, + data: { emailAddress: emailToLowerCase, roleXid: ROLE.HOST, userRefNumber: referenceNumber }, }); } @@ -100,7 +103,7 @@ export const handler = safeHandler(async ( } // Send OTP email outside the DB transaction - // await sendOtpEmailForHost(transactionResult.newUser.emailAddress, transactionResult.otp); + await sendOtpEmailForHost(transactionResult.newUser.emailAddress, transactionResult.otp); return { statusCode: 200, diff --git a/src/modules/minglaradmin/handlers/loginForMinglar.ts b/src/modules/minglaradmin/handlers/loginForMinglar.ts index 0db40c6..80e24b3 100644 --- a/src/modules/minglaradmin/handlers/loginForMinglar.ts +++ b/src/modules/minglaradmin/handlers/loginForMinglar.ts @@ -15,20 +15,22 @@ export const handler = safeHandler(async ( ): Promise => { // Parse request body let body: { emailAddress?: string; userPassword?: string }; - + try { body = event.body ? JSON.parse(event.body) : {}; } catch (error) { throw new ApiError(400, 'Invalid JSON in request body'); } - const { emailAddress ,userPassword} = body; + const { emailAddress, userPassword } = body; if (!emailAddress) { throw new ApiError(400, 'Email is required'); } - const loginForMinglar = await minglarSerivce.loginForMinglar(emailAddress ,userPassword); + const emailToLowerCase = emailAddress.toLowerCase() + + const loginForMinglar = await minglarSerivce.loginForMinglar(emailToLowerCase, userPassword); if (!loginForMinglar) { throw new ApiError(400, 'Failed to login'); diff --git a/src/modules/minglaradmin/handlers/registration.ts b/src/modules/minglaradmin/handlers/registration.ts index cdf943b..8655167 100644 --- a/src/modules/minglaradmin/handlers/registration.ts +++ b/src/modules/minglaradmin/handlers/registration.ts @@ -5,6 +5,7 @@ import { safeHandler } from '../../../common/utils/handlers/safeHandler'; import ApiError from '../../../common/utils/helper/ApiError'; import { generateOtpHelper } from '../../../common/utils/helper/sendOtp'; import { MinglarService } from './../services/minglar.service'; +import { sendOtpEmailForMinglarAdmin } from '../services/sendOTPEmail.service'; const minglarService = new MinglarService(prismaClient); @@ -26,11 +27,15 @@ export const handler = safeHandler(async ( if (!email) { throw new ApiError(400, 'Email is required'); } + console.log(email, " -: Email") + + const emailToLowerCase = email.toLowerCase() const user = await prismaClient.user.findUnique({ - where: { emailAddress: email, isActive: true, userStatus: USER_STATUS.INVITED }, + where: { emailAddress: emailToLowerCase, isActive: true, userStatus: USER_STATUS.INVITED }, select: { emailAddress: true, id: true, userPassword: true, roleXid: true }, }); + console.log(user, "sljdfjdf") if (!user) { throw new ApiError(403, 'You are not allowed to register directly. Please contact minglar admin.'); @@ -66,7 +71,7 @@ export const handler = safeHandler(async ( throw new ApiError(500, 'Failed to send OTP'); } - // await sendOtpEmailForMinglarAdmin(newUser?.emailAddress, otpResult.otp); + await sendOtpEmailForMinglarAdmin(newUser?.emailAddress, otpResult.otp); return { statusCode: 200, diff --git a/src/modules/minglaradmin/handlers/settings/teammates/inviteTeammate.ts b/src/modules/minglaradmin/handlers/settings/teammates/inviteTeammate.ts index 63eaeec..69c84d8 100644 --- a/src/modules/minglaradmin/handlers/settings/teammates/inviteTeammate.ts +++ b/src/modules/minglaradmin/handlers/settings/teammates/inviteTeammate.ts @@ -61,6 +61,8 @@ export const handler = safeHandler(async ( throw new ApiError(400, 'Role is required'); } + const emailToLowerCase = emailAddress.toLowerCase() + // Validate role is either Co_Admin or Account_Manager if (![ROLE.CO_ADMIN, ROLE.ACCOUNT_MANAGER].includes(roleXid)) { throw new ApiError(400, 'Invalid role. Only Co_Admin and Account_Manager roles can be assigned.'); @@ -79,7 +81,7 @@ export const handler = safeHandler(async ( // Use single service method that encapsulates the transaction await minglarService.inviteTeammate( - emailAddress, + emailToLowerCase, roleXid, isFixedSalary, perValue || 0, @@ -87,7 +89,7 @@ export const handler = safeHandler(async ( ); // send email after transaction commits - await sendInvitationEmailForMinglarAdmin(emailAddress, config.AM_INVITATION_LINK); + await sendInvitationEmailForMinglarAdmin(emailToLowerCase, config.AM_INVITATION_LINK); return { statusCode: 200, diff --git a/src/modules/minglaradmin/services/approvalMailtoHost.service.ts b/src/modules/minglaradmin/services/approvalMailtoHost.service.ts index f39fbf4..30a8e24 100644 --- a/src/modules/minglaradmin/services/approvalMailtoHost.service.ts +++ b/src/modules/minglaradmin/services/approvalMailtoHost.service.ts @@ -1,5 +1,6 @@ -import { brevoService } from "@/common/email/brevoApi"; -import ApiError from "@/common/utils/helper/ApiError"; +import { brevoService } from "../../../common/email/brevoApi"; +import ApiError from "../../../common/utils/helper/ApiError"; +import config from "../../../config/config"; export async function sendEmailToHostForApprovedApplication( emailAddress: string, @@ -14,6 +15,8 @@ export async function sendEmailToHostForApprovedApplication(

Dear Host,

Congratulations, Your application to minglar admin has been approved.

You can start onboarding your activities through the host panel.

+

You can login to your account using the link below:
+ Link: ${config.HOST_LINK}

Best regards,
Minglar Team

`; diff --git a/src/modules/minglaradmin/services/rejectionMailtoHost.service.ts b/src/modules/minglaradmin/services/rejectionMailtoHost.service.ts index 48b6e2d..62ddb32 100644 --- a/src/modules/minglaradmin/services/rejectionMailtoHost.service.ts +++ b/src/modules/minglaradmin/services/rejectionMailtoHost.service.ts @@ -1,5 +1,6 @@ -import { brevoService } from "@/common/email/brevoApi"; -import ApiError from "@/common/utils/helper/ApiError"; +import { brevoService } from "../../../common/email/brevoApi"; +import ApiError from "../../../common/utils/helper/ApiError"; +import config from "../../../config/config"; export async function sendEmailToHostForRejectedApplication( emailAddress: string, @@ -47,10 +48,13 @@ export async function sendAMRejectionMailtoHost( const htmlContent = `

Dear Host,

-

Your account manager has made some suggestions on your application.
- Please improve it and re-submit the application to onboard on minglar.

-

If you have any questions please contact to minglar admin.

-

Best regards,
Minglar Team

+

Your account manager has reviewed your application and provided some suggestions.
+ Please make the necessary improvements and re-submit your application to proceed with the onboarding process on Minglar.

+

You may access your application using the link below:
+ Link: ${config.HOST_LINK}

+

If you have any questions, please feel free to contact the Minglar Support Team.

+

Best regards,
+ Minglar Team

`; try {