2012-09-11 15:32:25 +10:00
|
|
|
// TODO: should the baseScore be stored, and updated at vote time?
|
|
|
|
|
|
|
|
// This interface should change and become more OO, this'll do for now
|
|
|
|
var Scoring = {
|
|
|
|
// re-run the scoring algorithm on a single object
|
|
|
|
updateObject: function(object) {
|
|
|
|
|
|
|
|
// just count the number of votes for now
|
2012-09-11 16:55:36 +10:00
|
|
|
var baseScore = object.votes;
|
2012-09-12 08:53:13 +09:00
|
|
|
|
2012-09-11 15:32:25 +10:00
|
|
|
// now multiply by 'age' exponentiated
|
|
|
|
// FIXME: timezones <-- set by server or is getTime() ok?
|
|
|
|
var ageInHours = (new Date().getTime() - object.submitted) / (60 * 60 * 1000);
|
|
|
|
|
2012-09-12 08:53:13 +09:00
|
|
|
// object.score = baseScore * Math.pow(ageInHours + 2, -0.1375);
|
|
|
|
|
|
|
|
// debug: just add 1 to the score for each new vote
|
|
|
|
object.score = object.score+1;
|
2012-09-11 15:32:25 +10:00
|
|
|
},
|
|
|
|
|
|
|
|
// rerun all the scoring
|
|
|
|
updateScores: function() {
|
|
|
|
Posts.find().forEach(function(post) {
|
|
|
|
Scoring.updateObject(post);
|
|
|
|
Posts.update(post._id, {$set: {score: post.score}});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-08-30 21:35:48 -04:00
|
|
|
Meteor.methods({
|
|
|
|
voteForPost: function(post){
|
2012-09-11 16:55:36 +10:00
|
|
|
var userId = this.userId();
|
|
|
|
if(!userId) return false;
|
|
|
|
|
|
|
|
// atomically update the post's votes
|
|
|
|
var query = {_id: post._id, voters: {$ne: userId}};
|
|
|
|
var update = {$push: {voters: userId}, $inc: {votes: 1}};
|
|
|
|
Posts.update(query, update);
|
2012-09-11 15:32:25 +10:00
|
|
|
|
2012-09-11 16:55:36 +10:00
|
|
|
// now update the post's score
|
|
|
|
post = Posts.findOne(post._id);
|
2012-09-11 15:32:25 +10:00
|
|
|
Scoring.updateObject(post);
|
|
|
|
Posts.update(post._id, {$set: {score: post.score}});
|
|
|
|
|
2012-08-30 21:35:48 -04:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
});
|