diff --git a/src/service/club/member/memberService.ts b/src/service/club/member/memberService.ts index 234b73f..3eae4e6 100644 --- a/src/service/club/member/memberService.ts +++ b/src/service/club/member/memberService.ts @@ -1,4 +1,4 @@ -import { SelectQueryBuilder } from "typeorm"; +import { Brackets, Like, SelectQueryBuilder } from "typeorm"; import { dataSource } from "../../../data-source"; import { member } from "../../../entity/club/member/member"; import { membership } from "../../../entity/club/member/membership"; @@ -28,19 +28,29 @@ export default abstract class MemberService { let query = this.applyMemberBaseJoins(); if (search != "") { - search.split(" ").forEach((term, index) => { - const searchQuery = `%${term}%`; - const dynamic = "searchQuery" + Math.random().toString(36).substring(2); - if (index == 0) { - query = query.where(`member.firstname LIKE :${dynamic} OR member.lastname LIKE :${dynamic}`, { - [dynamic]: searchQuery, + let searchBits = search.split(" "); + + if (searchBits.length < 2) { + query = query.where(`member.firstname LIKE :searchQuery OR member.lastname LIKE :searchQuery`, { + searchQuery: `%${searchBits[0]}%`, + }); + } else { + searchBits + .flatMap((v, i) => searchBits.slice(i + 1).map((w) => [v, w])) + .forEach((term) => { + query = query + .orWhere( + new Brackets((qb) => + qb.where({ firstname: Like(`%${term[0]}%`) }).andWhere({ lastname: Like(`%${term[1]}%`) }) + ) + ) + .orWhere( + new Brackets((qb) => + qb.where({ firstname: Like(`%${term[1]}%`) }).andWhere({ lastname: Like(`%${term[0]}%`) }) + ) + ); }); - } else { - query = query.orWhere(`member.firstname LIKE :${dynamic} OR member.lastname LIKE :${dynamic}`, { - [dynamic]: searchQuery, - }); - } - }); + } } if (ids.length != 0) {