mirror of
https://github.com/vale981/Vulcan
synced 2025-03-08 19:11:38 -05:00
81 lines
3 KiB
JavaScript
81 lines
3 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({name: 'user.create.validate.before', iterator: 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({name:'user.create.validate', iterator: 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({ name: 'user.create.before', iterator: user });
|
|
user = runCallbacks('users.new.sync', user);
|
|
|
|
runCallbacksAsync({name: 'user.create.async', properties: {data: 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);
|
|
}
|
|
});
|