diff --git a/addons/api/addon/generated/models/managed-group.js b/addons/api/addon/generated/models/managed-group.js new file mode 100644 index 000000000..d6502eee6 --- /dev/null +++ b/addons/api/addon/generated/models/managed-group.js @@ -0,0 +1,47 @@ +import BaseModel from '../../models/base'; +import { attr } from '@ember-data/model'; + +/** + * A managed group is a resource that represents a collection of accounts. + */ +export default class GeneratedManagedGroupModel extends BaseModel { + // =attributes + + @attr('string', { + description: 'Optional name for identification purposes.', + }) + name; + + @attr('string', { + description: 'Optional user-set description for identification purposes.', + }) + description; + + @attr('date', { + description: 'The time this resource was created', + readOnly: true, + }) + created_time; + + @attr('date', { + description: 'The time this resource was last updated.', + readOnly: true, + }) + updated_time; + + @attr('number', { + description: 'Current version number of this resource.', + }) + version; + + @attr('string', { + description: 'The type of this ManagedGroup.', + }) + type; + + @attr('string', { + description: + 'The ID of the Auth Method that is associated with this ManagedGroup', + }) + auth_method_id; +} diff --git a/addons/api/addon/models/fragment-managed-group-attributes.js b/addons/api/addon/models/fragment-managed-group-attributes.js new file mode 100644 index 000000000..a4d0583ff --- /dev/null +++ b/addons/api/addon/models/fragment-managed-group-attributes.js @@ -0,0 +1,12 @@ +import Fragment from 'ember-data-model-fragments/fragment'; +import { attr } from '@ember-data/model'; + +export default class FragmentManagedGroupAttributesModel extends Fragment { + // =attributes (OIDC) + + @attr('string', { + description: + 'The boolean expression filter to use to determine membership.', + }) + filter; +} diff --git a/addons/api/addon/models/managed-group.js b/addons/api/addon/models/managed-group.js new file mode 100644 index 000000000..426807de2 --- /dev/null +++ b/addons/api/addon/models/managed-group.js @@ -0,0 +1,21 @@ +import GeneratedManagedGroupModel from '../generated/models/managed-group'; +import { attr } from '@ember-data/model'; +import { fragment } from 'ember-data-model-fragments/attributes'; +import { A } from '@ember/array'; + +export default class ManagedGroupModel 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; + + @fragment('fragment-managed-group-attributes', { defaultValue: {} }) + attributes; +} diff --git a/addons/api/addon/serializers/fragment-managed-group-attributes.js b/addons/api/addon/serializers/fragment-managed-group-attributes.js new file mode 100644 index 000000000..230358a20 --- /dev/null +++ b/addons/api/addon/serializers/fragment-managed-group-attributes.js @@ -0,0 +1,27 @@ +import JSONSerializer from '@ember-data/serializer/json'; + +export default class FragmentManagedGroupAttributesSerializer extends JSONSerializer { + /** + * If an attribute is annotated as readOnly in the model, don't serialize it. + * Otherwise delegate to default attribute serializer. + * @override + * @method serializeAttribute + * @param {Snapshot} snapshot + * @param {Object} json + * @param {String} key + * @param {Object} attribute + */ + serializeAttribute(snapshot, json, key, attribute) { + const { type, options } = attribute; + let value = super.serializeAttribute(...arguments); + // Convert empty string to null. + if (type === 'string' && json[key] === '') json[key] = null; + // Do not serialize read-only attributes. + if (options.readOnly) delete json[key]; + // Version is sent only if it has a non-nullish value + if (key === 'version') { + if (json[key] === null || json[key] === undefined) delete json[key]; + } + return value; + } +} diff --git a/addons/api/addon/serializers/managed-group.js b/addons/api/addon/serializers/managed-group.js new file mode 100644 index 000000000..cb03236af --- /dev/null +++ b/addons/api/addon/serializers/managed-group.js @@ -0,0 +1,3 @@ +import ApplicationSerializer from './application'; + +export default class ManagedGroupSerializer extends ApplicationSerializer {} diff --git a/addons/api/app/models/fragment-managed-group-attributes.js b/addons/api/app/models/fragment-managed-group-attributes.js new file mode 100644 index 000000000..5d7d865ef --- /dev/null +++ b/addons/api/app/models/fragment-managed-group-attributes.js @@ -0,0 +1 @@ +export { default } from 'api/models/fragment-managed-group-attributes'; diff --git a/addons/api/app/models/managed-group.js b/addons/api/app/models/managed-group.js new file mode 100644 index 000000000..87894c989 --- /dev/null +++ b/addons/api/app/models/managed-group.js @@ -0,0 +1 @@ +export { default } from 'api/models/managed-group'; diff --git a/addons/api/app/serializers/fragment-managed-group-attributes.js b/addons/api/app/serializers/fragment-managed-group-attributes.js new file mode 100644 index 000000000..1038afc31 --- /dev/null +++ b/addons/api/app/serializers/fragment-managed-group-attributes.js @@ -0,0 +1 @@ +export { default } from 'api/serializers/fragment-managed-group-attributes'; diff --git a/addons/api/tests/unit/models/fragment-managed-group-attributes-test.js b/addons/api/tests/unit/models/fragment-managed-group-attributes-test.js new file mode 100644 index 000000000..e33479dec --- /dev/null +++ b/addons/api/tests/unit/models/fragment-managed-group-attributes-test.js @@ -0,0 +1,13 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Model | fragment managed group attributes', 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('fragment-managed-group-attributes', {}); + assert.ok(model); + }); +}); diff --git a/addons/api/tests/unit/models/managed-group-test.js b/addons/api/tests/unit/models/managed-group-test.js new file mode 100644 index 000000000..6df99cc9f --- /dev/null +++ b/addons/api/tests/unit/models/managed-group-test.js @@ -0,0 +1,12 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Model | managed group', function (hooks) { + setupTest(hooks); + + test('it exists', function (assert) { + let store = this.owner.lookup('service:store'); + let model = store.createRecord('managed-group', {}); + assert.ok(model); + }); +}); diff --git a/addons/api/tests/unit/serializers/fragment-managed-group-attributes-test.js b/addons/api/tests/unit/serializers/fragment-managed-group-attributes-test.js new file mode 100644 index 000000000..69af8a3a1 --- /dev/null +++ b/addons/api/tests/unit/serializers/fragment-managed-group-attributes-test.js @@ -0,0 +1,21 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module( + 'Unit | Serializer | fragment managed groups attributes', + function (hooks) { + setupTest(hooks); + + test('it serializes empty string to null', function (assert) { + assert.expect(1); + const store = this.owner.lookup('service:store'); + const record = store.createRecord('fragment-managed-group-attributes', { + filter: '', + }); + const serializedRecord = record.serialize(); + assert.deepEqual(serializedRecord, { + filter: null, + }); + }); + } +); diff --git a/addons/api/tests/unit/serializers/managed-group-test.js b/addons/api/tests/unit/serializers/managed-group-test.js new file mode 100644 index 000000000..029a92dd4 --- /dev/null +++ b/addons/api/tests/unit/serializers/managed-group-test.js @@ -0,0 +1,161 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Serializer | Managed group', function (hooks) { + setupTest(hooks); + + test('it serializes correctly on create with no filter provided', function (assert) { + assert.expect(1); + const store = this.owner.lookup('service:store'); + const serializer = store.serializerFor('managed-group'); + const record = store.createRecord('managed-group', { + name: 'Group', + description: 'Description', + member_ids: ['1', '2'], + version: 1, + auth_method_id: '1234', + }); + const snapshot = record._createSnapshot(); + snapshot.adapterOptions = {}; + const serializedRecord = serializer.serialize(snapshot); + assert.deepEqual(serializedRecord, { + name: 'Group', + description: 'Description', + version: 1, + auth_method_id: '1234', + type: null, + attributes: { + filter: null, + }, + }); + }); + + test('it serializes correctly on create when filter provided', function (assert) { + assert.expect(1); + const store = this.owner.lookup('service:store'); + const serializer = store.serializerFor('managed-group'); + const record = store.createRecord('managed-group', { + name: 'Group', + description: 'Description', + member_ids: ['1', '2'], + version: 1, + auth_method_id: '1234', + type: 'oidc', + attributes: { + filter: 'key=value', + }, + }); + const snapshot = record._createSnapshot(); + snapshot.adapterOptions = {}; + const serializedRecord = serializer.serialize(snapshot); + assert.deepEqual(serializedRecord, { + name: 'Group', + description: 'Description', + version: 1, + auth_method_id: '1234', + type: 'oidc', + attributes: { + filter: 'key=value', + }, + }); + }); + + test('it does not serialize version when it has null or undefined value', function (assert) { + assert.expect(1); + const store = this.owner.lookup('service:store'); + const serializer = store.serializerFor('managed-group'); + store.push({ + data: { + id: '1', + type: 'managed-group', + attributes: { + name: 'Group Test', + description: 'Description for the test', + member_ids: ['1', '2'], + version: undefined, + auth_method_id: '1234', + type: 'oidc', + attributes: { + filter: 'key=value', + }, + }, + }, + }); + const record = store.peekRecord('managed-group', '1'); + const snapshot = record._createSnapshot(); + const serializedRecord = serializer.serialize(snapshot); + assert.deepEqual(serializedRecord, { + name: 'Group Test', + description: 'Description for the test', + auth_method_id: '1234', + type: 'oidc', + attributes: { + filter: 'key=value', + }, + }); + }); + + test('it does not serialize readOnly attributes', function (assert) { + assert.expect(1); + const store = this.owner.lookup('service:store'); + const serializer = store.serializerFor('managed-group'); + const record = store.createRecord('managed-group', { + name: 'Group', + description: 'Description', + version: 1, + auth_method_id: '1234', + member_ids: ['1', '2'], + created_time: Date.now(), + updated_time: Date.now(), + }); + const snapshot = record._createSnapshot(); + snapshot.adapterOptions = {}; + const serializedRecord = serializer.serialize(snapshot); + assert.deepEqual(serializedRecord, { + name: 'Group', + description: 'Description', + version: 1, + auth_method_id: '1234', + type: null, + attributes: { + filter: null, + }, + }); + }); + + test('it serializes correctly on update', function (assert) { + assert.expect(1); + const store = this.owner.lookup('service:store'); + const serializer = store.serializerFor('managed-group'); + store.push({ + data: { + id: '1', + type: 'managed-group', + attributes: { + name: 'Group Test', + description: 'Description for the test', + member_ids: ['1', '2'], + version: 1, + auth_method_id: '1234', + type: 'oidc', + attributes: { + filter: 'key=value', + }, + }, + }, + }); + const record = store.peekRecord('managed-group', '1'); + const snapshot = record._createSnapshot(); + const serializedRecord = serializer.serialize(snapshot); + assert.deepEqual(serializedRecord, { + name: 'Group Test', + description: 'Description for the test', + version: 1, + auth_method_id: '1234', + type: 'oidc', + attributes: { + filter: 'key=value', + }, + }); + }); +}); diff --git a/yarn.lock b/yarn.lock index b390623ae..3d3cb02ab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9152,9 +9152,9 @@ electron-rebuild@^2.0.3: yargs "^16.0.0" electron-to-chromium@^1.3.867: - version "1.3.883" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.883.tgz#cc409921469b3aa6ab6efd65cc2a4375128bb703" - integrity sha512-goyjNx4wB9j911PBteb+AXNbErug7rJVkmDXWdw5SCVn2JlARBwsqucPkvp1h5mXWxHUbBRK3bwXTrqSxSiAIQ== + version "1.3.884" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.884.tgz#0cd8c3a80271fd84a81f284c60fb3c9ecb33c166" + integrity sha512-kOaCAa+biA98PwH5BpCkeUeTL6mCeg8p3Q3OhqzPyqhu/5QUnWAN2wr/3IK8xMQxIV76kfoQpP+Bn/wij/jXrg== element-resize-detector@^1.2.2: version "1.2.3"