import stampit from 'stampit';
import {Meta, Model} from './base';
import _ from 'lodash';
import QuerySet from '../querySet';
const GroupQuerySet = stampit().compose(QuerySet).methods({
/**
* Fetches Users belonging to a group.
* @memberOf GroupQuerySet
* @instance
* @param {Object} properties lookup properties used for path resolving
* @returns {GroupQuerySet}
* @example {@lang javascript}
* Grop.please().users({ id: 1, instanceName: 'test-one'}).then(function(users) {});
*/
users(properties = {}) {
const {User} = this.getConfig();
this.properties = _.assign({}, this.properties, properties);
return User.please().groupUsers(this.properties);
},
/**
* Adds user to group.
* @memberOf GroupQuerySet
* @instance
* @param {Object} properties lookup properties used for path resolving
* @param {Object} user object with user to be added
* @returns {GroupQuerySet}
* @example {@lang javascript}
* Grop.please().addUser({ id: 1, instanceName: 'test-one'}, { user: 1 }).then(function(response) {});
*/
addUser(properties = {}, user = {}) {
const {User} = this.getConfig();
this.properties = _.assign({}, this.properties, properties);
return User.please().addUserToGroup(this.properties, user);
},
/**
* Deletes user from group.
* @memberOf GroupQuerySet
* @instance
* @param {Object} properties lookup properties used for path resolving
* @param {Object} user object with user to be added
* @returns {GroupQuerySet}
* @example {@lang javascript}
* Grop.please().deleteUser({ id: 1, instanceName: 'test-one'}, { user: 1 }).then(function(response) {});
*/
deleteUser(properties = {}, user = {}) {
const {User} = this.getConfig();
this.properties = _.assign({}, this.properties, properties);
return User.please().deleteUserFromGroup(this.properties, user);
},
/**
* Fetches details of a user belonging to a group.
* @memberOf Group
* @instance
* @param {Object} properties lookup properties used for path resolving
* @param {Object} user object with user to be fetched
* @example {@lang javascript}
* Group.please().getUserDetails({ user: 1}).then(function(response) {});
*/
getUserDetails(properties = {}, user = {}) {
const {User} = this.getConfig();
this.properties = _.assign({}, this.properties, properties);
return User.please().getDetails(this.properties, user);
},
getUserGroups(properties = {}) {
this.properties = _.assign({}, this.properties, properties);
this.method = 'GET';
this.endpoint = 'userGroups';
return this.then((response) => this.model.please().asResultSet(response, 'group', properties));
},
getUserGroup(properties = {}, group = {}) {
this.properties = _.assign({}, this.properties, properties, group);
this.method = 'GET';
this.endpoint = 'userGroup';
return this.then((response) => {
return this.model.fromJSON(response.group, this.properties);
});
},
addUserGroup(properties = {}, group = {}) {
this.properties = _.assign({}, this.properties, properties);
this.payload = group;
this.method = 'POST';
this.endpoint = 'userGroups';
return this.then((response) => {
return this.model.fromJSON(response.group, this.properties);
});
},
deleteUserGroup(properties = {}, group = {}) {
this.properties = _.assign({}, this.properties, properties, group);
this.method = 'DELETE';
this.endpoint = 'userGroup';
return this.then((response) => {
return this.model.fromJSON(response.group, this.properties);
});
}
});
const GroupMeta = Meta({
name: 'group',
pluralName: 'groups',
endpoints: {
'detail': {
'methods': ['delete', 'patch', 'put', 'get'],
'path': '/v1.1/instances/{instanceName}/groups/{id}/'
},
'list': {
'methods': ['get'],
'path': '/v1.1/instances/{instanceName}/groups/'
},
'userGroups': {
'methods': ['get', 'post'],
'path': '/v1.1/instances/{instanceName}/users/{user}/groups/'
},
'userGroup': {
'methods': ['get', 'delete'],
'path': '/v1.1/instances/{instanceName}/users/{user}/groups/{id}/'
}
}
});
const GroupConstraints = {
instanceName: {
presence: true,
length: {
minimum: 5
}
},
label: {
presence: true,
string: true
},
description: {
string: true
}
};
/**
* OO wrapper around instance groups {@link http://docs.syncano.com/v4.0/docs/groups endpoint}.
* @constructor
* @type {Group}
* @property {Number} id
* @property {String} instanceName
* @property {String} label
* @property {String} [description = null]
* @property {String} [links = {}]
* @property {Date} [created_at = null]
* @property {Date} [updated_at = null]
*/
const Group = stampit()
.compose(Model)
.setMeta(GroupMeta)
.setConstraints(GroupConstraints)
.setQuerySet(GroupQuerySet)
.methods({
/**
* Fetches Users belonging to a group.
* @memberOf Group
* @instance
* @returns {Promise}
* @example {@lang javascript}
* Group.users().then(function(users) {});
*/
users() {
const {User} = this.getConfig();
return User.please().groupUsers({ id: this.id, instanceName: this.instanceName});
},
/**
* Add user to group.
* @memberOf Group
* @instance
* @returns {Promise}
* @example {@lang javascript}
* Group.addUser({ user: 1}).then(function(response) {});
*/
addUser(user = {}) {
const {User} = this.getConfig();
return User.please().addUserToGroup({ id: this.id, instanceName: this.instanceName}, user);
},
/**
* Delete user from group.
* @memberOf Group
* @instance
* @returns {Promise}
* @example {@lang javascript}
* Group.deleteUser({ user: 1}).then(function(response) {});
*/
deleteUser(user = {}) {
const {User} = this.getConfig();
return User.please().deleteUserFromGroup({ id: this.id, instanceName: this.instanceName}, user);
},
/**
* Fetches details of a user belonging to a group.
* @memberOf Group
* @instance
* @returns {Promise}
* @example {@lang javascript}
* Group.getUserDetails({ user: 1}).then(function(response) {});
*/
getUserDetails(user = {}) {
const {User} = this.getConfig();
return User.please().getDetails({ id: this.id, instanceName: this.instanceName}, user);
}
});
export default Group;