From f35382a4e0b26f2b6c0973c234443640395044a6 Mon Sep 17 00:00:00 2001 From: Cameron Perera Date: Mon, 3 Mar 2025 09:58:45 -0600 Subject: [PATCH] =?UTF-8?q?refactor:=20=F0=9F=92=A1=20update=20adapter=20w?= =?UTF-8?q?hen=20transforming=20filter=20error=20(#2702)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor: 💡 update adapter when transforming filter error ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-16580 * style: 💄 add comment about adapter changes for translated field ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-16580 * style: 💄 move comment to adapter ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-16580 * style: 💄 update old comment about model fragments ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-16580 * refactor: 💡 use extractErrors in serializers ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-16580 --- addons/api/addon/adapters/application.js | 4 +--- addons/api/addon/serializers/host-set.js | 14 +++++++++++ addons/api/addon/serializers/managed-group.js | 14 +++++++++++ .../tests/unit/serializers/host-set-test.js | 18 +++++++++++++++ .../unit/serializers/managed-group-test.js | 23 +++++++++++++++++-- .../form/managed-group/oidc/index.hbs | 2 +- 6 files changed, 69 insertions(+), 6 deletions(-) diff --git a/addons/api/addon/adapters/application.js b/addons/api/addon/adapters/application.js index e0d930923..aec4f99fb 100644 --- a/addons/api/addon/adapters/application.js +++ b/addons/api/addon/adapters/application.js @@ -291,9 +291,7 @@ export default class ApplicationAdapter extends RESTAdapter.extend( const errors = fieldErrors.map((error) => ({ detail: error.description, // Going forward, nested attributes will be hoisted. Thus "attributes." - // must be stripped from the error name key. Until all models are - // transitioned away from model fragments, however, both this and the - // prior error key mappings are necessary. + // must be stripped from the error name key. source: { pointer: `/data/attributes/${error.name.replace('attributes.', '')}`, }, diff --git a/addons/api/addon/serializers/host-set.js b/addons/api/addon/serializers/host-set.js index 6e303ce14..7d1f7b6df 100644 --- a/addons/api/addon/serializers/host-set.js +++ b/addons/api/addon/serializers/host-set.js @@ -95,4 +95,18 @@ export default class HostSetSerializer extends ApplicationSerializer { return super.normalize(typeClass, normalizedHash, ...rest); } + + /** + * Extracts errors from the payload and transforms specific keys if needed. + * @override + * @return {object} + */ + extractErrors() { + const errors = super.extractErrors(...arguments); + if (errors?.filter) { + errors.filter_string = errors.filter; + delete errors.filter; + } + return errors; + } } diff --git a/addons/api/addon/serializers/managed-group.js b/addons/api/addon/serializers/managed-group.js index b21bc6a8f..d543816be 100644 --- a/addons/api/addon/serializers/managed-group.js +++ b/addons/api/addon/serializers/managed-group.js @@ -53,4 +53,18 @@ export default class ManagedGroupSerializer extends ApplicationSerializer { return super.normalize(typeClass, normalizedHash, ...rest); } + + /** + * Extracts errors from the payload and transforms specific keys if needed. + * @override + * @return {object} + */ + extractErrors() { + const errors = super.extractErrors(...arguments); + if (errors?.filter) { + errors.filter_string = errors.filter; + delete errors.filter; + } + return errors; + } } diff --git a/addons/api/tests/unit/serializers/host-set-test.js b/addons/api/tests/unit/serializers/host-set-test.js index 80f7706ff..dcf4c0821 100644 --- a/addons/api/tests/unit/serializers/host-set-test.js +++ b/addons/api/tests/unit/serializers/host-set-test.js @@ -208,4 +208,22 @@ module('Unit | Serializer | host set', function (hooks) { }, }); }); + + test('it handles errors correctly', function (assert) { + const store = this.owner.lookup('service:store'); + const serializer = store.serializerFor('host-set'); + const schema = store.modelFor('host-set'); + + const errors = { + base: ['Error in provided request.'], + filter: ['This field is required.'], + }; + + const result = serializer.extractErrors(store, schema, errors, null); + + assert.deepEqual(result, { + base: ['Error in provided request.'], + filter_string: ['This field is required.'], + }); + }); }); diff --git a/addons/api/tests/unit/serializers/managed-group-test.js b/addons/api/tests/unit/serializers/managed-group-test.js index 6e31c9e07..bde5990e0 100644 --- a/addons/api/tests/unit/serializers/managed-group-test.js +++ b/addons/api/tests/unit/serializers/managed-group-test.js @@ -183,7 +183,8 @@ module('Unit | Serializer | Managed group', function (hooks) { test('it normalizes correctly', function (assert) { const store = this.owner.lookup('service:store'); const serializer = store.serializerFor('managed-group'); - const hostSetModelClass = store.createRecord('managed-group').constructor; + const managedGroupModelClass = + store.createRecord('managed-group').constructor; const payload = { id: '1', description: 'Description for the test', @@ -196,7 +197,7 @@ module('Unit | Serializer | Managed group', function (hooks) { }; const normalized = serializer.normalizeSingleResponse( store, - hostSetModelClass, + managedGroupModelClass, payload, ); @@ -219,4 +220,22 @@ module('Unit | Serializer | Managed group', function (hooks) { }, }); }); + + test('it handles errors correctly', function (assert) { + const store = this.owner.lookup('service:store'); + const serializer = store.serializerFor('managed-group'); + const schema = store.modelFor('managed-group'); + + const errors = { + base: ['Error in provided request.'], + filter: ['This field is required.'], + }; + + const result = serializer.extractErrors(store, schema, errors, null); + + assert.deepEqual(result, { + base: ['Error in provided request.'], + filter_string: ['This field is required.'], + }); + }); }); diff --git a/ui/admin/app/components/form/managed-group/oidc/index.hbs b/ui/admin/app/components/form/managed-group/oidc/index.hbs index 31c19dad1..a68b802dc 100644 --- a/ui/admin/app/components/form/managed-group/oidc/index.hbs +++ b/ui/admin/app/components/form/managed-group/oidc/index.hbs @@ -66,7 +66,7 @@ {{t 'form.filter.help'}} {{#if @model.errors.filter_string}} - {{#each @model.errors.name as |error|}} + {{#each @model.errors.filter_string as |error|}} {{error.message}} {{/each}}