Search
How the search function is built and where it is rooted.
Backend
async search(search: string, user: JwtUserPayload) {
const sanitizedSearch = sanitizeString(search);
const userWithMemberships = await this.userRepository.findOne({
where: { id: user.id },
relations: ['memberships', 'memberships.team'],
});
const memberships = userWithMemberships.memberships.filter(m => m.team).map(m => m.team.id);
const leadsQuery = this.leadsRepository
.createQueryBuilder('lead')
.leftJoinAndSelect('lead.business', 'business')
.leftJoinAndSelect('lead.team', 'team')
.leftJoinAndSelect('lead.status', 'status')
.leftJoin('team.memberships', 'membership')
.where('lead.isDeleted = false')
.andWhere(
new Brackets(qb => {
qb.where('lead.firstName ILIKE :search', { search: `%${sanitizedSearch}%` })
.orWhere('lead.lastName ILIKE :search', { search: `%${sanitizedSearch}%` })
.orWhere('lead.state::text ILIKE :search', { search: `%${sanitizedSearch}%` })
.orWhere('status.name::text ILIKE :search', { search: `%${sanitizedSearch}%` })
.orWhere('lead.source ILIKE :search', { search: `%${sanitizedSearch}%` })
.orWhere("ARRAY_TO_STRING(lead.phoneNumber, ',') ILIKE :search", {
search: `%${sanitizedSearch}%`,
})
.orWhere('lead.email::text ILIKE :search', { search: `%${sanitizedSearch}%` })
.orWhere('lead.description ILIKE :search', { search: `%${sanitizedSearch}%` })
.orWhere('lead.location ILIKE :search', { search: `%${sanitizedSearch}%` })
.orWhere('lead.position ILIKE :search', { search: `%${sanitizedSearch}%` })
.orWhere('business.name ILIKE :search', { search: `%${sanitizedSearch}%` });
})
);
if (!user.roles.includes(Role.Admin) && !user.roles.includes(Role.SuperAdmin)) {
leadsQuery.andWhere('team.id IN (:...memberships)', { memberships });
}
const leads = await leadsQuery.getMany();
return leads;
}Frontend
Last updated