From b82f9ba60f068b3e17babb89846b2167b371c99a Mon Sep 17 00:00:00 2001 From: Daniil <8039921+DaniilSmirnov@users.noreply.github.com> Date: Mon, 8 Sep 2025 12:11:52 +0300 Subject: [PATCH] add filters with mongo syntax --- lib/db/models/all/model.js | 32 +++++++++++++++-------------- lib/units/api/controllers/groups.js | 6 +++++- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/lib/db/models/all/model.js b/lib/db/models/all/model.js index 951ea6e88..fb15bb75c 100644 --- a/lib/db/models/all/model.js +++ b/lib/db/models/all/model.js @@ -1090,23 +1090,25 @@ export const loadBookableDevices = function(groups, fields) { }, fields) } -export const loadBookableDevicesWithFiltersLock = function(groups, abi, model, type, sdk, version, devicesFunc, limit = null) { +export const loadBookableDevicesWithFiltersLock = function(groups, filters, devicesFunc, limit = null) { const filterOptions = [] let serials = [] - if (abi) { - filterOptions.push({abi: {$eq: abi}}) - } - if (model) { - filterOptions.push({model: {$eq: model}}) - } - if (sdk) { - filterOptions.push({sdk: {$eq: sdk}}) - } - if (version) { - filterOptions.push({version: {$eq: version}}) - } - if (type) { - filterOptions.push({deviceType: {$eq: type}}) + + // Process dynamic filters + if (filters && typeof filters === 'object') { + Object.entries(filters).forEach(([field, condition]) => { + if (condition !== null && condition !== undefined) { + // Support both simple values and MongoDB operators + if (typeof condition === 'object' && !Array.isArray(condition)) { + // Handle MongoDB operators like {$ne: value}, {$not: {$eq: value}}, etc. + filterOptions.push({[field]: condition}) + } + else { + // Handle simple equality for backwards compatibility + filterOptions.push({[field]: {$eq: condition}}) + } + } + }) } const pipeline = [ diff --git a/lib/units/api/controllers/groups.js b/lib/units/api/controllers/groups.js index 9122e250e..b39620ac7 100644 --- a/lib/units/api/controllers/groups.js +++ b/lib/units/api/controllers/groups.js @@ -148,6 +148,10 @@ function addGroupDevices(req, res) { const version = apiutil.getBodyParameter(req.body, 'version') const sdk = apiutil.getBodyParameter(req.body, 'sdk') const type = apiutil.getBodyParameter(req.body, 'type') + let filters = apiutil.getBodyParameter(req.body, 'filters') + if (!filters) { + filters = {abi: abi, model: model, version: version, sdk: sdk, type: type} + } const id = req.params.id let email = null @@ -264,7 +268,7 @@ function addGroupDevices(req, res) { return _addGroupDevices(group, _.difference(_.without(serials.split(','), ''), group.devices)) } if (amount) { - return dbapi.loadBookableDevicesWithFiltersLock(req.user.groups.subscribed, abi, model, type, sdk, version, function(devices) { + return dbapi.loadBookableDevicesWithFiltersLock(req.user.groups.subscribed, filters, function(devices) { const serials = devices?.map(device => device.serial) || [] if ((serials.length > 0 && !needAmount) || (needAmount && serials.length === amount)) { return _addGroupDevices(group, serials)