Vulcan/packages/nova-users/lib/methods.js

132 lines
3.7 KiB
JavaScript
Raw Normal View History

2016-08-08 11:18:21 +09:00
import Telescope from 'meteor/nova:lib';
2016-06-23 15:00:58 +09:00
import Users from './collection.js';
2016-06-15 11:07:10 +09:00
2016-02-23 11:34:40 +09:00
var completeUserProfile = function (userId, modifier, user) {
Users.update(userId, modifier);
Telescope.callbacks.runAsync("users.profileCompleted.async", Users.findOne(userId));
return Users.findOne(userId);
};
2016-02-23 11:34:40 +09:00
Users.methods = {};
2016-06-23 11:40:35 +09:00
/**
* @summary Edit a user in the database
* @param {string} userId the ID of the user being edited
* @param {Object} modifier the modifier object
* @param {Object} user - the current user object
*/
2016-02-23 11:34:40 +09:00
Users.methods.edit = (userId, modifier, user) => {
if (typeof user === "undefined") {
2016-06-23 11:40:35 +09:00
user = Users.findOne(userId);
2016-02-23 11:34:40 +09:00
}
// ------------------------------ Callbacks ------------------------------ //
modifier = Telescope.callbacks.run("users.edit.sync", modifier, user);
2016-02-23 11:34:40 +09:00
// ------------------------------ Update ------------------------------ //
Users.update(userId, modifier);
// ------------------------------ Callbacks ------------------------------ //
Telescope.callbacks.runAsync("users.edit.async", Users.findOne(userId), user);
2016-02-23 11:34:40 +09:00
// ------------------------------ After Update ------------------------------ //
return Users.findOne(userId);
}
Users.methods.setSetting = (userId, settingName, value) => {
// all users settings should begin with the prexi __: user.__setting namespace, so add "__" if needed
var field = settingName.slice(0,2) === "__" ? settingName : "__" + settingName;
var modifier = {$set: {}};
modifier.$set[field] = value;
Users.update(userId, modifier);
}
2016-07-19 17:30:59 +09:00
Users.methods.addGroup = (userId, groupName) => {
Users.update(userId, {$push: {"__groups": groupName}});
2016-07-19 17:30:59 +09:00
};
Users.methods.removeGroup = (userId, groupName) => {
Users.update(userId, {$pull: {"__groups": groupName}});
2016-07-19 17:30:59 +09:00
};
2015-05-06 12:28:00 +09:00
Meteor.methods({
2016-02-23 11:34:40 +09:00
'users.edit'(userId, modifier) {
// checking might be redundant because SimpleSchema already enforces the schema, but you never know
check(modifier, Match.OneOf({$set: Users.simpleSchema()}, {$unset: Object}, {$set: Users.simpleSchema(), $unset: Object}));
check(userId, String);
var currentUser = Meteor.user(),
user = Users.findOne(userId),
schema = Users.simpleSchema()._schema;
// ------------------------------ Checks ------------------------------ //
// check that user can edit document
2016-07-20 10:25:05 +09:00
if (!user || !Users.canEdit(currentUser, user)) {
2016-07-07 10:38:18 +09:00
throw new Meteor.Error(601, 'sorry_you_cannot_edit_this_user');
2016-02-23 11:34:40 +09:00
}
// go over each field and throw an error if it's not editable
// loop over each operation ($set, $unset, etc.)
_.each(modifier, function (operation) {
// loop over each property being operated on
_.keys(operation).forEach(function (fieldName) {
var field = schema[fieldName];
2016-07-20 10:25:05 +09:00
if (!Users.canEditField(currentUser, field, user)) {
2016-07-07 10:38:18 +09:00
throw new Meteor.Error("disallowed_property", 'disallowed_property_detected' + ": " + fieldName);
2016-02-23 11:34:40 +09:00
}
});
});
return Users.methods.edit(userId, modifier, user);
},
2016-06-23 11:40:35 +09:00
'users.remove'(userId, options) {
2016-07-21 09:53:58 +09:00
if (Users.canDo(Meteor.user(), "users.remove.all")) {
2016-06-23 11:40:35 +09:00
const user = Users.findOne(userId);
Users.remove(userId);
2016-06-23 11:40:35 +09:00
Telescope.callbacks.runAsync("users.remove.async", user, options);
}
},
'users.setSetting'(userId, settingName, value) {
check(userId, String);
check(settingName, String);
check(value, Match.OneOf(String, Number, Boolean));
var currentUser = Meteor.user(),
user = Users.findOne(userId);
// check that user can edit document
2016-07-20 10:25:05 +09:00
if (!user || !Users.canEdit(currentUser, user)) {
2016-07-04 10:42:50 +09:00
throw new Meteor.Error(601, 'sorry_you_cannot_edit_this_user');
}
Users.methods.setSetting(userId, settingName, value);
2015-05-06 12:28:00 +09:00
}
2015-05-06 12:28:00 +09:00
});