diff --git a/src/utils/converters.ts b/src/utils/converters.ts index de6a3a0..6fa0960 100644 --- a/src/utils/converters.ts +++ b/src/utils/converters.ts @@ -5,6 +5,21 @@ import { Filter } from 'adminjs'; import { Property } from '../Property.js'; import { safeParseJSON, safeParseNumber } from './helpers.js'; +const OPERATOR_SEPARATOR = '~'; + +const MATCHING_PATTERNS = { + EQ: 'equals', + NE: 'notEquals', + CO: 'contains', + EW: 'endsWith', + SW: 'startsWith', +}; + +const OPERATORS = { + AND: 'and', + OR: 'or', +}; + export const convertParam = ( property: Property, fields: DMMF.Model['fields'], @@ -35,7 +50,7 @@ export const convertFilter = (modelFields: DMMF.Model['fields'], filterObject?: const uuidRegex = /^[0-9A-F]{8}-[0-9A-F]{4}-[5|4|3|2|1][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i; const { filters = {} } = filterObject; - return Object.entries(filters).reduce((where, [name, filter]) => { + return Object.entries(filters).reduce<{[key: string]: any}>((where, [name, filter]) => { if (['boolean', 'number', 'float', 'object', 'array'].includes(filter.property.type())) { where[name] = safeParseJSON(filter.value as string); } else if (['date', 'datetime'].includes(filter.property.type())) { @@ -57,7 +72,45 @@ export const convertFilter = (modelFields: DMMF.Model['fields'], filterObject?: filter.value, ); } else { - where[name] = { contains: filter.value.toString() }; + const { value } = filter + if (typeof value === 'object') { + if (value[MATCHING_PATTERNS.SW]) { + where[name] = { startsWith: value[MATCHING_PATTERNS.SW].toString() }; + } else if (value[MATCHING_PATTERNS.EW]) { + where[name] = { endsWith: value[MATCHING_PATTERNS.EW].toString() }; + } else if (value[MATCHING_PATTERNS.EQ]) { + where[name] = { equals: value[MATCHING_PATTERNS.EQ].toString() }; + } else if (value[MATCHING_PATTERNS.NE]) { + where[name] = { not: value[MATCHING_PATTERNS.NE].toString() }; + } else { + const orPrefix = `${OPERATORS.OR}${OPERATOR_SEPARATOR}`; + if (value[`${orPrefix}${MATCHING_PATTERNS.SW}`]) { + where.OR = [ + ...(where.OR || []), + { [name]: { startsWith: value[`${orPrefix}${MATCHING_PATTERNS.SW}`].toString() } }, + ]; + } else if (value[`${orPrefix}${MATCHING_PATTERNS.EW}`]) { + where.OR = [ + ...(where.OR || []), + { [name]: { endsWith: value[`${orPrefix}${MATCHING_PATTERNS.EW}`].toString() } }, + ]; + } else if (value[`${orPrefix}${MATCHING_PATTERNS.EQ}`]) { + where.OR = [ + ...(where.OR || []), + { [name]: { equals: value[`${orPrefix}${MATCHING_PATTERNS.EQ}`].toString() } }, + ]; + } else if (value[`${orPrefix}${MATCHING_PATTERNS.NE}`]) { + where.OR = [ + ...(where.OR || []), + { [name]: { not: value[`${orPrefix}${MATCHING_PATTERNS.NE}`].toString() } }, + ]; + } else if (value[OPERATORS.OR]) { + where.OR = [...(where.OR || []), { [name]: { contains: value[OPERATORS.OR].toString() } }]; + } + } + } else { + where[name] = { contains: value.toString() }; + } } return where;