From fe2232b32033cc260fad90388ea2cf88ec9c7560 Mon Sep 17 00:00:00 2001 From: Susmitha Girumala Date: Mon, 21 Sep 2020 14:40:16 -0400 Subject: [PATCH 1/3] fix: Do not serialize scope_id for nested resources Nested resources currently are accounts, host-sets, and hosts. --- addons/api/addon/models/account.js | 7 +++++++ addons/api/addon/models/host-set.js | 8 ++++++++ addons/api/addon/models/host.js | 8 ++++++++ addons/api/addon/serializers/application.js | 8 +++++--- .../tests/unit/serializers/application-test.js | 15 +++++++++++++++ 5 files changed, 43 insertions(+), 3 deletions(-) diff --git a/addons/api/addon/models/account.js b/addons/api/addon/models/account.js index 71b337f44..ff6b9d583 100644 --- a/addons/api/addon/models/account.js +++ b/addons/api/addon/models/account.js @@ -4,6 +4,13 @@ import { computed } from '@ember/object'; export default class AccountModel extends GeneratedAccountModel { + // =properties + + /** + * Account resource is nested within auth methods. + */ + nestedResource = true; + // =attributes /** diff --git a/addons/api/addon/models/host-set.js b/addons/api/addon/models/host-set.js index 61033dd79..6b4587ce6 100644 --- a/addons/api/addon/models/host-set.js +++ b/addons/api/addon/models/host-set.js @@ -2,6 +2,14 @@ import GeneratedHostSetModel from '../generated/models/host-set'; import { fragmentArray } from 'ember-data-model-fragments/attributes'; export default class HostSetModel extends GeneratedHostSetModel { + + // =properties + + /** + * Account resource is nested within auth methods. + */ + nestedResource = true; + // =attributes /** diff --git a/addons/api/addon/models/host.js b/addons/api/addon/models/host.js index 7748e023b..2b6957dc2 100644 --- a/addons/api/addon/models/host.js +++ b/addons/api/addon/models/host.js @@ -2,6 +2,14 @@ import GeneratedHostModel from '../generated/models/host'; import { fragment } from 'ember-data-model-fragments/attributes'; export default class HostModel extends GeneratedHostModel { + + // =properties + + /** + * Account resource is nested within auth methods. + */ + nestedResource = true; + /** * Attributes of this resource, if any, represented as a JSON fragment. * @type {FragmentHostAttributesModel} diff --git a/addons/api/addon/serializers/application.js b/addons/api/addon/serializers/application.js index a41c97730..cdbd2b56d 100644 --- a/addons/api/addon/serializers/application.js +++ b/addons/api/addon/serializers/application.js @@ -70,9 +70,11 @@ export default class ApplicationSerializer extends RESTSerializer { const serialized = super.serialize(...arguments); // Delete `scope` field delete serialized.scope; - // And serialize `scope_id` - const scope_id = snapshot?.attr('scope')?.attr('scope_id'); - if (scope_id) serialized.scope_id = scope_id; + // And serialize `scope_id` when not a nested resource + if(!snapshot?.record?.nestedResource) { + const scope_id = snapshot?.attr('scope')?.attr('scope_id'); + if (scope_id) serialized.scope_id = scope_id; + } return serialized; } diff --git a/addons/api/tests/unit/serializers/application-test.js b/addons/api/tests/unit/serializers/application-test.js index 3ab733e52..85702eac4 100644 --- a/addons/api/tests/unit/serializers/application-test.js +++ b/addons/api/tests/unit/serializers/application-test.js @@ -49,6 +49,21 @@ module('Unit | Serializer | application', function (hooks) { }); }); + test('it does not serialize scope_id when resource is nested', function (assert) { + assert.expect(1); + const store = this.owner.lookup('service:store'); + const record = store.createRecord('account', { + name: 'Account', + description: 'Description', + scope: { + scope_id: 'global', + type: 'global', + }, + }); + const serializedRecord = record.serialize(); + assert.notOk(serializedRecord.scope_id); + }); + test('it serializes non-nullish version fields', function (assert) { assert.expect(2); const store = this.owner.lookup('service:store'); From aca96d6dd8912b3c635b09878bef7f805c9a0bf8 Mon Sep 17 00:00:00 2001 From: Susmitha Girumala Date: Mon, 21 Sep 2020 15:03:23 -0400 Subject: [PATCH 2/3] test: Refactor 'nestedResource' to 'serializeScopeID' --- addons/api/addon/models/account.js | 4 ++-- addons/api/addon/models/base.js | 8 ++++++++ addons/api/addon/models/host-set.js | 4 ++-- addons/api/addon/models/host.js | 4 ++-- addons/api/addon/serializers/application.js | 4 ++-- .../tests/unit/serializers/application-test.js | 18 ++++++++++++------ 6 files changed, 28 insertions(+), 14 deletions(-) diff --git a/addons/api/addon/models/account.js b/addons/api/addon/models/account.js index ff6b9d583..77d631bca 100644 --- a/addons/api/addon/models/account.js +++ b/addons/api/addon/models/account.js @@ -7,9 +7,9 @@ export default class AccountModel extends GeneratedAccountModel { // =properties /** - * Account resource is nested within auth methods. + * @type {boolean} */ - nestedResource = true; + serializeScopeID = false; // =attributes diff --git a/addons/api/addon/models/base.js b/addons/api/addon/models/base.js index 2a01e39f5..f79834fe5 100644 --- a/addons/api/addon/models/base.js +++ b/addons/api/addon/models/base.js @@ -26,6 +26,14 @@ import { get } from '@ember/object'; * 2) Or as an ID: `record.scopeID`. */ export default class BaseModel extends Model { + + // =properties + + /** + * @type {boolean} + */ + serializeScopeID = true; + // =relationships /** diff --git a/addons/api/addon/models/host-set.js b/addons/api/addon/models/host-set.js index 6b4587ce6..fce605ebb 100644 --- a/addons/api/addon/models/host-set.js +++ b/addons/api/addon/models/host-set.js @@ -6,9 +6,9 @@ export default class HostSetModel extends GeneratedHostSetModel { // =properties /** - * Account resource is nested within auth methods. + * @type {boolean} */ - nestedResource = true; + serializeScopeID = false; // =attributes diff --git a/addons/api/addon/models/host.js b/addons/api/addon/models/host.js index 2b6957dc2..6790b482c 100644 --- a/addons/api/addon/models/host.js +++ b/addons/api/addon/models/host.js @@ -6,9 +6,9 @@ export default class HostModel extends GeneratedHostModel { // =properties /** - * Account resource is nested within auth methods. + * @type {boolean} */ - nestedResource = true; + serializeScopeID = false; /** * Attributes of this resource, if any, represented as a JSON fragment. diff --git a/addons/api/addon/serializers/application.js b/addons/api/addon/serializers/application.js index cdbd2b56d..5473a05bc 100644 --- a/addons/api/addon/serializers/application.js +++ b/addons/api/addon/serializers/application.js @@ -70,8 +70,8 @@ export default class ApplicationSerializer extends RESTSerializer { const serialized = super.serialize(...arguments); // Delete `scope` field delete serialized.scope; - // And serialize `scope_id` when not a nested resource - if(!snapshot?.record?.nestedResource) { + // And serialize `scope_id` + if(snapshot?.record?.serializeScopeID) { const scope_id = snapshot?.attr('scope')?.attr('scope_id'); if (scope_id) serialized.scope_id = scope_id; } diff --git a/addons/api/tests/unit/serializers/application-test.js b/addons/api/tests/unit/serializers/application-test.js index 85702eac4..1089e3b74 100644 --- a/addons/api/tests/unit/serializers/application-test.js +++ b/addons/api/tests/unit/serializers/application-test.js @@ -30,7 +30,7 @@ module('Unit | Serializer | application', function (hooks) { }); }); - test('it serializes scope_id when scope is set', function (assert) { + test('it serializes scope_id', function (assert) { assert.expect(1); const store = this.owner.lookup('service:store'); const record = store.createRecord('user', { @@ -49,19 +49,25 @@ module('Unit | Serializer | application', function (hooks) { }); }); - test('it does not serialize scope_id when resource is nested', function (assert) { + test('it does not serialize scope_id when serializeScopeID is false', function (assert) { assert.expect(1); const store = this.owner.lookup('service:store'); - const record = store.createRecord('account', { - name: 'Account', + const serializer = store.serializerFor('user'); + const record = store.createRecord('user', { + name: 'User', description: 'Description', scope: { scope_id: 'global', type: 'global', }, }); - const serializedRecord = record.serialize(); - assert.notOk(serializedRecord.scope_id); + const snapshot = record._createSnapshot(); + snapshot.record.serializeScopeID = false; + const serializedRecord = serializer.serialize(snapshot); + assert.deepEqual(serializedRecord, { + name: 'User', + description: 'Description' + }); }); test('it serializes non-nullish version fields', function (assert) { From 0a1eafe55e96c3360e2439dcb30c01ac6b8990c3 Mon Sep 17 00:00:00 2001 From: Susmitha Girumala Date: Mon, 21 Sep 2020 18:23:32 -0400 Subject: [PATCH 3/3] refactor: Refactor seralizeScopeID from models to serializers --- addons/api/addon/models/account.js | 7 ------ addons/api/addon/models/base.js | 7 ------ addons/api/addon/models/host-set.js | 7 ------ addons/api/addon/models/host.js | 8 +------ addons/api/addon/serializers/account.js | 8 +++++++ addons/api/addon/serializers/application.js | 10 +++++++- addons/api/addon/serializers/host-set.js | 8 +++++++ addons/api/addon/serializers/host.js | 12 ++++++++++ addons/api/app/serializers/host.js | 1 + .../unit/serializers/application-test.js | 2 +- .../api/tests/unit/serializers/host-test.js | 23 +++++++++++++++++++ 11 files changed, 63 insertions(+), 30 deletions(-) create mode 100644 addons/api/addon/serializers/host.js create mode 100644 addons/api/app/serializers/host.js create mode 100644 addons/api/tests/unit/serializers/host-test.js diff --git a/addons/api/addon/models/account.js b/addons/api/addon/models/account.js index 77d631bca..71b337f44 100644 --- a/addons/api/addon/models/account.js +++ b/addons/api/addon/models/account.js @@ -4,13 +4,6 @@ import { computed } from '@ember/object'; export default class AccountModel extends GeneratedAccountModel { - // =properties - - /** - * @type {boolean} - */ - serializeScopeID = false; - // =attributes /** diff --git a/addons/api/addon/models/base.js b/addons/api/addon/models/base.js index f79834fe5..d883c8846 100644 --- a/addons/api/addon/models/base.js +++ b/addons/api/addon/models/base.js @@ -27,13 +27,6 @@ import { get } from '@ember/object'; */ export default class BaseModel extends Model { - // =properties - - /** - * @type {boolean} - */ - serializeScopeID = true; - // =relationships /** diff --git a/addons/api/addon/models/host-set.js b/addons/api/addon/models/host-set.js index fce605ebb..583971735 100644 --- a/addons/api/addon/models/host-set.js +++ b/addons/api/addon/models/host-set.js @@ -3,13 +3,6 @@ import { fragmentArray } from 'ember-data-model-fragments/attributes'; export default class HostSetModel extends GeneratedHostSetModel { - // =properties - - /** - * @type {boolean} - */ - serializeScopeID = false; - // =attributes /** diff --git a/addons/api/addon/models/host.js b/addons/api/addon/models/host.js index 6790b482c..a2e855084 100644 --- a/addons/api/addon/models/host.js +++ b/addons/api/addon/models/host.js @@ -3,16 +3,10 @@ import { fragment } from 'ember-data-model-fragments/attributes'; export default class HostModel extends GeneratedHostModel { - // =properties - - /** - * @type {boolean} - */ - serializeScopeID = false; - /** * Attributes of this resource, if any, represented as a JSON fragment. * @type {FragmentHostAttributesModel} */ @fragment('fragment-host-attributes', { defaultValue: {} }) attributes; + } diff --git a/addons/api/addon/serializers/account.js b/addons/api/addon/serializers/account.js index 01618a081..5f5291dcd 100644 --- a/addons/api/addon/serializers/account.js +++ b/addons/api/addon/serializers/account.js @@ -1,6 +1,14 @@ import ApplicationSerializer from './application'; export default class AccountSerializer extends ApplicationSerializer { + + // =properties + + /** + * @type {boolean} + */ + serializeScopeID = false; + // =methods /** diff --git a/addons/api/addon/serializers/application.js b/addons/api/addon/serializers/application.js index 5473a05bc..2819231fa 100644 --- a/addons/api/addon/serializers/application.js +++ b/addons/api/addon/serializers/application.js @@ -7,6 +7,14 @@ import { copy } from 'ember-copy'; * Manages serialization/normalization of data to/from the API. */ export default class ApplicationSerializer extends RESTSerializer { + + // =properties + + /** + * @type {boolean} + */ + serializeScopeID = true; + // =methods /** @@ -71,7 +79,7 @@ export default class ApplicationSerializer extends RESTSerializer { // Delete `scope` field delete serialized.scope; // And serialize `scope_id` - if(snapshot?.record?.serializeScopeID) { + if(this.serializeScopeID) { const scope_id = snapshot?.attr('scope')?.attr('scope_id'); if (scope_id) serialized.scope_id = scope_id; } diff --git a/addons/api/addon/serializers/host-set.js b/addons/api/addon/serializers/host-set.js index 591da7c76..ee38bd5eb 100644 --- a/addons/api/addon/serializers/host-set.js +++ b/addons/api/addon/serializers/host-set.js @@ -1,6 +1,14 @@ import ApplicationSerializer from './application'; export default class HostSetSerializer extends ApplicationSerializer { + + // =properties + + /** + * @type {boolean} + */ + serializeScopeID = false; + // =methods /** diff --git a/addons/api/addon/serializers/host.js b/addons/api/addon/serializers/host.js new file mode 100644 index 000000000..fad6f2ca7 --- /dev/null +++ b/addons/api/addon/serializers/host.js @@ -0,0 +1,12 @@ +import ApplicationSerializer from './application'; + +export default class HostSerializer extends ApplicationSerializer { + + // =properties + + /** + * @type {boolean} + */ + serializeScopeID = false; + +} diff --git a/addons/api/app/serializers/host.js b/addons/api/app/serializers/host.js new file mode 100644 index 000000000..33844fbaf --- /dev/null +++ b/addons/api/app/serializers/host.js @@ -0,0 +1 @@ +export { default } from 'api/serializers/host'; diff --git a/addons/api/tests/unit/serializers/application-test.js b/addons/api/tests/unit/serializers/application-test.js index 1089e3b74..5c2c07a20 100644 --- a/addons/api/tests/unit/serializers/application-test.js +++ b/addons/api/tests/unit/serializers/application-test.js @@ -62,7 +62,7 @@ module('Unit | Serializer | application', function (hooks) { }, }); const snapshot = record._createSnapshot(); - snapshot.record.serializeScopeID = false; + serializer.serializeScopeID = false; const serializedRecord = serializer.serialize(snapshot); assert.deepEqual(serializedRecord, { name: 'User', diff --git a/addons/api/tests/unit/serializers/host-test.js b/addons/api/tests/unit/serializers/host-test.js new file mode 100644 index 000000000..c31a5ce4e --- /dev/null +++ b/addons/api/tests/unit/serializers/host-test.js @@ -0,0 +1,23 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Serializer | host', function(hooks) { + setupTest(hooks); + + // Replace this with your real tests. + test('it exists', function(assert) { + let store = this.owner.lookup('service:store'); + let serializer = store.serializerFor('host'); + + assert.ok(serializer); + }); + + test('it serializes records', function(assert) { + let store = this.owner.lookup('service:store'); + let record = store.createRecord('host', {}); + + let serializedRecord = record.serialize(); + + assert.ok(serializedRecord); + }); +});