From 4ea8007c207dd5a4c3e4f43a7ea9832afa3bc303 Mon Sep 17 00:00:00 2001 From: Randall Morey Date: Tue, 1 Sep 2020 12:03:36 -0400 Subject: [PATCH] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20add=20mocks=20for=20grou?= =?UTF-8?q?p=20members?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ui/core/mirage/config.js | 25 +++++++++++++++++++++++++ ui/core/mirage/factories/group.js | 15 ++++++++++++++- ui/core/mirage/models/group.js | 7 +++++++ ui/core/mirage/scenarios/default.js | 6 ++---- ui/core/mirage/serializers/group.js | 16 +++++++++++++++- 5 files changed, 63 insertions(+), 6 deletions(-) create mode 100644 ui/core/mirage/models/group.js diff --git a/ui/core/mirage/config.js b/ui/core/mirage/config.js index 2142ae804..8bc387276 100644 --- a/ui/core/mirage/config.js +++ b/ui/core/mirage/config.js @@ -110,6 +110,31 @@ export default function() { this.get('/scopes/:scope_id/groups/:id'); this.patch('/scopes/:scope_id/groups/:id'); this.del('/scopes/:scope_id/groups/:id'); + this.post('/scopes/:scope_id/groups/:idMethod', function ({ groups }, { params: { idMethod } }) { + const attrs = this.normalizedRequestAttrs(); + const id = idMethod.split(':')[0]; + const method = idMethod.split(':')[1]; + const group = groups.find(id); + const updatedAttrs = { + version: attrs.version, + memberIds: group.memberIds + }; + // If adding members, push them into the array + if (method === 'add-members') { + attrs.memberIds.forEach(id => { + if (!updatedAttrs.memberIds.includes(id)) { + updatedAttrs.memberIds.push(id); + } + }); + } + // If deleting members, filter them out of the array + if (method === 'remove-members') { + updatedAttrs.memberIds = updatedAttrs.memberIds.filter(id => { + return !attrs.memberIds.includes(id); + }); + } + return group.update(updatedAttrs); + }); // Other resources // host-catalog diff --git a/ui/core/mirage/factories/group.js b/ui/core/mirage/factories/group.js index 41bd91a03..80ea3e5d6 100644 --- a/ui/core/mirage/factories/group.js +++ b/ui/core/mirage/factories/group.js @@ -1,5 +1,18 @@ import factory from '../generated/factories/group'; +import { trait } from 'ember-cli-mirage'; export default factory.extend({ - id: (i) => `group-${i}` + id: (i) => `group-${i}`, + + /** + * Generates some users for the same scope and assigns them to the group + * as members. + */ + withMembers: trait({ + afterCreate(group, server) { + const scope = group.scope; + const members = server.createList('user', 5, { scope }); + group.update({ members }); + } + }) }); diff --git a/ui/core/mirage/models/group.js b/ui/core/mirage/models/group.js new file mode 100644 index 000000000..7f556c505 --- /dev/null +++ b/ui/core/mirage/models/group.js @@ -0,0 +1,7 @@ +import { Model, hasMany } from 'ember-cli-mirage'; + +export default Model.extend({ + + members: hasMany('user') + +}); diff --git a/ui/core/mirage/scenarios/default.js b/ui/core/mirage/scenarios/default.js index 2b212f999..7d4c343f8 100644 --- a/ui/core/mirage/scenarios/default.js +++ b/ui/core/mirage/scenarios/default.js @@ -21,10 +21,8 @@ export default function(server) { // same items for request at all scopes. server.createList('auth-method', 3, { scope }); - // User - server.createList('user', 5, { scope }); - // Group - server.createList('group', 5, { scope }); + // Groups and Users + server.createList('group', 5, { scope }, 'withMembers'); // Role server.createList('role', 5, { scope }, 'withPrincipals'); diff --git a/ui/core/mirage/serializers/group.js b/ui/core/mirage/serializers/group.js index 13ec42167..2854224f8 100644 --- a/ui/core/mirage/serializers/group.js +++ b/ui/core/mirage/serializers/group.js @@ -1,5 +1,19 @@ import ApplicationSerializer from './application'; +import { underscore } from '@ember/string'; export default ApplicationSerializer.extend({ - modelName: 'group' + modelName: 'group', + + keyForRelationshipIds(relationshipName) { + return `${this._container.inflector.singularize( + underscore(relationshipName) + )}_ids`; + }, + + _hashForModel(model) { + const json = ApplicationSerializer.prototype._hashForModel.apply(this, arguments); + json.member_ids = model.memberIds; + return json; + } + });