Home

Awesome

mongoose-voting

Mongoose plugin to upvote/downvote stuff. Extends any model with handy methods for voting.

Build Status

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