Awesome
mongoose-voting
Mongoose plugin to upvote/downvote stuff. Extends any model with handy methods for voting.
Install
$ npm install mongoose-voting
Usage example
var CommentSchema = new Schema({..});
// Default voter is `User` model
CommentSchema.plugin(voting);
// Or you can tell `mongoose-voting`
// which model references
CommentSchema.plugin(voting, { ref: 'Author' });
// ...
var author = new Author({});
var comment = new Comment({});
// upvote and check
comment.upvote(author);
comment.upvoted(author); // true
comment.downvoted(author); // false
// downvote with save
comment.downvote(author, function(err, doc) {
assert.equal(doc, comment); // true
doc.downvoted(author); // true
});
comment.voted(author); // true
API
.upvote(user)
Upvotes document by user. user
can be either a model instance (like User
), an ObjectId
or even the hex string from ObjectId
.
comment.upvote(author);
comment.voted(author); // true
comment.upvoted(author); // true
.upvote(user, fn)
Same as .upvote(user)
but calls save
on model with fn
function as callback.
comment.upvote(author, function(err, doc) {
doc.voted(author); // true
doc.upvoted(author); // true
});
.downvote(user)
Downvotes document by user. user
can be either a model instance (like User
), an ObjectId
or even the hex string from ObjectId
.
comment.upvote(author);
comment.voted(author); // true
comment.upvoted(author); // true
.downvote(user, fn)
Same as .downvote(user)
but calls save
on model with fn
function as callback.
comment.downvote(author, function(err, doc) {
doc.voted(author); // true
doc.downvoted(author); // true
});
.unvote(user)
Cancels any vote cast by user. user
can be either a model instance (like User
), an ObjectId
or even the hex string from ObjectId
.
comment.upvote(author);
comment.voted(author); // true
comment.unvote(author);
comment.voted(author); // false
.unvote(user, fn)
Same as .unvote(user)
but calls save
on model with fn
function as callback.
comment.upvote(author);
comment.voted(author); // true
comment.unvote(author);
comment.voted(author); // false
.upvoted(user)
Returns true
if document was 'upvoted' by user. false
otherwise.
comment.upvote(user);
comment.upvoted(user); // true
comment.downvoted(user); // false
.downvoted(user)
Returns true
if document was 'downvoted' by user. false
otherwise.
comment.downvote(user);
comment.upvoted(user); // false
comment.downvoted(user); // true
.voted(user)
Returns true
if document was 'upvoted' or 'downvoted' by user. false
otherwise.
comment.downvote(user);
comment.voted(user); // true
comment.upvote(user);
comment.voted(user); // true
.upvotes()
Returns Number of upvotes
count.
comment.downvote(user);
comment.upvotes(); // 0
comment.upvote(user);
comment.upvotes(); // 1
.downvotes()
Returns Number of downvotes
count.
comment.downvote(user);
comment.upvotes(); // 1
comment.upvote(user);
comment.upvotes(); // 0
.votes()
Returns Number of votes
count.
comment.downvote(user);
comment.votes(); // 1
comment.upvote(user);
comment.votes(); // 1
comment.downvote(user2);
comment.votes(); // 2
Test
$ npm install --dev
$ make test
FAQ
How to work with sub documents?
Article.findById(req.params.article_id, function(err, article) {
var comment = article.comments.id(req.params.comment_id);
comment.upvote(req.user._id); // <- this is the key
article.save(function(err) {
if (err) {
return res.status(500).json({ error: 'Cannot save the challenge idea ' + err });
}
return res.json(comment);
});
});
License
MIT