From cb067622ae7d754706f50df8c59ac2d711688e40 Mon Sep 17 00:00:00 2001 From: Tycho Bokdam Date: Thu, 2 Jun 2022 11:48:16 +0200 Subject: [PATCH] fix(core): Improved workings of `getFilterOmitting` --- packages/core/src/helpers/filter.helpers.ts | 39 +++++++++++++++------ 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/packages/core/src/helpers/filter.helpers.ts b/packages/core/src/helpers/filter.helpers.ts index c8e5eb2c3..1e01399dd 100644 --- a/packages/core/src/helpers/filter.helpers.ts +++ b/packages/core/src/helpers/filter.helpers.ts @@ -28,6 +28,7 @@ export const isComparison = ( if (!maybeComparison) { return false; } + // eslint-disable-next-line @typescript-eslint/no-explicit-any return Object.keys(maybeComparison as Record).every( (op) => @@ -100,38 +101,56 @@ export const getFilterComparisons = filter: Filter, key: K ): FilterFieldComparison[] => { - const results: FilterFieldComparison[] = []; - - if (filter.and || filter.or) { - const filters = [...(filter.and ?? []), ...(filter.or ?? [])]; - filters.forEach((f) => getFilterComparisons(f, key).forEach((comparison) => results.push(comparison))); - } + let results: FilterFieldComparison[] = []; const comparison = getFilterFieldComparison(filter as FilterComparisons, key); if (isComparison(comparison)) { results.push(comparison); + + } else if (Array.isArray(filter)) { + filter.forEach((f: Filter) => { + results = results.concat(getFilterComparisons(f, key)); + }); + } + + if (typeof filter === 'object') { + Object.keys(filter).forEach((subFilterKey) => { + const subFilter = filter[subFilterKey] as FilterFieldComparison; + + if (subFilterKey === key) { + results.push(subFilter); + } else { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + results = results.concat(getFilterComparisons(subFilter, key)); + } + }); } return [...results]; }; -export const getFilterOmitting = (filter: Filter, key: keyof DTO): Filter => +export const getFilterOmitting = (filter: Filter, ...keys: (keyof Filter)[]): Filter => Object.keys(filter).reduce>((f, next) => { const omitted = { ...f }; const k = next as keyof Filter; + if (k === 'and' && filter.and) { - omitted.and = filter.and.map((part) => getFilterOmitting(part, key)); + omitted.and = filter.and.map((part) => getFilterOmitting(part, ...keys)); + if (omitted.and.every((part) => Object.keys(part).length === 0)) { delete omitted.and; } } else if (k === 'or' && filter.or) { - omitted.or = filter.or.map((part) => getFilterOmitting(part, key)); + omitted.or = filter.or.map((part) => getFilterOmitting(part, ...keys)); + if (omitted.or.every((part) => Object.keys(part).length === 0)) { delete omitted.or; } - } else if (k !== key) { + } else if (!keys.includes(k)) { omitted[k] = filter[k]; } + return omitted; }, {} as Filter);