diff --git a/src/agents/agents.service.ts b/src/agents/agents.service.ts index a156a7e..ebe5a2a 100644 --- a/src/agents/agents.service.ts +++ b/src/agents/agents.service.ts @@ -202,13 +202,36 @@ export class AgentsService { }; if (search) { - where.OR = [ - { firstName: { contains: search, mode: 'insensitive' } }, - { lastName: { contains: search, mode: 'insensitive' } }, - { bio: { contains: search, mode: 'insensitive' } }, - { headline: { contains: search, mode: 'insensitive' } }, - { companyName: { contains: search, mode: 'insensitive' } }, - ]; + const searchParts = search.trim().split(/\s+/); + + if (searchParts.length > 1) { + // Multi-word search (e.g. "John Smith") — match first+last name combination + // plus still try the full string against other fields + where.OR = [ + // Match firstName + lastName across parts + { + 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 other fields + { bio: { contains: search, mode: 'insensitive' } }, + { headline: { contains: search, mode: 'insensitive' } }, + { companyName: { contains: search, mode: 'insensitive' } }, + ]; + } else { + // Single word search — match against any field + where.OR = [ + { firstName: { contains: search, mode: 'insensitive' } }, + { lastName: { contains: search, mode: 'insensitive' } }, + { bio: { contains: search, mode: 'insensitive' } }, + { headline: { contains: search, mode: 'insensitive' } }, + { companyName: { contains: search, mode: 'insensitive' } }, + ]; + } } // General location search - searches across legacy columns AND dynamic field values