Files

100 lines
2.4 KiB
JavaScript
Raw Permalink Normal View History

/**
2026-01-28 17:09:06 -08:00
* Copyright IBM Corp. 2021, 2026
* SPDX-License-Identifier: BUSL-1.1
*/
2020-06-22 14:25:01 -04:00
import GeneratedGroupModel from '../generated/models/group';
import { attr } from '@ember-data/model';
import { computed } from '@ember/object';
import { A } from '@ember/array';
import { service } from '@ember/service';
2020-06-22 14:25:01 -04:00
export default class GroupModel extends GeneratedGroupModel {
// =services
@service store;
// =attributes
/**
* Members is read-only under normal circumstances. But members can
* be persisted via calls to `addMembers()` or `removeMembers()`.
*/
2020-09-12 11:47:27 -04:00
@attr({
readOnly: true,
defaultValue: () => A(),
2020-09-16 14:29:02 -04:00
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.
2020-10-06 10:31:00 -04:00
@computed('member_ids.[]', 'store')
get members() {
return this.member_ids
2020-09-16 14:29:02 -04:00
.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}
*/
2020-09-16 14:29:02 -04:00
addMembers(memberIDs, options = { adapterOptions: {} }) {
const defaultAdapterOptions = {
method: 'add-members',
2020-09-16 14:29:02 -04:00
memberIDs,
};
// There is no "deep merge" in ES.
return this.save({
...options,
adapterOptions: {
...defaultAdapterOptions,
2020-09-16 14:29:02 -04:00
...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}
*/
2020-09-16 14:29:02 -04:00
removeMembers(memberIDs, options = { adapterOptions: {} }) {
const defaultAdapterOptions = {
method: 'remove-members',
2020-09-16 14:29:02 -04:00
memberIDs,
};
// There is no "deep merge" in ES.
return this.save({
...options,
adapterOptions: {
...defaultAdapterOptions,
2020-09-16 14:29:02 -04:00
...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);
}
}