From e6354a4be70f66e7da96f2535e41b49e0e0ca950 Mon Sep 17 00:00:00 2001 From: ppetzold Date: Thu, 19 Aug 2021 13:30:06 +0200 Subject: [PATCH] fix(search): search case insensitive across all dbs BREAKING CHANGE: Use ILike operator instead of Like. This changes the search behavior from case sensitive to case insensitive on dbs like postgres. --- src/decorator.ts | 44 +++++++++++++++++++++----------------------- src/paginate.spec.ts | 2 +- src/paginate.ts | 6 +++--- 3 files changed, 25 insertions(+), 27 deletions(-) diff --git a/src/decorator.ts b/src/decorator.ts index 0042151..9b1ad99 100644 --- a/src/decorator.ts +++ b/src/decorator.ts @@ -9,31 +9,29 @@ export interface PaginateQuery { path: string } -export const Paginate = createParamDecorator( - (_data: unknown, ctx: ExecutionContext): PaginateQuery => { - const request: Request = ctx.switchToHttp().getRequest() - const { query } = request - const path = request.protocol + '://' + request.get('host') + request.baseUrl + request.path +export const Paginate = createParamDecorator((_data: unknown, ctx: ExecutionContext): PaginateQuery => { + const request: Request = ctx.switchToHttp().getRequest() + const { query } = request + const path = request.protocol + '://' + request.get('host') + request.baseUrl + request.path - const sortBy: [string, string][] = [] - if (query.sortBy) { - const params = !Array.isArray(query.sortBy) ? [query.sortBy] : query.sortBy - for (const param of params as string[]) { - if (typeof param === 'string') { - const items = param.split(':') - if (items.length === 2) { - sortBy.push(items as [string, string]) - } + const sortBy: [string, string][] = [] + if (query.sortBy) { + const params = !Array.isArray(query.sortBy) ? [query.sortBy] : query.sortBy + for (const param of params as string[]) { + if (typeof param === 'string') { + const items = param.split(':') + if (items.length === 2) { + sortBy.push(items as [string, string]) } } } - - return { - page: query.page ? parseInt(query.page.toString(), 10) : undefined, - limit: query.limit ? parseInt(query.limit.toString(), 10) : undefined, - sortBy: sortBy.length ? sortBy : undefined, - search: query.search ? query.search.toString() : undefined, - path, - } } -) + + return { + page: query.page ? parseInt(query.page.toString(), 10) : undefined, + limit: query.limit ? parseInt(query.limit.toString(), 10) : undefined, + sortBy: sortBy.length ? sortBy : undefined, + search: query.search ? query.search.toString() : undefined, + path, + } +}) diff --git a/src/paginate.spec.ts b/src/paginate.spec.ts index c7331a1..e9ce1bf 100644 --- a/src/paginate.spec.ts +++ b/src/paginate.spec.ts @@ -77,7 +77,7 @@ describe('paginate', () => { const config: PaginateConfig = { sortableColumns: ['id'], defaultLimit: 5, - maxLimit: 2 + maxLimit: 2, } const query: PaginateQuery = { path: '', diff --git a/src/paginate.ts b/src/paginate.ts index 94a8788..eb08e9f 100644 --- a/src/paginate.ts +++ b/src/paginate.ts @@ -1,4 +1,4 @@ -import { Repository, FindConditions, SelectQueryBuilder, Like, ObjectLiteral } from 'typeorm' +import { Repository, FindConditions, SelectQueryBuilder, ObjectLiteral, ILike } from 'typeorm' import { PaginateQuery } from './decorator' import { ServiceUnavailableException } from '@nestjs/common' @@ -41,7 +41,7 @@ export async function paginate( config: PaginateConfig ): Promise> { let page = query.page || 1 - const limit = Math.min(query.limit || config.defaultLimit || 20, config.maxLimit || 100); + const limit = Math.min(query.limit || config.defaultLimit || 20, config.maxLimit || 100) const sortBy = [] as SortBy const search = query.search const path = query.path @@ -90,7 +90,7 @@ export async function paginate( const where: ObjectLiteral[] = [] if (search && config.searchableColumns) { for (const column of config.searchableColumns) { - where.push({ [column]: Like(`%${search}%`), ...config.where }) + where.push({ [column]: ILike(`%${search}%`), ...config.where }) } }