From fb77111e349b76fb19c892da8ae2ad01a708a4c1 Mon Sep 17 00:00:00 2001 From: paritosh18 Date: Tue, 2 Dec 2025 17:27:36 +0530 Subject: [PATCH 1/3] Refactor payment details handling: remove IFSC code validation, add currencyXid to DTO, and implement bank branch lookup for IFSC code retrieval. --- .../validation/host/addPaymentDetails.validation.ts | 5 ----- src/modules/host/dto/host.dto.ts | 1 + .../Host_Admin/onboarding/updateBankDetails.ts | 13 +++++++++++-- src/modules/host/services/host.service.ts | 11 +++++++++++ 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/common/utils/validation/host/addPaymentDetails.validation.ts b/src/common/utils/validation/host/addPaymentDetails.validation.ts index c289a06..b8af555 100644 --- a/src/common/utils/validation/host/addPaymentDetails.validation.ts +++ b/src/common/utils/validation/host/addPaymentDetails.validation.ts @@ -11,11 +11,6 @@ export const hostBankDetailsSchema = z.object({ .nonempty("Account holder name is required") .min(2, { message: "Account holder name must be at least 2 characters" }), - ifscCode: z - .string() - .nonempty("IFSC code is required") - .regex(/^[A-Z]{4}0[A-Z0-9]{6}$/, { message: "Invalid IFSC code format" }), - bankXid: z .number() .int({ message: "Bank ID must be an integer" }) diff --git a/src/modules/host/dto/host.dto.ts b/src/modules/host/dto/host.dto.ts index e07e110..2a0b32e 100644 --- a/src/modules/host/dto/host.dto.ts +++ b/src/modules/host/dto/host.dto.ts @@ -90,5 +90,6 @@ export class AddPaymentDetailsDTO { this.accountHolderName = accountHolderName; this.ifscCode = ifscCode; this.hostXid = hostXid; + this.currencyXid = currencyXid; } } \ No newline at end of file diff --git a/src/modules/host/handlers/Host_Admin/onboarding/updateBankDetails.ts b/src/modules/host/handlers/Host_Admin/onboarding/updateBankDetails.ts index 42f1aec..73f87ad 100644 --- a/src/modules/host/handlers/Host_Admin/onboarding/updateBankDetails.ts +++ b/src/modules/host/handlers/Host_Admin/onboarding/updateBankDetails.ts @@ -33,7 +33,7 @@ export const handler = safeHandler(async ( } // Parse request body - let body: { bankXid?: number; bankBranchXid?: number; accountNumber?: string; confirmAccountNumber?: string; accountHolderName?: string; ifscCode?: string; currencyXid?: number }; + let body: { bankXid?: number; bankBranchXid?: number; accountNumber?: string; confirmAccountNumber?: string; accountHolderName?: string; currencyXid?: number }; try { body = event.body ? JSON.parse(event.body) : {}; @@ -54,7 +54,16 @@ export const handler = safeHandler(async ( const validatedData = validationResult.data; - await hostService.addPaymentDetails(validatedData); + // Fetch IFSC code from bank branch + const bankBranch = await hostService.getBankBranchById(validatedData.bankBranchXid); + if (!bankBranch) { + throw new ApiError(404, 'Bank branch not found'); + } + + await hostService.addPaymentDetails({ + ...validatedData, + ifscCode: bankBranch.ifscCode, + }); return { statusCode: 200, diff --git a/src/modules/host/services/host.service.ts b/src/modules/host/services/host.service.ts index 430afaf..77bb31b 100644 --- a/src/modules/host/services/host.service.ts +++ b/src/modules/host/services/host.service.ts @@ -330,6 +330,17 @@ export class HostService { return true; } + async getBankBranchById(bankBranchXid: number) { + return await this.prisma.bankBranches.findUnique({ + where: { id: bankBranchXid }, + select: { + id: true, + ifscCode: true, + bankXid: true, + }, + }); + } + async addPaymentDetails(data: AddPaymentDetailsDTO) { return await this.prisma.$transaction(async (tx) => { const addedPaymentDetails = await tx.hostBankDetails.create({ From f19f5e46c46f8ef254d1ba5fe14f8ab692730b39 Mon Sep 17 00:00:00 2001 From: paritosh18 Date: Tue, 2 Dec 2025 17:33:30 +0530 Subject: [PATCH 2/3] Remove commented-out validation for allowed titles in addPQQSuggestion handler --- .../handlers/hosthub/hosts/addPQQSuggestion.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/modules/minglaradmin/handlers/hosthub/hosts/addPQQSuggestion.ts b/src/modules/minglaradmin/handlers/hosthub/hosts/addPQQSuggestion.ts index 34477a7..68d0ea1 100644 --- a/src/modules/minglaradmin/handlers/hosthub/hosts/addPQQSuggestion.ts +++ b/src/modules/minglaradmin/handlers/hosthub/hosts/addPQQSuggestion.ts @@ -4,7 +4,7 @@ import { PrismaService } from '../../../../../common/database/prisma.service'; import { MinglarService } from '../../../services/minglar.service'; import ApiError from '../../../../../common/utils/helper/ApiError'; import { verifyMinglarAdminToken } from '../../../../../common/middlewares/jwt/authForMinglarAdmin'; -import { HOST_SUGGESTION_TITLES } from '../../../../../common/utils/constants/minglar.constant'; +// import { HOST_SUGGESTION_TITLES } from '../../../../../common/utils/constants/minglar.constant'; const prismaService = new PrismaService(); const minglarService = new MinglarService(prismaService); @@ -67,10 +67,10 @@ export const handler = safeHandler(async ( } // Validate title is one of the allowed types - const allowedTitles = Object.values(HOST_SUGGESTION_TITLES); - if (!allowedTitles.includes(title)) { - throw new ApiError(400, `Invalid title. Allowed values: ${allowedTitles.join(', ')}`); - } + // const allowedTitles = Object.values(HOST_SUGGESTION_TITLES); + // if (!allowedTitles.includes(title)) { + // throw new ApiError(400, `Invalid title. Allowed values: ${allowedTitles.join(', ')}`); + // } // Add suggestion using service await minglarService.addPqqSuggestion(title, comments, activity_pqq_header_xid,user.id); From 781058c4435af46226bbab7f4abff177f8ca43af Mon Sep 17 00:00:00 2001 From: paritosh18 Date: Tue, 2 Dec 2025 20:10:10 +0530 Subject: [PATCH 3/3] Implement pagination for host activity retrieval in HostService and MinglarService --- .../OnBoarding/getAllHostActivity.ts | 14 ++-- src/modules/host/services/host.service.ts | 58 +++++++++------ .../onboarding/getAllActivityOfHost.ts | 12 +++- .../minglaradmin/services/minglar.service.ts | 70 +++++++++++-------- 4 files changed, 96 insertions(+), 58 deletions(-) diff --git a/src/modules/host/handlers/Activity_Hub/OnBoarding/getAllHostActivity.ts b/src/modules/host/handlers/Activity_Hub/OnBoarding/getAllHostActivity.ts index 0b3e71b..6c4d061 100644 --- a/src/modules/host/handlers/Activity_Hub/OnBoarding/getAllHostActivity.ts +++ b/src/modules/host/handlers/Activity_Hub/OnBoarding/getAllHostActivity.ts @@ -4,7 +4,7 @@ import { PrismaService } from '../../../../../common/database/prisma.service'; import { safeHandler } from '../../../../../common/utils/handlers/safeHandler'; import ApiError from '../../../../../common/utils/helper/ApiError'; import { HostService } from '../../../services/host.service'; -import { string } from 'zod'; +import { paginationService } from '../../../../../common/utils/pagination/pagination.service'; const prismaService = new PrismaService(); @@ -29,11 +29,18 @@ export const handler = safeHandler(async ( // Verify token and get user info const userInfo = await verifyHostToken(token); + // Get pagination params from event + const paginationParams = paginationService.getPaginationFromEvent(event); + const paginationOptions = paginationService.parsePaginationParams(paginationParams); // Read optional search query (supports ?search= or ?q=) const search = event.queryStringParameters?.search || event.queryStringParameters?.q || undefined; - const data = await hostService.getAllHostActivity(search ? String(search) : undefined, Number(userInfo.id)); + const result = await hostService.getAllHostActivity( + search ? String(search) : undefined, + Number(userInfo.id), + paginationOptions + ); return { @@ -45,8 +52,7 @@ export const handler = safeHandler(async ( body: JSON.stringify({ success: true, message: 'Data retrieved successfully', - data, - + ...result, }), }; }); diff --git a/src/modules/host/services/host.service.ts b/src/modules/host/services/host.service.ts index a4eda06..0e3b1a7 100644 --- a/src/modules/host/services/host.service.ts +++ b/src/modules/host/services/host.service.ts @@ -384,35 +384,43 @@ export class HostService { }); } - async getAllHostActivity(search?: string, user_xid?: number) { + async getAllHostActivity(search?: string, user_xid?: number, paginationOptions?: { page: number; limit: number; skip: number }) { const hostDetails = await this.prisma.hostHeader.findFirst({ where: { userXid: user_xid, isActive: true } }) - const hostAllActivities = await this.prisma.activities.findMany({ - where: { - isActive: true, - hostXid: hostDetails.id, - }, - include: { - ActivitiesMedia: true, - ActivityAmDetails: { - select: { - accountManager: { - select: { - id: true, - firstName: true, - lastName: true, - profileImage: true, - emailAddress: true, - roleXid: true, + const whereClause = { + isActive: true, + hostXid: hostDetails.id, + }; + + const [hostAllActivities, totalCount] = await Promise.all([ + this.prisma.activities.findMany({ + where: whereClause, + include: { + ActivitiesMedia: true, + ActivityAmDetails: { + select: { + accountManager: { + select: { + id: true, + firstName: true, + lastName: true, + profileImage: true, + emailAddress: true, + roleXid: true, + }, }, }, }, + activityType: true, }, - activityType: true, - }, - }); + skip: paginationOptions?.skip || 0, + take: paginationOptions?.limit || 10, + orderBy: { id: 'desc' }, + }), + this.prisma.activities.count({ where: whereClause }), + ]); for (const activity of hostAllActivities) { @@ -452,8 +460,12 @@ export class HostService { } } - - return hostAllActivities; + const { paginationService } = require('@/common/utils/pagination/pagination.service'); + return paginationService.createPaginatedResponse( + hostAllActivities, + totalCount, + paginationOptions || { page: 1, limit: 10, skip: 0 } + ); } async acceptMinglarAgreement(user_xid: number) { diff --git a/src/modules/minglaradmin/handlers/hosthub/onboarding/getAllActivityOfHost.ts b/src/modules/minglaradmin/handlers/hosthub/onboarding/getAllActivityOfHost.ts index d63895d..81a2c4f 100644 --- a/src/modules/minglaradmin/handlers/hosthub/onboarding/getAllActivityOfHost.ts +++ b/src/modules/minglaradmin/handlers/hosthub/onboarding/getAllActivityOfHost.ts @@ -5,6 +5,7 @@ import { safeHandler } from '../../../../../common/utils/handlers/safeHandler'; import ApiError from '../../../../../common/utils/helper/ApiError'; import { PrePopulateService } from '../../../../prepopulate/services/prepopulate.service'; import { MinglarService } from '../../../services/minglar.service'; +import { paginationService } from '../../../../../common/utils/pagination/pagination.service'; const prismaService = new PrismaService(); const minglarService = new MinglarService(prismaService); @@ -30,11 +31,18 @@ export const handler = safeHandler(async ( const hostXid = Number(event.pathParameters?.id) + // Get pagination params from event + const paginationParams = paginationService.getPaginationFromEvent(event); + const paginationOptions = paginationService.parsePaginationParams(paginationParams); // Read optional search query (supports ?search= or ?q=) const search = event.queryStringParameters?.search || event.queryStringParameters?.q || undefined; - const data = await minglarService.getAllHostActivityForMinglar(search ? String(search) : undefined, hostXid); + const result = await minglarService.getAllHostActivityForMinglar( + search ? String(search) : undefined, + hostXid, + paginationOptions + ); return { @@ -46,7 +54,7 @@ export const handler = safeHandler(async ( body: JSON.stringify({ success: true, message: 'Data retrieved successfully', - data, + ...result, }), }; }); diff --git a/src/modules/minglaradmin/services/minglar.service.ts b/src/modules/minglaradmin/services/minglar.service.ts index 9c1c0be..3d8c629 100644 --- a/src/modules/minglaradmin/services/minglar.service.ts +++ b/src/modules/minglaradmin/services/minglar.service.ts @@ -255,38 +255,46 @@ export class MinglarService { }); } - async getAllHostActivityForMinglar(search?: string, hostXid?: number) { - const hostActivities = await this.prisma.activities.findMany({ - where: { - isActive: true, - ...(hostXid ? { hostXid } : {}), // Add only if provided - }, - include: { - ActivitiesMedia: { - select: { - id: true, - mediaFileName: true, - mediaType: true, - displayOrder: true, + async getAllHostActivityForMinglar(search?: string, hostXid?: number, paginationOptions?: { page: number; limit: number; skip: number }) { + const whereClause = { + isActive: true, + ...(hostXid ? { hostXid } : {}), // Add only if provided + }; + + const [hostActivities, totalCount] = await Promise.all([ + this.prisma.activities.findMany({ + where: whereClause, + include: { + ActivitiesMedia: { + select: { + id: true, + mediaFileName: true, + mediaType: true, + displayOrder: true, + }, }, - }, - ActivityAmDetails: { - select: { - accountManager: { - select: { - id: true, - firstName: true, - lastName: true, - profileImage: true, - emailAddress: true, - roleXid: true, + ActivityAmDetails: { + select: { + accountManager: { + select: { + id: true, + firstName: true, + lastName: true, + profileImage: true, + emailAddress: true, + roleXid: true, + }, }, }, }, + activityType: true, }, - activityType: true, - }, - }); + skip: paginationOptions?.skip || 0, + take: paginationOptions?.limit || 10, + orderBy: { id: 'desc' }, + }), + this.prisma.activities.count({ where: whereClause }), + ]); // Process each activity for (const activity of hostActivities) { @@ -327,8 +335,12 @@ export class MinglarService { } } - - return hostActivities; + const { paginationService } = require('@/common/utils/pagination/pagination.service'); + return paginationService.createPaginatedResponse( + hostActivities, + totalCount, + paginationOptions || { page: 1, limit: 10, skip: 0 } + ); }