From 889a0a9f3576b48b1cbf24648c82aaac5f4685a3 Mon Sep 17 00:00:00 2001 From: roggervalf Date: Sat, 8 Mar 2025 23:35:46 -0600 Subject: [PATCH 1/4] feat: add support for more operators than contains --- src/utils/convert-filter.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/utils/convert-filter.ts b/src/utils/convert-filter.ts index 6a8b3b9..48c00e2 100644 --- a/src/utils/convert-filter.ts +++ b/src/utils/convert-filter.ts @@ -31,8 +31,18 @@ export const convertFilter = ( } else if (property.type() === 'string' && !!property.availableValues()) { qb.where(path, operators.eq, value as string); } else if (property.type() === 'string') { - // Should be safe: https://github.com/knex/documentation/issues/73#issuecomment-572482153 - qb.where(raw('lower(??)', [path]), operators.like, `%${String(value).toLowerCase()}%`); + if (typeof value === 'object') { + if (value.startsWith) { + qb.where(raw('lower(??)', [path]), operators.like, `${String(value.startsWith).toLowerCase()}%`); + } else if (value.endsWith) { + qb.where(raw('lower(??)', [path]), operators.like, `%${String(value.endsWith).toLowerCase()}`); + } else if (value.equals) { + qb.where(path, operators.eq, value.equals as string); + } + } else { + // Should be safe: https://github.com/knex/documentation/issues/73#issuecomment-572482153 + qb.where(raw('lower(??)', [path]), operators.like, `%${String(value).toLowerCase()}%`); + } } else { qb.where(path, operators.eq, value as string); } From f455e0b6e6f6790327fd3f871350715283513d70 Mon Sep 17 00:00:00 2001 From: roggervalf Date: Sat, 8 Mar 2025 23:39:27 -0600 Subject: [PATCH 2/4] chore: update repository reference to be reflected in npm --- package.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/package.json b/package.json index e44067e..e6f39e7 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,10 @@ "license": "MIT", "description": "ObjectionJS adapter for AdminJS", "author": "Rafał Dzięgielewski ", + "repository": { + "type": "git", + "url": "git+https://github.com/SoftwareBrothers/adminjs-objection.git" + }, "keywords": [ "objection", "objectionjs", From 8b737b527be5fc664689fc4c01645b62b30598ce Mon Sep 17 00:00:00 2001 From: roggervalf Date: Mon, 17 Mar 2025 01:06:00 -0600 Subject: [PATCH 3/4] feat: support or operator --- src/utils/convert-filter.ts | 50 ++++++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/src/utils/convert-filter.ts b/src/utils/convert-filter.ts index 48c00e2..35d2d7d 100644 --- a/src/utils/convert-filter.ts +++ b/src/utils/convert-filter.ts @@ -8,6 +8,21 @@ export const operators = { like: 'like', }; +const OPERATOR_SEPARATOR = '~'; + +const MATCHING_PATTERNS = { + EQ: 'equals', + NE: 'notEquals', + CO: 'contains', + EW: 'endsWith', + SW: 'startsWith', +}; + +const OPERATORS = { + AND: 'and', + OR: 'or', +}; + export const convertFilter = ( qb: QueryBuilder, originalFilter: Filter, @@ -32,12 +47,35 @@ export const convertFilter = ( qb.where(path, operators.eq, value as string); } else if (property.type() === 'string') { if (typeof value === 'object') { - if (value.startsWith) { - qb.where(raw('lower(??)', [path]), operators.like, `${String(value.startsWith).toLowerCase()}%`); - } else if (value.endsWith) { - qb.where(raw('lower(??)', [path]), operators.like, `%${String(value.endsWith).toLowerCase()}`); - } else if (value.equals) { - qb.where(path, operators.eq, value.equals as string); + if (value[MATCHING_PATTERNS.SW]) { + qb.where(raw('lower(??)', [path]), operators.like, `${String(value[MATCHING_PATTERNS.SW]).toLowerCase()}%`); + } else if (value[MATCHING_PATTERNS.EW]) { + qb.where(raw('lower(??)', [path]), operators.like, `%${String(value[MATCHING_PATTERNS.EW]).toLowerCase()}`); + } else if (value[MATCHING_PATTERNS.EQ]) { + qb.where(path, operators.eq, value[MATCHING_PATTERNS.EQ] as string); + } else if (value[MATCHING_PATTERNS.NE]) { + qb.whereNot(path, operators.eq, value[MATCHING_PATTERNS.NE] as string); + } else { + const orPrefix = `${OPERATORS.OR}${OPERATOR_SEPARATOR}`; + if (value[`${orPrefix}${MATCHING_PATTERNS.SW}`]) { + qb.orWhere( + raw('lower(??)', [path]), + operators.like, + `${String(value[`${orPrefix}${MATCHING_PATTERNS.SW}`]).toLowerCase()}%`, + ); + } else if (value[`${orPrefix}${MATCHING_PATTERNS.EW}`]) { + qb.orWhere( + raw('lower(??)', [path]), + operators.like, + `%${String(value[`${orPrefix}${MATCHING_PATTERNS.EW}`]).toLowerCase()}`, + ); + } else if (value[`${orPrefix}${MATCHING_PATTERNS.EQ}`]) { + qb.orWhere(path, operators.eq, value[`${orPrefix}${MATCHING_PATTERNS.EQ}`] as string); + } else if (value[`${orPrefix}${MATCHING_PATTERNS.NE}`]) { + qb.orWhereNot(path, operators.eq, value[`${orPrefix}${MATCHING_PATTERNS.NE}`] as string); + } else if (value[OPERATORS.OR]) { + qb.where(raw('lower(??)', [path]), operators.like, `%${String(value[OPERATORS.OR]).toLowerCase()}%`); + } } } else { // Should be safe: https://github.com/knex/documentation/issues/73#issuecomment-572482153 From 77a82c7e3002fff7e120620ee3989e881583d926 Mon Sep 17 00:00:00 2001 From: roggervalf Date: Mon, 17 Mar 2025 01:14:34 -0600 Subject: [PATCH 4/4] fix: or operator when contains --- src/utils/convert-filter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/convert-filter.ts b/src/utils/convert-filter.ts index 35d2d7d..320dd6f 100644 --- a/src/utils/convert-filter.ts +++ b/src/utils/convert-filter.ts @@ -74,7 +74,7 @@ export const convertFilter = ( } else if (value[`${orPrefix}${MATCHING_PATTERNS.NE}`]) { qb.orWhereNot(path, operators.eq, value[`${orPrefix}${MATCHING_PATTERNS.NE}`] as string); } else if (value[OPERATORS.OR]) { - qb.where(raw('lower(??)', [path]), operators.like, `%${String(value[OPERATORS.OR]).toLowerCase()}%`); + qb.orWhere(raw('lower(??)', [path]), operators.like, `%${String(value[OPERATORS.OR]).toLowerCase()}%`); } } } else {