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", diff --git a/src/utils/convert-filter.ts b/src/utils/convert-filter.ts index 6a8b3b9..320dd6f 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, @@ -31,8 +46,41 @@ 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[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.orWhere(raw('lower(??)', [path]), operators.like, `%${String(value[OPERATORS.OR]).toLowerCase()}%`); + } + } + } 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); }