Mongoose plugin for upvote/downvote models. Extends Mongoose model with voting functionality.
JavaScript Makefile
Switch branches/tags
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
test
.gitignore
.travis.yml
History.md
Makefile
README.md
index.js
package.json

README.md

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