feat: 🎸 add group custom methods for add/remove members

This commit is contained in:
Randall Morey committed 2020-09-01 10:42:16 -04:00
1 parent 3e6c321227
commit 40a43fd9be
5 files changed
+295 -5

No files matched your search

+87 -1
View File
@@ -1,3 +1,89 @@
import GeneratedGroupModel from '../generated/models/group';
import { attr } from '@ember-data/model';
import { computed } from '@ember/object';
export default class GroupModel extends GeneratedGroupModel {}
export default class GroupModel extends GeneratedGroupModel {
// =attributes
/**
* Members is read-only under normal circumstances. But members can
* be persisted via calls to `addMembers()` or `removeMembers()`.
*/
@attr( {readOnly: true}) member_ids;
/**
* An array of resolved user instances.
* Unresolvable instances are excluded from the array.
* @type {[UserModel]}
*/
@computed('member_ids.[]')
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.
// All of this nonsense is here to ensure we get
// a decent merge of `adapterOptions`.
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.
// All of this nonsense is here to ensure we get
// a decent merge of `adapterOptions`.
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);
}
}