Vulcan/lib/vote.js

190 lines
5.7 KiB
JavaScript
Raw Normal View History

2012-09-18 10:04:26 +10:00
(function() {
2012-09-27 13:13:55 -07:00
// returns how much "power" a user's votes have
var getVotePower = function(user){
2012-09-27 13:13:55 -07:00
return (user && user.isAdmin) ? 5 : 1;
2012-09-18 10:04:26 +10:00
};
2012-09-27 13:13:55 -07:00
2012-10-04 12:33:15 +10:00
var modifyKarma = function(user_id, karma){
Meteor.users.update({_id: user_id}, {$inc: {karma: karma}});
2012-09-28 09:57:03 +09:00
};
var hasUpvotedItem= function(user, collection, id){
2012-09-29 13:51:55 +09:00
// see http://www.mongodb.org/display/DOCS/MongoDB+Data+Modeling+and+Rails
// 'is there an item with this id which contains this userId in its upvoters?'
// if such an item exists, it means we have voted.
return collection.findOne({_id: id, upvoters: user._id}) !== undefined;
2012-09-29 13:51:55 +09:00
}
var hasDownvotedItem= function(user, collection, id){
return collection.findOne({_id: id, downvoters: user._id}) !== undefined;
2012-09-29 13:51:55 +09:00
}
2013-01-15 08:46:00 +09:00
var upvote = function(collection, id, user) {
// if no user is specified, use current user by default
var user = (typeof user === 'undefined') ? Meteor.user() : user;
if (!user || !canUpvote(user, collection, true) || hasUpvotedItem(user, collection, id))
2012-09-27 13:13:55 -07:00
return false;
var votePower=getVotePower(user);
var votedItem = collection.findOne(id);
var vote = 1;
if (hasDownvotedItem(user, collection, id)) {
vote += 1;
votePower *= 2;
}
2012-09-29 13:51:55 +09:00
// Votes & Score
collection.update({_id: id},{
$addToSet: {upvoters: user._id},
$pull: {downvoters: user._id},
$inc: {votes: vote, baseScore: votePower},
$set: {inactive: false}
});
updateScore(collection, id, true);
2012-09-27 13:13:55 -07:00
// Karma
2012-09-29 13:51:55 +09:00
// user's posts and comments do not impact his own karma:
if (votedItem.user_id != user._id) {
modifyKarma(votedItem.user_id, votePower);
2012-09-29 13:51:55 +09:00
}
2012-09-27 13:13:55 -07:00
return true;
2012-09-18 10:04:26 +10:00
};
2012-09-27 13:13:55 -07:00
2013-01-15 08:46:00 +09:00
var downvote = function(collection, id, user) {
// if no user is specified, use current user by default
var user = (typeof user === 'undefined') ? Meteor.user() : user;
if (! user || !canDownvote(user, collection, 'redirect') || hasDownvotedItem(user, collection, id))
2012-09-27 13:13:55 -07:00
return false;
var votePower=getVotePower(user);
var votedItem = collection.findOne(id);
var vote = -1;
if (hasUpvotedItem(user, collection, id)) {
vote -= 1;
votePower *= 2;
}
2012-09-29 13:51:55 +09:00
// Votes & Score
collection.update({_id: id},{
$addToSet: {downvoters: user._id},
$pull: {upvoters: user._id},
$inc: {votes: vote, baseScore: -votePower},
$set: {inactive: false}
});
if(!this.isSimulation)
updateScore(collection, id, true);
2012-09-27 13:13:55 -07:00
2012-09-29 13:51:55 +09:00
// Karma
// user's posts and comments do not impact his own karma:
if (votedItem.user_id != user._id) {
modifyKarma(votedItem.user_id, -votePower);
2012-09-29 13:51:55 +09:00
}
2012-09-27 13:13:55 -07:00
return true;
2012-09-18 10:04:26 +10:00
};
2012-09-27 13:13:55 -07:00
2013-01-15 08:46:00 +09:00
var cancelUpvote = function(collection, id, user) {
// if no user is specified, use current user by default
var user = (typeof user === 'undefined') ? Meteor.user() : user;
if (! user || !canUpvote(user, collection, 'redirect') || ! hasUpvotedItem(user, collection, id))
return false
var votePower=getVotePower(user);
var votedItem = collection.findOne(id);
2012-09-29 13:51:55 +09:00
// Votes & Score
collection.update({_id: id},{
$pull: {upvoters: user._id},
$inc: {votes: -1, baseScore: -votePower},
$set: {inactive: false}
});
if(!this.isSimulation)
updateScore(collection, id, true);
2012-09-27 13:13:55 -07:00
2012-09-29 13:51:55 +09:00
// Karma
// user's posts and comments do not impact his own karma:
if (votedItem.user_id != user._id) {
modifyKarma(votedItem.user_id, -votePower);
2012-09-29 13:51:55 +09:00
}
2012-09-27 13:13:55 -07:00
return true;
2012-09-18 10:04:26 +10:00
};
2012-09-27 13:13:55 -07:00
2013-01-15 08:46:00 +09:00
var cancelDownvote = function(collection, id, user) {
// if no user is specified, use current user by default
var user = (typeof user === 'undefined') ? Meteor.user() : user;
if (! user || !canDownvote(user, collection, 'redirect') || ! hasDownvotedItem(user, collection, id))
return false
2012-09-27 13:13:55 -07:00
var votePower=getVotePower(user);
var votedItem = collection.findOne(id);
2012-09-28 15:07:25 +02:00
2012-09-29 13:51:55 +09:00
// Votes & Score
collection.update({_id: id},{
$pull: {downvoters: user._id},
$inc: {votes: 1, baseScore: votePower},
$set: {inactive: false}
});
if(!this.isSimulation)
updateScore(collection, id, true);
2012-09-27 13:13:55 -07:00
2012-09-29 13:51:55 +09:00
// Karma
// user's posts and comments do not impact his own karma:
if (votedItem.user_id != user._id) {
modifyKarma(votedItem.user_id, votePower);
2012-09-29 13:51:55 +09:00
}
2012-09-27 13:13:55 -07:00
return true;
2012-09-18 10:04:26 +10:00
};
2012-09-27 13:13:55 -07:00
2013-02-04 12:04:01 +09:00
var getUser = function(user){
// only let admins specify different users for voting
// if no user is specified, use current user by default
return (isAdmin(Meteor.user()) && typeof user !== 'undefined') ? user : Meteor.user();
}
2013-01-15 08:46:00 +09:00
2012-09-18 10:04:26 +10:00
Meteor.methods({
2013-01-15 08:46:00 +09:00
upvotePost: function(postId, user){
2013-02-04 12:04:01 +09:00
var user = getUser(user);
2013-01-15 08:46:00 +09:00
return upvote.call(this, Posts, postId, user);
2012-09-18 10:04:26 +10:00
},
2013-01-15 08:46:00 +09:00
downvotePost: function(postId, user){
2013-02-04 12:04:01 +09:00
var user = getUser(user);
2013-01-15 08:46:00 +09:00
return downvote.call(this, Posts, postId, user);
2012-09-18 10:04:26 +10:00
},
2013-01-15 08:46:00 +09:00
cancelUpvotePost: function(postId, user){
2013-02-04 12:04:01 +09:00
var user = getUser(user);
2013-01-15 08:46:00 +09:00
return cancelUpvote.call(this, Posts, postId, user);
2012-09-18 10:04:26 +10:00
},
2013-01-15 08:46:00 +09:00
cancelDownvotePost: function(postId, user){
2013-02-04 12:04:01 +09:00
var user = getUser(user);
2013-01-15 08:46:00 +09:00
return cancelDownvote.call(this, Posts, postId, user);
2012-09-18 10:04:26 +10:00
},
2013-01-15 08:46:00 +09:00
upvoteComment: function(commentId, user){
2013-02-04 12:04:01 +09:00
var user = getUser(user);
2013-01-15 08:46:00 +09:00
return upvote.call(this, Comments, commentId, user);
2012-09-18 10:04:26 +10:00
},
2013-01-15 08:46:00 +09:00
downvoteComment: function(commentId, user){
2013-02-04 12:04:01 +09:00
var user = getUser(user);
2013-01-15 08:46:00 +09:00
return downvote.call(this, Comments, commentId, user);
2012-09-18 10:04:26 +10:00
},
2013-01-15 08:46:00 +09:00
cancelUpvoteComment: function(commentId, user){
2013-02-04 12:04:01 +09:00
var user = getUser(user);
2013-01-15 08:46:00 +09:00
return cancelUpvote.call(this, Comments, commentId, user);
2012-09-18 10:04:26 +10:00
},
2013-01-15 08:46:00 +09:00
cancelDownvoteComment: function(commentId, user){
2013-02-04 12:04:01 +09:00
var user = getUser(user);
2013-01-15 08:46:00 +09:00
return cancelDownvote.call(this, Comments, commentId, user);
}
2012-09-18 10:04:26 +10:00
});
})();