From 360bf0ffdd98a2cbb5cceac149b134299b5cc0c1 Mon Sep 17 00:00:00 2001 From: Carlos Alcaide Corvo Date: Thu, 28 Oct 2021 11:28:21 -0700 Subject: [PATCH] Refactor model --- .../addon/generated/models/managed-groups.js | 6 ++ addons/api/addon/models/managed-groups.js | 88 +------------------ .../api/addon/serializers/managed-groups.js | 31 +------ .../tests/unit/models/managed-groups-test.js | 1 - .../unit/serializers/managed-groups-test.js | 40 +++++---- 5 files changed, 31 insertions(+), 135 deletions(-) diff --git a/addons/api/addon/generated/models/managed-groups.js b/addons/api/addon/generated/models/managed-groups.js index d6502eee6..0dc62ee1e 100644 --- a/addons/api/addon/generated/models/managed-groups.js +++ b/addons/api/addon/generated/models/managed-groups.js @@ -44,4 +44,10 @@ export default class GeneratedManagedGroupModel extends BaseModel { 'The ID of the Auth Method that is associated with this ManagedGroup', }) auth_method_id; + + @attr('array', { + description: + 'The IDs of the current set of members (accounts) that are associated with this ManagedGroup.', + }) + member_ids } diff --git a/addons/api/addon/models/managed-groups.js b/addons/api/addon/models/managed-groups.js index ddc2d2ba4..d217a0043 100644 --- a/addons/api/addon/models/managed-groups.js +++ b/addons/api/addon/models/managed-groups.js @@ -1,89 +1,3 @@ import GeneratedManagedGroupModel from '../generated/models/managed-groups'; -import { attr } from '@ember-data/model'; -import { computed } from '@ember/object'; -import { A } from '@ember/array'; -export default class ManagedGroupsModel extends GeneratedManagedGroupModel { - // =attributes - /** - * Members is read-only under normal circumstances. But members can - * be persisted via calls to `addMembers()` or `removeMembers()`. - */ - @attr({ - readOnly: true, - defaultValue: () => A(), - emptyArrayIfMissing: true, - }) - member_ids; - - /** - * An array of resolved user instances. - * Unresolvable instances are excluded from the array. - * @type {[UserModel]} - */ - // TODO: Use fragments array to read cross scope members. - @computed('member_ids.[]', 'store') - get members() { - return this.member_ids - .map((id) => this.store.peekRecord('user', id)) - .filter(Boolean); - } - - // =methods - - /** - * Adds members via the `add-members` method. - * See serializer and adapter for more information. - * @param {[string]} memberIDs - * @param {object} options - * @param {object} options.adapterOptions - * @return {Promise} - */ - addMembers(memberIDs, options = { adapterOptions: {} }) { - const defaultAdapterOptions = { - method: 'add-members', - memberIDs, - }; - // There is no "deep merge" in ES. - return this.save({ - ...options, - adapterOptions: { - ...defaultAdapterOptions, - ...options.adapterOptions, - }, - }); - } - - /** - * Delete members via the `remove-members` method. - * See serializer and adapter for more information. - * @param {[string]} memberIDs - * @param {object} options - * @param {object} options.adapterOptions - * @return {Promise} - */ - removeMembers(memberIDs, options = { adapterOptions: {} }) { - const defaultAdapterOptions = { - method: 'remove-members', - memberIDs, - }; - // There is no "deep merge" in ES. - return this.save({ - ...options, - adapterOptions: { - ...defaultAdapterOptions, - ...options.adapterOptions, - }, - }); - } - - /** - * Delete a single member via the `remove-members` method. - * @param {number} memberID - * @param {object} options - * @return {Promise} - */ - removeMember(memberID, options) { - return this.removeMembers([memberID], options); - } -} +export default class ManagedGroupsModel extends GeneratedManagedGroupModel {} diff --git a/addons/api/addon/serializers/managed-groups.js b/addons/api/addon/serializers/managed-groups.js index 3757bcbe0..215d52935 100644 --- a/addons/api/addon/serializers/managed-groups.js +++ b/addons/api/addon/serializers/managed-groups.js @@ -1,32 +1,3 @@ import ApplicationSerializer from './application'; -export default class ManagedGroupsSerializer extends ApplicationSerializer { - // =methods - - /** - * If `adapterOptions.memberIDs` is set (to an array of user IDs), - * then the payload is serialized via `serializewithMembers`. - * @override - * @param {Snapshot} snapshot - * @return {object} - */ - serialize(snapshot) { - let serialized = super.serialize(...arguments); - const memberIDs = snapshot?.adapterOptions?.memberIDs; - if (memberIDs) serialized = this.serializewithMembers(snapshot, memberIDs); - return serialized; - } - - /** - * Returns a payload containing only the `member_ids` array (and version). - * @param {Snapshot} snapshot - * @param {[string]} memberIDs - * @return {object} - */ - serializewithMembers(snapshot, memberIDs) { - return { - version: snapshot.attr('version'), - member_ids: memberIDs, - }; - } -} +export default class ManagedGroupsSerializer extends ApplicationSerializer {} diff --git a/addons/api/tests/unit/models/managed-groups-test.js b/addons/api/tests/unit/models/managed-groups-test.js index 426faa008..fd79c2f01 100644 --- a/addons/api/tests/unit/models/managed-groups-test.js +++ b/addons/api/tests/unit/models/managed-groups-test.js @@ -4,7 +4,6 @@ import { setupTest } from 'ember-qunit'; module('Unit | Model | managed groups', function (hooks) { setupTest(hooks); - // Replace this with your real tests. test('it exists', function (assert) { let store = this.owner.lookup('service:store'); let model = store.createRecord('managed-groups', {}); diff --git a/addons/api/tests/unit/serializers/managed-groups-test.js b/addons/api/tests/unit/serializers/managed-groups-test.js index f4f68de33..a9b7deaa4 100644 --- a/addons/api/tests/unit/serializers/managed-groups-test.js +++ b/addons/api/tests/unit/serializers/managed-groups-test.js @@ -4,10 +4,8 @@ import { setupTest } from 'ember-qunit'; module('Unit | Serializer | Managed groups', function (hooks) { setupTest(hooks); - test('it serializes managed groups normally, without members', function (assert) { + test('it serializes correctly on create', function (assert) { assert.expect(1); - // TODO: move store declaration at module level. Before doing so, to make sure it works, generate one out, one in and deep compare. - // TODO: if moving store out works, move serializer too. const store = this.owner.lookup('service:store'); const serializer = store.serializerFor('managed-groups'); const record = store.createRecord('managed-groups', { @@ -24,33 +22,41 @@ module('Unit | Serializer | Managed groups', function (hooks) { assert.deepEqual(serializedRecord, { name: 'Group', description: 'Description', + member_ids: ['1', '2'], version: 1, auth_method_id: '1234', type: '80', }); }); - test('it seralizes only members associated with this group and version when a `memberIDs` array is provided', function (assert) { + test('it serializes correctly on update', function (assert) { assert.expect(1); const store = this.owner.lookup('service:store'); const serializer = store.serializerFor('managed-groups'); - const record = store.createRecord('managed-groups', { - name: 'Group', - description: 'Description', + store.push({ + data: { + id: '1', + type: 'managed-groups', + attributes: { + name: 'Group Test', + description: 'Description for the test', + member_ids: ['1', '2'], + version: 1, + auth_method_id: '1234', + type: '80', + }, + }, + }); + const record = store.peekRecord('managed-groups', '1'); + const snapshot = record._createSnapshot(); + const serializedRecord = serializer.serialize(snapshot); + assert.deepEqual(serializedRecord, { + name: 'Group Test', + description: 'Description for the test', member_ids: ['1', '2'], version: 1, auth_method_id: '1234', type: '80', }); - const snapshot = record._createSnapshot(); - snapshot.adapterOptions = { - memberIDs: ['4', '5'], - }; - const serializedRecord = serializer.serialize(snapshot); - console.log(JSON.stringify(serializedRecord)); - assert.deepEqual(serializedRecord, { - member_ids: ['4', '5'], - version: 1, - }); }); });