From 2ee7e39207281f033e77aa1ec6222b83e4647e72 Mon Sep 17 00:00:00 2001 From: roggervalf Date: Mon, 17 Mar 2025 08:49:02 -0600 Subject: [PATCH] feat: add support for more operators than contains --- src/utils/convert-filter.ts | 63 +++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/src/utils/convert-filter.ts b/src/utils/convert-filter.ts index 5d52269..8e0916b 100644 --- a/src/utils/convert-filter.ts +++ b/src/utils/convert-filter.ts @@ -1,6 +1,21 @@ import escape from 'escape-regexp' import mongoose from 'mongoose' +const OPERATOR_SEPARATOR = '~'; + +const MATCHING_PATTERNS = { + EQ: 'equals', + NE: 'notEquals', + CO: 'contains', + EW: 'endsWith', + SW: 'startsWith', +}; + +const OPERATORS = { + AND: 'and', + OR: 'or', +}; + /** * Changes AdminJS's {@link Filter} to an object acceptible by a mongoose query. * @@ -15,6 +30,54 @@ export const convertFilter = (filter) => { const { property, value } = filterProperty switch (property.type()) { case 'string': + if (typeof value === 'object') { + if (value[MATCHING_PATTERNS.SW]) { + return { + [property.name()]: { $regex: `^${escape(value[MATCHING_PATTERNS.SW])}`, $options: 'i' }, + ...memo, + } + } else if (value[MATCHING_PATTERNS.EW]) { + return { + [property.name()]: { $regex: `${escape(value[MATCHING_PATTERNS.EW])}$`, $options: 'i' }, + ...memo, + } + } else if (value[MATCHING_PATTERNS.EQ]) { + return { + [property.name()]: value[MATCHING_PATTERNS.EQ], + ...memo, + } + } else if (value[MATCHING_PATTERNS.NE]) { + return { + [property.name()]: { $ne: value[MATCHING_PATTERNS.NE] }, + ...memo, + } + } else { + let operatorExpression; + const orPrefix = `${OPERATORS.OR}${OPERATOR_SEPARATOR}`; + if (value[`${orPrefix}${MATCHING_PATTERNS.SW}`]) { + operatorExpression = { $regex: `^${escape(value[`${orPrefix}${MATCHING_PATTERNS.SW}`])}`, $options: 'i' } + } else if (value[`${orPrefix}${MATCHING_PATTERNS.EW}`]) { + operatorExpression = { $regex: `${escape(value[`${orPrefix}${MATCHING_PATTERNS.EW}`])}$`, $options: 'i' } + } else if (value[`${orPrefix}${MATCHING_PATTERNS.EQ}`]) { + operatorExpression = value[`${orPrefix}${MATCHING_PATTERNS.EQ}`] + } else if (value[`${orPrefix}${MATCHING_PATTERNS.NE}`]) { + operatorExpression = { $ne: value[`${orPrefix}${MATCHING_PATTERNS.NE}`] } + } else if (value[OPERATORS.OR]) { + operatorExpression = { $regex: escape(value[OPERATORS.OR]), $options: 'i' } + } + + return { + ...memo, + $or: [ + ...(memo['$or'] || []), + { + [property.name()]: operatorExpression, + }, + ], + }; + } + } + return { [property.name()]: { $regex: escape(value), $options: 'i' }, ...memo,