diff --git a/packages/xo-server/src/xo-mixins/rest-api.mjs b/packages/xo-server/src/xo-mixins/rest-api.mjs index dac1f8f05..00137fa4d 100644 --- a/packages/xo-server/src/xo-mixins/rest-api.mjs +++ b/packages/xo-server/src/xo-mixins/rest-api.mjs @@ -1,3 +1,4 @@ +import { every } from '@vates/predicates' import { ifDef } from '@xen-orchestra/defined' import { invalidCredentials, noSuchObject } from 'xo-common/api-errors.js' import { pipeline } from 'stream' @@ -7,6 +8,9 @@ import pick from 'lodash/pick.js' import map from 'lodash/map.js' import * as CM from 'complex-matcher' +const handleOptionalUserFilter = filter => filter && CM.parse(filter).createPredicate() +const isVm = obj => obj.type === 'VM' + const subRouter = (app, path) => { const router = Router({ strict: true }) app.use(path, router) @@ -39,16 +43,10 @@ export default class RestApi { const basePath = req.baseUrl + req.path const makeUrl = vm => basePath + vm.id - let filter - let userFilter = req.query.filter - if (userFilter) { - userFilter = CM.parse(userFilter).createPredicate() - filter = obj => obj.type === 'VM' && userFilter(obj) - } else { - filter = obj => obj.type === 'VM' - } - - const vms = await app.getObjects({ filter, limit: ifDef(query.limit, Number) }) + const vms = await app.getObjects({ + filter: every(isVm, handleOptionalUserFilter(req.query.filter)), + limit: ifDef(query.limit, Number), + }) let { fields } = query let results