From 9b4d64cf6a9e6235295130c45223c59a2894f81e Mon Sep 17 00:00:00 2001 From: pradeepkumar Date: Wed, 8 Apr 2026 10:26:19 +0530 Subject: [PATCH] feat: update user search to support multi-word name matching across profiles --- src/users/users.service.ts | 47 ++++++++++++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 4b0e848..60c8713 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -121,13 +121,46 @@ export class UsersService { const where: Prisma.UserWhereInput = {}; if (role) where.role = role; if (search) { - where.OR = [ - { email: { contains: search, mode: 'insensitive' } }, - { userProfile: { firstName: { contains: search, mode: 'insensitive' } } }, - { userProfile: { lastName: { contains: search, mode: 'insensitive' } } }, - { agentProfile: { firstName: { contains: search, mode: 'insensitive' } } }, - { agentProfile: { lastName: { contains: search, mode: 'insensitive' } } }, - ]; + const searchParts = search.trim().split(/\s+/).filter(Boolean); + + if (searchParts.length > 1) { + // Multi-word search (e.g. "Sophie Brown") — match across firstName + lastName + where.OR = [ + // Match all parts across firstName/lastName for userProfile + { + userProfile: { + AND: searchParts.map((part) => ({ + OR: [ + { firstName: { contains: part, mode: 'insensitive' as const } }, + { lastName: { contains: part, mode: 'insensitive' as const } }, + ], + })), + }, + }, + // Match all parts across firstName/lastName for agentProfile + { + agentProfile: { + AND: searchParts.map((part) => ({ + OR: [ + { firstName: { contains: part, mode: 'insensitive' as const } }, + { lastName: { contains: part, mode: 'insensitive' as const } }, + ], + })), + }, + }, + // Also match the full search string against email + { email: { contains: search, mode: 'insensitive' } }, + ]; + } else { + // Single word — match against any field + where.OR = [ + { email: { contains: search, mode: 'insensitive' } }, + { userProfile: { firstName: { contains: search, mode: 'insensitive' } } }, + { userProfile: { lastName: { contains: search, mode: 'insensitive' } } }, + { agentProfile: { firstName: { contains: search, mode: 'insensitive' } } }, + { agentProfile: { lastName: { contains: search, mode: 'insensitive' } } }, + ]; + } } if (verificationStatus) { where.agentProfile = { ...((where.agentProfile as object) || {}), verificationStatus: verificationStatus as any };