Vulcan/packages/vulcan-users/lib/server/on_create_user.js
2018-08-07 10:13:59 +09:00

81 lines
2.9 KiB
JavaScript

import Users from '../modules/index.js';
import { runCallbacks, runCallbacksAsync, Utils, debug, debugGroup, debugGroupEnd } from 'meteor/vulcan:lib'; // import from vulcan:lib because vulcan:core isn't loaded yet
import clone from 'lodash/clone';
// TODO: the following should use async/await, but async/await doesn't seem to work with Accounts.onCreateUser
function onCreateUserCallback(options, user) {
debug('');
debugGroup(`--------------- start \x1b[35m onCreateUser ---------------`);
debug(`Options: ${JSON.stringify(options)}`);
debug(`User: ${JSON.stringify(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
options = runCallbacks(`user.new.validate.before`, options);
// OpenCRUD backwards compatibility
options = runCallbacks(`users.new.validate.before`, options);
// 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.canCreateField(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(`user.new.validate`, user);
// OpenCRUD backwards compatibility
user = runCallbacks(`users.new.validate`, user);
// run onCreate step
for(let fieldName of Object.keys(schema)) {
let autoValue;
if (schema[fieldName].onCreate) {
// eslint-disable-next-line no-await-in-loop
autoValue = schema[fieldName].onCreate({ newDocument: clone(user) });
} else if (schema[fieldName].onInsert) {
// OpenCRUD backwards compatibility
// eslint-disable-next-line no-await-in-loop
autoValue = schema[fieldName].onInsert(clone(user));
}
if (typeof autoValue !== 'undefined') {
user[fieldName] = autoValue;
}
}
user = runCallbacks('users.new.sync', user);
runCallbacksAsync("user.new.async", user);
// OpenCRUD backwards compatibility
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("user.profileCompleted.async", user);
// OpenCRUD backwards compatibility
runCallbacksAsync("users.profileCompleted.async", user);
}
debug(`Modified User: ${JSON.stringify(user)}`);
debugGroupEnd();
debug(`--------------- end \x1b[35m onCreateUser ---------------`);
debug('');
return user;
}
Meteor.startup(() => {
if (typeof Accounts !== 'undefined') {
Accounts.onCreateUser(onCreateUserCallback);
}
});