bookmark.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. module.exports = function(crowi) {
  2. var debug = require('debug')('crowi:models:bookmark')
  3. , mongoose = require('mongoose')
  4. , ObjectId = mongoose.Schema.Types.ObjectId
  5. , bookmarkSchema;
  6. bookmarkSchema = new mongoose.Schema({
  7. page: { type: ObjectId, ref: 'Page', index: true },
  8. user: { type: ObjectId, ref: 'User', index: true },
  9. createdAt: { type: Date, default: Date.now() }
  10. });
  11. bookmarkSchema.index({page: 1, user: 1}, {unique: true});
  12. // bookmark チェック用
  13. bookmarkSchema.statics.findByPageIdAndUserId = function(pageId, userId) {
  14. var Bookmark = this;
  15. return new Promise(function(resolve, reject) {
  16. return Bookmark.findOne({ page: pageId, user: userId }, function(err, doc) {
  17. if (err) {
  18. return reject(err);
  19. }
  20. return resolve(doc);
  21. });
  22. });
  23. };
  24. bookmarkSchema.statics.findByUser = function(user, option) {
  25. var Bookmark = this;
  26. var limit = option.limit || 50;
  27. var offset = option.skip || 0;
  28. return new Promise(function(resolve, reject) {
  29. Bookmark
  30. .find({ user: user._id })
  31. .sort({createdAt: -1})
  32. .skip(offset)
  33. .limit(limit)
  34. .exec(function(err, bookmarks) {
  35. if (err) {
  36. return reject(err);
  37. }
  38. return resolve(bookmarks);
  39. });
  40. });
  41. };
  42. bookmarkSchema.statics.add = function(page, user) {
  43. var Bookmark = this;
  44. return new Promise(function(resolve, reject) {
  45. var newBookmark = new Bookmark;
  46. newBookmark.page = page;
  47. newBookmark.user = user;
  48. newBookmark.createdAt = Date.now();
  49. newBookmark.save(function(err, bookmark) {
  50. debug('Bookmark.save', err, bookmark);
  51. if (err) {
  52. if (err.code === 11000) { // duplicate key (dummy reesponse of new object)
  53. return resolve(newBookmark);
  54. }
  55. return reject(err);
  56. }
  57. resolve(bookmark);
  58. });
  59. });
  60. };
  61. bookmarkSchema.statics.remove = function(page, user) {
  62. var Bookmark = this;
  63. return new Promise(function(resolve, reject) {
  64. Bookmark.findOneAndRemove({page: page, user: user}, function(err, data) {
  65. if (err) {
  66. debug('Bookmark.findOneAndRemove failed', err);
  67. return reject(err);
  68. }
  69. return resolve(data);
  70. });
  71. });
  72. };
  73. return mongoose.model('Bookmark', bookmarkSchema);
  74. };