From 2c998bbb2b5748b4740de1da00debb2869471244 Mon Sep 17 00:00:00 2001 From: Randall Morey Date: Thu, 16 Dec 2021 16:02:00 -0500 Subject: [PATCH] chore: add support for contains clauses in filter store --- .../addon/services/resource-filter-store.js | 23 ++++++++++++++++--- .../services/resource-filter-store-test.js | 3 ++- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/addons/api/addon/services/resource-filter-store.js b/addons/api/addon/services/resource-filter-store.js index 35582302b..c9ad01bcb 100644 --- a/addons/api/addon/services/resource-filter-store.js +++ b/addons/api/addon/services/resource-filter-store.js @@ -8,10 +8,11 @@ import { inject as service } from '@ember/service'; * @example * const filter = new ResourceFilter({ * type: 'oidc', - * status: ['active', 'pending'] + * status: ['active', 'pending'], + * authorized_actions: [{ contains: 'read' }] * }); * log(filter.queryExpression); - * // ("/item/type" == "oidc") and ("/item/status" == "active" or "/item/status" == "pending") + * // ("/item/type" == "oidc") and ("/item/status" == "active" or "/item/status" == "pending") and ("read" in "/item/authorized_actions") */ export class ResourceFilter { // =attributes @@ -30,7 +31,14 @@ export class ResourceFilter { const value = this.#filterObject[key]; const valuesArray = Array.isArray(value) ? value : [value]; return this.parenthetical( - this.or(valuesArray.map((value) => this.equals(key, value))) + this.or( + valuesArray.map((value) => { + if (value && value.contains) { + return this.in(value.contains, key); + } + return this.equals(key, value); + }) + ) ); }) .flat() @@ -56,6 +64,15 @@ export class ResourceFilter { return value !== null ? `"/item/${key}" == "${value}"` : null; } + /** + * @param {string} key + * @param value + * @return {string} + */ + in(value, key) { + return value !== null ? `"${value}" in "/item/${key}"` : null; + } + /** * @param {string[]} clauses * @return {string} diff --git a/addons/api/tests/unit/services/resource-filter-store-test.js b/addons/api/tests/unit/services/resource-filter-store-test.js index 4902d8c5b..c748f6751 100644 --- a/addons/api/tests/unit/services/resource-filter-store-test.js +++ b/addons/api/tests/unit/services/resource-filter-store-test.js @@ -10,9 +10,10 @@ module('Unit | Service | resource-filter-store', function (hooks) { const filter = new ResourceFilter({ type: 'oidc', status: ['active', 'pending'], + authorized_actions: [{ contains: 'read' }], }); const expected = - '("/item/type" == "oidc") and ("/item/status" == "active" or "/item/status" == "pending")'; + '("/item/type" == "oidc") and ("/item/status" == "active" or "/item/status" == "pending") and ("read" in "/item/authorized_actions")'; assert.equal(filter.queryExpression, expected); }); });