From ee6999251d4ce4206fa652f459ad60675cdb5c77 Mon Sep 17 00:00:00 2001 From: Randall Morey Date: Fri, 7 Aug 2020 15:42:40 -0400 Subject: [PATCH] =?UTF-8?q?chore:=20=F0=9F=A4=96=20add=20support=20for=20g?= =?UTF-8?q?rants=20on=20role=20model?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- addons/api/addon/models/role.js | 29 +++++++++++- addons/api/addon/serializers/role.js | 29 ++++++++++++ addons/api/app/serializers/role.js | 1 + .../api/tests/unit/serializers/role-test.js | 44 +++++++++++++++++++ 4 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 addons/api/addon/serializers/role.js create mode 100644 addons/api/app/serializers/role.js create mode 100644 addons/api/tests/unit/serializers/role-test.js diff --git a/addons/api/addon/models/role.js b/addons/api/addon/models/role.js index dbb69dce8..09ff5d256 100644 --- a/addons/api/addon/models/role.js +++ b/addons/api/addon/models/role.js @@ -1,3 +1,30 @@ import GeneratedRoleModel from '../generated/models/role'; +import { array } from 'ember-data-model-fragments/attributes'; -export default class RoleModel extends GeneratedRoleModel {} +export default class RoleModel extends GeneratedRoleModel { + + // =attributes + + /** + * Grants is read-only _most_ under normal circumstances. But grants can + * be persisted via a dedicated call to `saveGrants()`. + */ + @array({readOnly: true}) grants; + + // =methods + + /** + * Saves the `grants` array on the role via the `set-grants` method. + * See serializer and adapter for more information. + * @return {Promise} + */ + saveGrants() { + return this.save({ + adapterOptions: { + method: 'set-grants', + serializeGrants: true + } + }); + } + +} diff --git a/addons/api/addon/serializers/role.js b/addons/api/addon/serializers/role.js new file mode 100644 index 000000000..69e8fe568 --- /dev/null +++ b/addons/api/addon/serializers/role.js @@ -0,0 +1,29 @@ +import ApplicationSerializer from './application'; +import { get } from '@ember/object'; + +export default class RoleSerializer extends ApplicationSerializer { + + // =methods + + /** + * If `adapterOptions.serializeGrants` is true, the serialization should + * include **only grants** and nothing else. Normally, grants are not + * serialized. + * @override + * @param {Snapshot} snapshot + * @return {object} + */ + serialize(snapshot) { + const serializeGrants = get(snapshot, 'adapterOptions.serializeGrants'); + let serialized = super.serialize(...arguments); + if (serializeGrants) serialized = this.serializeWithGrants(snapshot); + return serialized; + } + + serializeWithGrants(snapshot) { + return { + grants: snapshot.attr('grants') + }; + } + +} diff --git a/addons/api/app/serializers/role.js b/addons/api/app/serializers/role.js new file mode 100644 index 000000000..58c592caf --- /dev/null +++ b/addons/api/app/serializers/role.js @@ -0,0 +1 @@ +export { default } from 'api/serializers/role'; diff --git a/addons/api/tests/unit/serializers/role-test.js b/addons/api/tests/unit/serializers/role-test.js new file mode 100644 index 000000000..7c97e2db5 --- /dev/null +++ b/addons/api/tests/unit/serializers/role-test.js @@ -0,0 +1,44 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Serializer | role', function(hooks) { + setupTest(hooks); + + test('it serializes roles normally, without grants', function (assert) { + assert.expect(1); + const store = this.owner.lookup('service:store'); + const serializer = store.serializerFor('role'); + const record = store.createRecord('role', { + name: 'User', + description: 'Description', + grants: ['foo', 'bar'] + }); + const snapshot = record._createSnapshot(); + snapshot.adapterOptions = {}; + const serializedRecord = serializer.serialize(snapshot); + assert.deepEqual(serializedRecord, { + name: 'User', + description: 'Description' + }); + }); + + test('it serializes only grants when `adapterOptions.serializeGrants` is true', function (assert) { + assert.expect(1); + const store = this.owner.lookup('service:store'); + const serializer = store.serializerFor('role'); + const record = store.createRecord('role', { + name: 'User', + description: 'Description', + grants: ['foo', 'bar'] + }); + const snapshot = record._createSnapshot(); + snapshot.adapterOptions = { + serializeGrants: true + }; + const serializedRecord = serializer.serialize(snapshot); + assert.deepEqual(serializedRecord, { + grants: ['foo', 'bar'] + }); + }); + +});