2015-05-13 11:01:03 +09:00
|
|
|
////////////////////
|
|
|
|
// User Getters //
|
|
|
|
////////////////////
|
2015-04-22 07:50:11 +09:00
|
|
|
|
2015-05-13 11:01:03 +09:00
|
|
|
/**
|
|
|
|
* Get a user's username (unique, no special characters or spaces)
|
|
|
|
* @param {Object} user
|
|
|
|
*/
|
2015-04-22 07:50:11 +09:00
|
|
|
Users.getUserName = function (user) {
|
|
|
|
try{
|
|
|
|
if (user.username)
|
|
|
|
return user.username;
|
|
|
|
if (user && user.services && user.services.twitter && user.services.twitter.screenName)
|
2015-05-01 18:22:00 +02:00
|
|
|
return user.services.twitter.screenName;
|
2015-04-22 07:50:11 +09:00
|
|
|
}
|
|
|
|
catch (error){
|
|
|
|
console.log(error);
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
};
|
2015-05-13 11:01:03 +09:00
|
|
|
Users.helpers({getUserName: function () {return Users.getUserName(this);}});
|
|
|
|
Users.getUserNameById = function (userId) {return Users.getUserName(Meteor.users.findOne(userId))};
|
2015-04-22 07:50:11 +09:00
|
|
|
|
2015-05-13 11:01:03 +09:00
|
|
|
/**
|
|
|
|
* Get a user's display name (not unique, can take special characters and spaces)
|
|
|
|
* @param {Object} user
|
|
|
|
*/
|
2015-04-22 07:50:11 +09:00
|
|
|
Users.getDisplayName = function (user) {
|
2015-05-13 11:01:03 +09:00
|
|
|
if (typeof user === "undefined") {
|
|
|
|
return "";
|
|
|
|
} else {
|
|
|
|
return (user.telescope && user.telescope.displayName) ? user.telescope.displayName : Users.getUserName(user);
|
|
|
|
}
|
2015-04-22 07:50:11 +09:00
|
|
|
};
|
2015-05-13 11:01:03 +09:00
|
|
|
Users.helpers({getDisplayName: function () {return Users.getDisplayName(this);}});
|
|
|
|
Users.getDisplayNameById = function (userId) {return Users.getDisplayName(Meteor.users.findOne(userId));};
|
2015-04-22 07:50:11 +09:00
|
|
|
|
2015-05-13 11:01:03 +09:00
|
|
|
/**
|
|
|
|
* Get a user's profile URL
|
|
|
|
* @param {Object} user
|
|
|
|
*/
|
2015-04-22 07:50:11 +09:00
|
|
|
Users.getProfileUrl = function (user) {
|
2015-05-14 16:42:19 +09:00
|
|
|
return Users.getProfileUrlBySlugOrId(user.telescope.slug);
|
2015-04-22 07:50:11 +09:00
|
|
|
};
|
2015-05-13 11:01:03 +09:00
|
|
|
Users.helpers({getProfileUrl: function () {return Users.getProfileUrl(this);}});
|
2015-04-22 07:50:11 +09:00
|
|
|
|
2015-05-13 11:01:03 +09:00
|
|
|
/**
|
|
|
|
* Get a user's profile URL by slug or Id
|
|
|
|
* @param {String} slugOrId
|
|
|
|
*/
|
2015-04-22 07:50:11 +09:00
|
|
|
Users.getProfileUrlBySlugOrId = function (slugOrId) {
|
|
|
|
return Telescope.utils.getRouteUrl('user_profile', {_idOrSlug: slugOrId});
|
|
|
|
};
|
|
|
|
|
2015-05-13 11:01:03 +09:00
|
|
|
/**
|
|
|
|
* Get a user's Twitter name
|
|
|
|
* @param {Object} user
|
|
|
|
*/
|
2015-04-22 07:50:11 +09:00
|
|
|
Users.getTwitterName = function (user) {
|
|
|
|
// return twitter name provided by user, or else the one used for twitter login
|
|
|
|
if(Telescope.utils.checkNested(user, 'profile', 'twitter')){
|
|
|
|
return user.profile.twitter;
|
|
|
|
}else if(Telescope.utils.checkNested(user, 'services', 'twitter', 'screenName')){
|
|
|
|
return user.services.twitter.screenName;
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
};
|
2015-05-13 11:01:03 +09:00
|
|
|
Users.helpers({getTwitterName: function () {return Users.getTwitterName(this);}});
|
|
|
|
Users.getTwitterNameById = function (userId) {return Users.getTwitterName(Meteor.users.findOne(userId));};
|
2015-04-22 07:50:11 +09:00
|
|
|
|
2015-05-13 11:01:03 +09:00
|
|
|
/**
|
|
|
|
* Get a user's GitHub name
|
|
|
|
* @param {Object} user
|
|
|
|
*/
|
2015-04-22 07:50:11 +09:00
|
|
|
Users.getGitHubName = function (user) {
|
|
|
|
// return twitter name provided by user, or else the one used for twitter login
|
|
|
|
if(Telescope.utils.checkNested(user, 'profile', 'github')){
|
|
|
|
return user.profile.github;
|
|
|
|
}else if(Telescope.utils.checkNested(user, 'services', 'github', 'screenName')){ // TODO: double-check this with GitHub login
|
|
|
|
return user.services.github.screenName;
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
};
|
2015-05-13 11:01:03 +09:00
|
|
|
Users.helpers({getGitHubName: function () {return Users.getGitHubName(this);}});
|
|
|
|
Users.getGitHubNameById = function (userId) {return Users.getGitHubName(Meteor.users.findOne(userId));};
|
2015-04-22 07:50:11 +09:00
|
|
|
|
2015-05-13 11:01:03 +09:00
|
|
|
/**
|
|
|
|
* Get a user's email
|
|
|
|
* @param {Object} user
|
|
|
|
*/
|
2015-04-22 07:50:11 +09:00
|
|
|
Users.getEmail = function (user) {
|
2015-05-06 12:16:50 +09:00
|
|
|
if(user.telescope && user.telescope.email){
|
|
|
|
return user.telescope.email;
|
2015-04-22 07:50:11 +09:00
|
|
|
}else{
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
};
|
2015-05-13 11:01:03 +09:00
|
|
|
Users.helpers({getEmail: function () {return Users.getEmail(this);}});
|
|
|
|
Users.getEmailById = function (userId) {return Users.getEmail(Meteor.users.findOne(userId));};
|
2015-04-22 07:50:11 +09:00
|
|
|
|
2015-05-13 11:01:03 +09:00
|
|
|
/**
|
|
|
|
* Get a user's email hash
|
|
|
|
* @param {Object} user
|
|
|
|
*/
|
2015-04-22 07:50:11 +09:00
|
|
|
Users.getEmailHash = function (user) {
|
|
|
|
// has to be this way to work with Gravatar
|
2015-04-28 11:32:53 +09:00
|
|
|
return Gravatar.hash(Users.getEmail(user));
|
2015-04-22 07:50:11 +09:00
|
|
|
};
|
2015-05-13 11:01:03 +09:00
|
|
|
Users.helpers({getEmailHash: function () {return Users.getEmailHash(this);}});
|
|
|
|
Users.getEmailHashById = function (userId) {return Users.getEmailHash(Meteor.users.findOne(userId));};
|
2015-04-22 07:50:11 +09:00
|
|
|
|
2015-05-13 11:01:03 +09:00
|
|
|
/**
|
|
|
|
* Check if a user's profile is complete
|
|
|
|
* @param {Object} user
|
|
|
|
*/
|
2015-04-22 07:50:11 +09:00
|
|
|
Users.userProfileComplete = function (user) {
|
2015-04-23 17:45:37 +09:00
|
|
|
for (var i = 0; i < Telescope.callbacks.profileCompletedChecks.length; i++) {
|
|
|
|
if (!Telescope.callbacks.profileCompletedChecks[i](user)) {
|
2015-04-22 07:50:11 +09:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
};
|
2015-05-13 11:01:03 +09:00
|
|
|
Users.helpers({userProfileComplete: function () {return Users.userProfileComplete(this);}});
|
|
|
|
Users.userProfileCompleteById = function (userId) {return Users.userProfileComplete(Meteor.users.findOne(userId));};
|
|
|
|
|
|
|
|
///////////////////
|
|
|
|
// Other Helpers //
|
|
|
|
///////////////////
|
2015-04-22 07:50:11 +09:00
|
|
|
|
|
|
|
Users.findLast = function (user, collection) {
|
|
|
|
return collection.findOne({userId: user._id}, {sort: {createdAt: -1}});
|
|
|
|
};
|
|
|
|
|
|
|
|
Users.timeSinceLast = function (user, collection){
|
|
|
|
var now = new Date().getTime();
|
|
|
|
var last = this.findLast(user, collection);
|
|
|
|
if(!last)
|
|
|
|
return 999; // if this is the user's first post or comment ever, stop here
|
|
|
|
return Math.abs(Math.floor((now-last.createdAt)/1000));
|
|
|
|
};
|
|
|
|
|
|
|
|
Users.numberOfItemsInPast24Hours = function (user, collection) {
|
|
|
|
var mNow = moment();
|
|
|
|
var items = collection.find({
|
|
|
|
userId: user._id,
|
|
|
|
createdAt: {
|
|
|
|
$gte: mNow.subtract(24, 'hours').toDate()
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return items.count();
|
|
|
|
};
|
|
|
|
|
2015-05-11 11:09:26 +09:00
|
|
|
Users.getUserSetting = function (settingName, defaultValue, user) {
|
2015-05-01 18:22:00 +02:00
|
|
|
user = user || Meteor.user();
|
|
|
|
defaultValue = defaultValue || null;
|
2015-05-11 11:09:26 +09:00
|
|
|
if (user.telescope && user.telescope.settings) {
|
|
|
|
var settingValue = this.getProperty(user.telescope.settings, settingName);
|
|
|
|
return (settingValue === null) ? defaultValue : settingValue;
|
|
|
|
} else {
|
|
|
|
return defaultValue;
|
|
|
|
}
|
2015-04-22 07:50:11 +09:00
|
|
|
};
|
|
|
|
|
2015-05-11 11:09:26 +09:00
|
|
|
Users.setUserSetting = function (settingName, value, userArgument) {
|
2015-04-22 07:50:11 +09:00
|
|
|
// note: for some very weird reason, doesn't work when called from Accounts.onCreateUser
|
|
|
|
|
|
|
|
var user;
|
|
|
|
|
|
|
|
if(Meteor.isClient){
|
2015-05-11 11:09:26 +09:00
|
|
|
user = (typeof userArgument === "undefined") ? Meteor.user() : userArgument; // on client, default to current user
|
2015-04-22 07:50:11 +09:00
|
|
|
}else if (Meteor.isServer){
|
|
|
|
user = userArgument; // on server, use argument
|
|
|
|
}
|
|
|
|
if(!user)
|
|
|
|
throw new Meteor.Error(500, 'User not defined');
|
|
|
|
|
2015-05-11 11:09:26 +09:00
|
|
|
Meteor.call('setUserSetting', settingName, value, user);
|
2015-04-22 07:50:11 +09:00
|
|
|
};
|
|
|
|
|
2015-05-11 11:09:26 +09:00
|
|
|
Meteor.methods({
|
|
|
|
setUserSetting: function (settingName, value, user) {
|
|
|
|
// console.log('Setting user setting "' + setting + '" to "' + value + '" for ' + Users.getUserName(user));
|
|
|
|
var field = 'telescope.settings.'+settingName;
|
|
|
|
var modifier = {$set: {}};
|
|
|
|
modifier.$set[field] = value;
|
|
|
|
Meteor.users.update(user._id, modifier);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2015-04-22 07:50:11 +09:00
|
|
|
Users.getProperty = function (object, property) {
|
|
|
|
// recursive function to get nested properties
|
|
|
|
var array = property.split('.');
|
|
|
|
if(array.length > 1){
|
|
|
|
var parent = array.shift();
|
|
|
|
// if our property is not at this level, call function again one level deeper if we can go deeper, else return null
|
2015-05-01 18:22:00 +02:00
|
|
|
return (typeof object[parent] === "undefined") ? null : this.getProperty(object[parent], array.join('.'));
|
2015-04-22 07:50:11 +09:00
|
|
|
}else{
|
|
|
|
// else return property
|
|
|
|
return object[array[0]];
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Build Users subscription with filter, sort, and limit args.
|
2015-05-04 10:19:50 +09:00
|
|
|
* @param {String} filterBy
|
|
|
|
* @param {String} sortBy
|
|
|
|
* @param {Number} limit
|
2015-04-22 07:50:11 +09:00
|
|
|
*/
|
|
|
|
Users.getSubParams = function(filterBy, sortBy, limit) {
|
|
|
|
var find = {},
|
|
|
|
sort = {createdAt: -1};
|
|
|
|
|
|
|
|
switch(filterBy){
|
|
|
|
case 'invited':
|
|
|
|
// consider admins as invited
|
|
|
|
find = { $or: [{ isInvited: true }, { isAdmin: true }]};
|
|
|
|
break;
|
|
|
|
case 'uninvited':
|
|
|
|
find = { $and: [{ isInvited: false }, { isAdmin: false }]};
|
|
|
|
break;
|
|
|
|
case 'admin':
|
|
|
|
find = { isAdmin: true };
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch(sortBy){
|
|
|
|
case 'username':
|
|
|
|
sort = { username: 1 };
|
|
|
|
break;
|
|
|
|
case 'karma':
|
|
|
|
sort = { karma: -1 };
|
|
|
|
break;
|
|
|
|
case 'postCount':
|
|
|
|
sort = { postCount: -1 };
|
|
|
|
break;
|
|
|
|
case 'commentCount':
|
|
|
|
sort = { commentCount: -1 };
|
2015-05-01 18:22:00 +02:00
|
|
|
break;
|
2015-04-22 07:50:11 +09:00
|
|
|
case 'invitedCount':
|
|
|
|
sort = { invitedCount: -1 };
|
|
|
|
}
|
|
|
|
return {
|
|
|
|
find: find,
|
|
|
|
options: { sort: sort, limit: limit }
|
|
|
|
};
|
|
|
|
};
|
2015-05-13 11:01:03 +09:00
|
|
|
|
|
|
|
|
|
|
|
Users.updateAdmin = function (userId, admin) {
|
2015-05-17 12:08:08 +09:00
|
|
|
Users.update(userId, {$set: {isAdmin: admin}});
|
2015-05-13 11:01:03 +09:00
|
|
|
};
|
|
|
|
|
|
|
|
Users.adminUsers = function () {
|
|
|
|
return this.find({isAdmin : true}).fetch();
|
|
|
|
};
|
|
|
|
|
|
|
|
Users.getCurrentUserEmail = function () {
|
|
|
|
return Meteor.user() ? Users.getEmail(Meteor.user()) : '';
|
2015-05-16 13:13:45 +09:00
|
|
|
};
|
|
|
|
|
|
|
|
Users.findByEmail = function (email) {
|
|
|
|
return Meteor.users.findOne({"emails.address": email});
|
2015-05-19 09:50:39 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @method Users.getRequiredFields
|
|
|
|
* Get a list of all fields required for a profile to be complete
|
|
|
|
*/
|
|
|
|
Users.getRequiredFields = function () {
|
|
|
|
var schema = Users.simpleSchema()._schema;
|
|
|
|
var fields = _.filter(_.keys(schema), function (fieldName) {
|
|
|
|
var field = schema[fieldName];
|
|
|
|
return !!field.required;
|
|
|
|
});
|
|
|
|
return fields;
|
|
|
|
};
|