advanced search filters

This commit is contained in:
Salihu
2026-08-15 22:48:34 +01:00
parent c093c18bf3
commit fad4b08097
9 changed files with 380 additions and 46 deletions
@@ -1,4 +1,5 @@
import {
IsArray,
IsBoolean,
IsNotEmpty,
IsNumber,
@@ -24,6 +25,11 @@ export class SearchDTO {
@IsUUID()
creatorId?: string;
@IsOptional()
@IsArray()
@IsUUID('all', { each: true })
labelIds?: string[];
@IsOptional()
@IsNumber()
limit?: number;
@@ -35,6 +35,7 @@ export class SearchService {
return { items: [] };
}
const searchQuery = tsquery(query.trim() + '*');
const labelIds = [...new Set(searchParams.labelIds ?? [])];
let queryResults = this.db
.selectFrom('pages')
@@ -62,6 +63,22 @@ export class SearchService {
.$if(Boolean(searchParams.creatorId), (qb) =>
qb.where('creatorId', '=', searchParams.creatorId),
)
.$if(labelIds?.length > 0, (qb) =>
qb.where(
'id',
'in',
this.db
.selectFrom('pageLabels')
.select('pageId')
.where('labelId', 'in', labelIds)
.groupBy('pageId')
.having(
sql<number>`count(distinct "label_id")`,
'=',
labelIds.length,
),
),
)
.where('deletedAt', 'is', null)
.orderBy('rank', 'desc')
.limit(searchParams.limit || 25)