From fbe63b17121185c0ff1bc54c161ff1bf46bc1799 Mon Sep 17 00:00:00 2001 From: ChengLei Shao Date: Mon, 16 Dec 2024 09:25:21 +0800 Subject: [PATCH] fix: filter external data source collections (#5890) * fix: filter external data source collections * fix: test --- packages/core/database/src/filter-match.ts | 4 ++++ .../src/server/resourcers/data-sources-collections.ts | 11 +++-------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/core/database/src/filter-match.ts b/packages/core/database/src/filter-match.ts index 258f0e27e4..0b3b9ba60b 100644 --- a/packages/core/database/src/filter-match.ts +++ b/packages/core/database/src/filter-match.ts @@ -8,6 +8,7 @@ */ import moment from 'moment'; + export function filterMatch(model, where) { // Create an object that maps operator names to functions const operatorFunctions = { @@ -43,6 +44,9 @@ export function filterMatch(model, where) { $in: (value, condition) => condition.includes(value), $or: (model, conditions) => Object.values(conditions).some((condition) => filterMatch(model, condition)), $and: (model, conditions) => Object.values(conditions).every((condition) => filterMatch(model, condition)), + + // boolean + $isFalsy: (value) => !value, }; for (const [key, value] of Object.entries(where)) { diff --git a/packages/plugins/@nocobase/plugin-data-source-manager/src/server/resourcers/data-sources-collections.ts b/packages/plugins/@nocobase/plugin-data-source-manager/src/server/resourcers/data-sources-collections.ts index 84296c5946..2b1f3e2862 100644 --- a/packages/plugins/@nocobase/plugin-data-source-manager/src/server/resourcers/data-sources-collections.ts +++ b/packages/plugins/@nocobase/plugin-data-source-manager/src/server/resourcers/data-sources-collections.ts @@ -8,6 +8,7 @@ */ import lodash from 'lodash'; +import { filterMatch } from '@nocobase/database'; export default { name: 'dataSources.collections', @@ -44,17 +45,11 @@ export default { throw new Error(`dataSource ${dataSourceKey} not found`); } - const { paginate, filter } = ctx.action.params; - - const filterTitle = lodash.get(filter, '$and.0.title.$includes')?.toLowerCase(); - const filterName = lodash.get(filter, '$and.0.name.$includes')?.toLowerCase(); + const { paginate, filter = {} } = ctx.action.params; const collections = lodash.sortBy( dataSource.collectionManager.getCollections().filter((collection) => { - return ( - (!filterTitle || lodash.get(collection, 'options.title')?.toLowerCase().includes(filterTitle)) && - (!filterName || collection.options.name.toLowerCase().includes(filterName)) - ); + return filterMatch(collection.options, filter); }), 'name', );