2018-02-17 11:17:07 +09:00
|
|
|
import Users from '../modules/index.js';
|
2017-04-30 20:36:14 +09:00
|
|
|
import { runCallbacks, runCallbacksAsync, Utils } from 'meteor/vulcan:lib'; // import from vulcan:lib because vulcan:core isn't loaded yet
|
2017-04-29 12:31:40 +09:00
|
|
|
|
2018-03-03 15:04:33 +09:00
|
|
|
// TODO: the following should use async/await, but async/await doesn't seem to work with Accounts.onCreateUser
|
2017-04-29 12:31:40 +09:00
|
|
|
function onCreateUserCallback (options, user) {
|
|
|
|
|
|
|
|
const schema = Users.simpleSchema()._schema;
|
|
|
|
|
|
|
|
delete options.password; // we don't need to store the password digest
|
|
|
|
delete options.username; // username is already in user object
|
|
|
|
|
2017-12-20 09:43:30 +09:00
|
|
|
options = runCallbacks(`users.new.validate.before`, options);
|
2017-11-22 16:39:00 +02:00
|
|
|
|
2017-04-29 12:31:40 +09:00
|
|
|
// validate options since they can't be trusted
|
|
|
|
Users.simpleSchema().validate(options);
|
|
|
|
|
|
|
|
// check that the current user has permission to insert each option field
|
|
|
|
_.keys(options).forEach(fieldName => {
|
|
|
|
var field = schema[fieldName];
|
|
|
|
if (!field || !Users.canInsertField (user, field)) {
|
|
|
|
throw new Error(Utils.encodeIntlError({id: 'app.disallowed_property_detected', value: fieldName}));
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// extend user with options
|
|
|
|
user = Object.assign(user, options);
|
|
|
|
|
|
|
|
// run validation callbacks
|
|
|
|
user = runCallbacks(`users.new.validate`, user);
|
|
|
|
|
|
|
|
// run onInsert step
|
2018-03-03 15:04:33 +09:00
|
|
|
// note: cannot use forEach with async/await.
|
|
|
|
// note 2: don't use async/await here for now. TODO: fix this.
|
|
|
|
// See https://stackoverflow.com/a/37576787/649299
|
|
|
|
for(let fieldName of _.keys(schema)) {
|
2017-04-29 12:31:40 +09:00
|
|
|
if (!user[fieldName] && schema[fieldName].onInsert) {
|
|
|
|
const autoValue = schema[fieldName].onInsert(user, options);
|
2018-03-03 15:04:33 +09:00
|
|
|
if (typeof autoValue !== 'undefined') {
|
2017-04-29 12:31:40 +09:00
|
|
|
user[fieldName] = autoValue;
|
|
|
|
}
|
|
|
|
}
|
2018-03-03 15:04:33 +09:00
|
|
|
}
|
|
|
|
|
2017-04-29 12:31:40 +09:00
|
|
|
user = runCallbacks("users.new.sync", user);
|
|
|
|
|
|
|
|
runCallbacksAsync("users.new.async", user);
|
|
|
|
|
|
|
|
// check if all required fields have been filled in. If so, run profile completion callbacks
|
|
|
|
if (Users.hasCompletedProfile(user)) {
|
|
|
|
runCallbacksAsync("users.profileCompleted.async", user);
|
|
|
|
}
|
|
|
|
return user;
|
|
|
|
}
|
|
|
|
|
2018-06-10 11:39:18 +09:00
|
|
|
if (typeof Accounts !== 'undefined') {
|
|
|
|
Accounts.onCreateUser(onCreateUserCallback);
|
|
|
|
}
|