2016-06-23 15:00:58 +09:00
|
|
|
|
import Users from './collection.js';
|
2016-06-07 15:03:00 +09:00
|
|
|
|
import marked from 'marked';
|
2016-06-23 16:42:06 +09:00
|
|
|
|
import NovaEmail from 'meteor/nova:email';
|
2016-11-26 02:46:55 +08:00
|
|
|
|
import { Gravatar } from 'meteor/jparker:gravatar';
|
2016-12-13 11:40:24 +09:00
|
|
|
|
import { addCallback, Utils } from 'meteor/nova:lib'; // import from nova:lib because nova:core isn't loaded yet
|
2016-06-07 15:03:00 +09:00
|
|
|
|
|
2015-06-30 19:12:29 +09:00
|
|
|
|
//////////////////////////////////////////////////////
|
|
|
|
|
// Callbacks //
|
|
|
|
|
//////////////////////////////////////////////////////
|
|
|
|
|
|
2015-05-06 12:28:00 +09:00
|
|
|
|
/**
|
2016-04-09 09:41:20 +09:00
|
|
|
|
* @summary Set up user object on creation
|
2015-05-06 12:28:00 +09:00
|
|
|
|
* @param {Object} user – the user object being iterated on and returned
|
|
|
|
|
* @param {Object} options – user options
|
|
|
|
|
*/
|
|
|
|
|
function setupUser (user, options) {
|
2015-05-08 11:45:09 +09:00
|
|
|
|
// ------------------------------ Properties ------------------------------ //
|
2015-05-06 12:28:00 +09:00
|
|
|
|
var userProperties = {
|
|
|
|
|
profile: options.profile || {},
|
2016-11-10 14:22:47 +01:00
|
|
|
|
__karma: 0,
|
|
|
|
|
__isInvited: false,
|
|
|
|
|
__postCount: 0,
|
|
|
|
|
__commentCount: 0,
|
|
|
|
|
__invitedCount: 0,
|
|
|
|
|
__upvotedPosts: [],
|
|
|
|
|
__downvotedPosts: [],
|
|
|
|
|
__upvotedComments: [],
|
|
|
|
|
__downvotedComments: []
|
2015-05-06 12:28:00 +09:00
|
|
|
|
};
|
|
|
|
|
user = _.extend(user, userProperties);
|
|
|
|
|
|
2015-09-23 11:37:07 +09:00
|
|
|
|
// look in a few places for the user email
|
2015-05-06 12:28:00 +09:00
|
|
|
|
if (options.email) {
|
2016-11-10 14:22:47 +01:00
|
|
|
|
user.__email = options.email;
|
2015-12-31 11:30:14 -08:00
|
|
|
|
} else if (user.services['meteor-developer'] && user.services['meteor-developer'].emails) {
|
2016-11-10 14:22:47 +01:00
|
|
|
|
user.__email = _.findWhere(user.services['meteor-developer'].emails, { primary: true }).address;
|
2015-09-23 11:37:07 +09:00
|
|
|
|
} else if (user.services.facebook && user.services.facebook.email) {
|
2016-11-10 14:22:47 +01:00
|
|
|
|
user.__email = user.services.facebook.email;
|
2015-12-31 11:30:14 -08:00
|
|
|
|
} else if (user.services.github && user.services.github.email) {
|
2016-11-10 14:22:47 +01:00
|
|
|
|
user.__email = user.services.github.email;
|
2015-12-31 11:30:14 -08:00
|
|
|
|
} else if (user.services.google && user.services.google.email) {
|
2016-11-10 14:22:47 +01:00
|
|
|
|
user.__email = user.services.google.email;
|
2016-08-22 10:07:37 -07:00
|
|
|
|
} else if (user.services.linkedin && user.services.linkedin.emailAddress) {
|
2016-11-10 14:22:47 +01:00
|
|
|
|
user.__email = user.services.linkedin.emailAddress;
|
2015-09-23 11:37:07 +09:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// generate email hash
|
2016-11-10 14:22:47 +01:00
|
|
|
|
if (!!user.__email) {
|
|
|
|
|
user.__emailHash = Gravatar.hash(user.__email);
|
2015-05-06 12:28:00 +09:00
|
|
|
|
}
|
|
|
|
|
|
2015-05-16 13:13:45 +09:00
|
|
|
|
// look in a few places for the displayName
|
|
|
|
|
if (user.profile.username) {
|
2016-11-10 14:22:47 +01:00
|
|
|
|
user.__displayName = user.profile.username;
|
2015-05-16 13:13:45 +09:00
|
|
|
|
} else if (user.profile.name) {
|
2016-11-10 14:22:47 +01:00
|
|
|
|
user.__displayName = user.profile.name;
|
2016-08-22 10:07:37 -07:00
|
|
|
|
} else if (user.services.linkedin && user.services.linkedin.firstName) {
|
2016-11-10 14:22:47 +01:00
|
|
|
|
user.__displayName = user.services.linkedin.firstName + " " + user.services.linkedin.lastName;
|
2015-05-16 13:13:45 +09:00
|
|
|
|
} else {
|
2016-11-10 14:22:47 +01:00
|
|
|
|
user.__displayName = user.username;
|
2016-11-26 02:46:55 +08:00
|
|
|
|
}
|
2015-05-06 12:28:00 +09:00
|
|
|
|
|
2016-10-04 22:42:07 +02:00
|
|
|
|
// create a basic slug from display name and then modify it if this slugs already exists;
|
2016-12-12 11:34:28 +09:00
|
|
|
|
const basicSlug = Utils.slugify(user.__displayName);
|
|
|
|
|
user.__slug = Utils.getUnusedSlug(Users, basicSlug);
|
2015-05-06 12:28:00 +09:00
|
|
|
|
|
|
|
|
|
// if this is not a dummy account, and is the first user ever, make them an admin
|
2016-10-05 08:37:48 +02:00
|
|
|
|
user.isAdmin = (!user.profile.isDummy && Users.find({'profile.isDummy': {$ne: true}}).count() === 0) ? true : false;
|
2015-05-06 12:28:00 +09:00
|
|
|
|
|
2016-11-26 11:51:52 +09:00
|
|
|
|
// Events.track('new user', {username: user.__displayName, email: user.__email});
|
2015-05-06 12:28:00 +09:00
|
|
|
|
|
|
|
|
|
return user;
|
|
|
|
|
}
|
2016-12-13 11:40:24 +09:00
|
|
|
|
addCallback("users.new.sync", setupUser);
|
2015-04-23 17:45:37 +09:00
|
|
|
|
|
|
|
|
|
function hasCompletedProfile (user) {
|
2015-05-19 12:34:27 +09:00
|
|
|
|
return Users.hasCompletedProfile(user);
|
2015-04-23 17:45:37 +09:00
|
|
|
|
}
|
2016-12-13 11:40:24 +09:00
|
|
|
|
addCallback("users.profileCompleted.sync", hasCompletedProfile);
|
2016-02-17 21:57:20 +09:00
|
|
|
|
|
2016-11-15 15:59:34 +09:00
|
|
|
|
function usersNewAdminUserCreationNotification (user) {
|
2016-06-23 16:42:06 +09:00
|
|
|
|
// send notifications to admins
|
2016-09-21 12:37:26 +02:00
|
|
|
|
const admins = Users.adminUsers();
|
|
|
|
|
admins.forEach(function(admin) {
|
2016-06-23 16:42:06 +09:00
|
|
|
|
if (Users.getSetting(admin, "notifications_users", false)) {
|
2016-09-21 12:37:26 +02:00
|
|
|
|
const emailProperties = Users.getNotificationProperties(user);
|
|
|
|
|
const html = NovaEmail.getTemplate('newUser')(emailProperties);
|
|
|
|
|
NovaEmail.send(Users.getEmail(admin), `New user account: ${emailProperties.displayName}`, NovaEmail.buildTemplate(html));
|
2016-06-23 16:42:06 +09:00
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
return user;
|
|
|
|
|
}
|
2016-12-13 11:40:24 +09:00
|
|
|
|
addCallback("users.new.sync", usersNewAdminUserCreationNotification);
|
2016-11-15 15:59:34 +09:00
|
|
|
|
|
|
|
|
|
function usersEditGenerateHtmlBio (modifier) {
|
|
|
|
|
if (modifier.$set && modifier.$set.__bio) {
|
2016-12-12 11:34:28 +09:00
|
|
|
|
modifier.$set.__htmlBio = Utils.sanitize(marked(modifier.$set.__bio));
|
2016-11-15 15:59:34 +09:00
|
|
|
|
}
|
|
|
|
|
return modifier;
|
|
|
|
|
}
|
2016-12-13 11:40:24 +09:00
|
|
|
|
addCallback("users.edit.sync", usersEditGenerateHtmlBio);
|
2016-11-15 15:59:34 +09:00
|
|
|
|
|
2016-11-17 10:32:16 +01:00
|
|
|
|
function usersEditCheckEmail (modifier, user) {
|
2016-11-15 15:59:34 +09:00
|
|
|
|
// if email is being modified, update user.emails too
|
|
|
|
|
if (modifier.$set && modifier.$set.__email) {
|
|
|
|
|
|
|
|
|
|
var newEmail = modifier.$set.__email;
|
|
|
|
|
|
|
|
|
|
// check for existing emails and throw error if necessary
|
|
|
|
|
var userWithSameEmail = Users.findByEmail(newEmail);
|
2016-11-17 10:32:16 +01:00
|
|
|
|
if (userWithSameEmail && userWithSameEmail._id !== user._id) {
|
2016-11-15 15:59:34 +09:00
|
|
|
|
throw new Meteor.Error("email_taken2", "this_email_is_already_taken" + " (" + newEmail + ")");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// if user.emails exists, change it too
|
|
|
|
|
if (!!user.emails) {
|
|
|
|
|
user.emails[0].address = newEmail;
|
|
|
|
|
modifier.$set.emails = user.emails;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// update email hash
|
|
|
|
|
modifier.$set.__emailHash = Gravatar.hash(newEmail);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
return modifier;
|
|
|
|
|
}
|
2016-12-13 11:40:24 +09:00
|
|
|
|
addCallback("users.edit.sync", usersEditCheckEmail);
|