Vulcan/lib/vote.js

143 lines
4.3 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
2012-09-28 09:57:03 +09:00
var getVotePower = function(userId){
2012-09-27 13:13:55 -07:00
var user = Meteor.users.findOne(userId);
return (user && user.isAdmin) ? 5 : 1;
2012-09-18 10:04:26 +10:00
};
2012-09-27 13:13:55 -07:00
2012-09-28 09:57:03 +09:00
var modifyKarma = function(userId, karma){
Meteor.users.update({_id: userId}, {$inc: {karma: karma}});
};
2012-09-29 13:51:55 +09:00
var hasUpvotedItem= function(userId, collection, id){
// 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: userId}) !== undefined;
2012-09-29 13:51:55 +09:00
}
var hasDownvotedItem= function(userId, collection, id){
return collection.findOne({_id: id, downvoters: userId}) !== undefined;
2012-09-29 13:51:55 +09:00
}
2012-09-18 10:04:26 +10:00
var upvote = function(collection, id) {
2012-09-29 13:51:55 +09:00
if (!this.userId() || hasUpvotedItem(this.userId(), collection, id))
2012-09-27 13:13:55 -07:00
return false;
2012-09-28 09:57:03 +09:00
var votePower=getVotePower(this.userId());
var votedItem = collection.findOne(id);
2012-09-29 13:51:55 +09:00
// Votes & Score
collection.update({_id: id},
2012-09-29 17:23:13 +09:00
{$addToSet: {upvoters: this.userId()},
2012-09-28 09:57:03 +09:00
$inc: {votes: 1, baseScore: votePower}});
if(!this.isSimulation)
updateScore(collection, id);
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 != this.userId()) {
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
2012-09-18 10:04:26 +10:00
var downvote = function(collection, id) {
2012-09-29 13:51:55 +09:00
if (!this.userId() || hasDownvotedItem(this.userId(), collection, id))
2012-09-27 13:13:55 -07:00
return false;
2012-09-28 09:57:03 +09:00
var votePower=getVotePower(this.userId());
var votedItem = collection.findOne(id);
2012-09-29 13:51:55 +09:00
// Votes & Score
collection.update({_id: id},
2012-09-29 17:23:13 +09:00
{$addToSet: {downvoters: this.userId()},
2012-09-28 09:57:03 +09:00
$inc: {votes: -1, baseScore: -votePower}});
if(!this.isSimulation)
updateScore(collection, id);
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 != this.userId()) {
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
2012-09-18 10:04:26 +10:00
var cancelUpvote = function(collection, id) {
2012-09-29 13:51:55 +09:00
if (!this.userId() || !hasUpvotedItem(this.userId(), collection, id))
2012-09-27 13:13:55 -07:00
return false;
2012-09-28 09:57:03 +09:00
var votePower=getVotePower(this.userId());
var votedItem = collection.findOne(id);
2012-09-29 13:51:55 +09:00
// Votes & Score
collection.update({_id: id},
2012-09-27 13:13:55 -07:00
{$pull: {upvoters: this.userId()},
2012-09-28 09:57:03 +09:00
$inc: {votes: -1, baseScore: -votePower}});
if(!this.isSimulation)
updateScore(collection, id);
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 != this.userId()) {
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
2012-09-18 10:04:26 +10:00
var cancelDownvote = function(collection, id) {
2012-09-29 13:51:55 +09:00
if (!this.userId() || !hasDownvotedItem(this.userId(), collection, id))
2012-09-27 13:13:55 -07:00
return false;
2012-09-28 09:57:03 +09:00
var votePower=getVotePower(this.userId());
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: this.userId()},
2012-09-28 09:57:03 +09:00
$inc: {votes: 1, baseScore: votePower}});
if(!this.isSimulation)
updateScore(collection, id);
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 != this.userId()) {
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
2012-09-18 10:04:26 +10:00
Meteor.methods({
upvotePost: function(postId){
return upvote.call(this, Posts, postId);
},
downvotePost: function(postId){
return downvote.call(this, Posts, postId);
},
cancelUpvotePost: function(postId){
return cancelUpvote.call(this, Posts, postId);
},
cancelDownvotePost: function(postId){
return cancelDownvote.call(this, Posts, postId);
},
2012-09-18 10:04:26 +10:00
upvoteComment: function(commentId){
return upvote.call(this, Comments, commentId);
},
downvoteComment: function(commentId){
return downvote.call(this, Comments, commentId);
},
cancelUpvoteComment: function(commentId){
return cancelUpvote.call(this, Comments, commentId);
},
cancelDownvoteComment: function(commentId){
return cancelDownvote.call(this, Comments, commentId);
}
2012-09-18 10:04:26 +10:00
});
})();