bookmark.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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. bookmarkSchema.statics.populatePage = function(bookmarks) {
  13. var Bookmark = this;
  14. var User = crowi.model('User');
  15. var Page = crowi.model('Page');
  16. return new Promise(function(resolve, reject) {
  17. Bookmark.populate(bookmarks, {path: 'page'}, function(err, bookmarks) {
  18. if (err) {
  19. return reject(err);
  20. }
  21. Bookmark.populate(bookmarks, {path: 'page.revision', model: 'Revision'}, function(err, bookmarks) {
  22. if (err) {
  23. return reject(err);
  24. }
  25. Bookmark.populate(bookmarks, {path: 'page.revision.author', model: 'User', select: User.USER_PUBLIC_FIELDS}, function(err, bookmarks) {
  26. if (err) {
  27. return reject(err);
  28. }
  29. return resolve(bookmarks);
  30. });
  31. });
  32. });
  33. });
  34. };
  35. // bookmark チェック用
  36. bookmarkSchema.statics.findByPageIdAndUserId = function(pageId, userId) {
  37. var Bookmark = this;
  38. return new Promise(function(resolve, reject) {
  39. return Bookmark.findOne({ page: pageId, user: userId }, function(err, doc) {
  40. if (err) {
  41. return reject(err);
  42. }
  43. return resolve(doc);
  44. });
  45. });
  46. };
  47. bookmarkSchema.statics.findByUser = function(user, option) {
  48. var User = crowi.model('User');
  49. var Bookmark = this;
  50. var limit = option.limit || 50;
  51. var offset = option.offset || 0;
  52. var populatePage = option.populatePage || false;
  53. return new Promise(function(resolve, reject) {
  54. Bookmark
  55. .find({ user: user._id })
  56. .sort({createdAt: -1})
  57. .skip(offset)
  58. .limit(limit)
  59. .exec(function(err, bookmarks) {
  60. if (err) {
  61. return reject(err);
  62. }
  63. if (!populatePage) {
  64. return resolve(bookmarks);
  65. }
  66. return Bookmark.populatePage(bookmarks).then(resolve).catch(reject);
  67. });
  68. });
  69. };
  70. bookmarkSchema.statics.add = function(page, user) {
  71. var Bookmark = this;
  72. return new Promise(function(resolve, reject) {
  73. var newBookmark = new Bookmark;
  74. newBookmark.page = page;
  75. newBookmark.user = user;
  76. newBookmark.createdAt = Date.now();
  77. newBookmark.save(function(err, bookmark) {
  78. debug('Bookmark.save', err, bookmark);
  79. if (err) {
  80. if (err.code === 11000) { // duplicate key (dummy reesponse of new object)
  81. return resolve(newBookmark);
  82. }
  83. return reject(err);
  84. }
  85. resolve(bookmark);
  86. });
  87. });
  88. };
  89. bookmarkSchema.statics.remove = function(page, user) {
  90. var Bookmark = this;
  91. return new Promise(function(resolve, reject) {
  92. Bookmark.findOneAndRemove({page: page, user: user}, function(err, data) {
  93. if (err) {
  94. debug('Bookmark.findOneAndRemove failed', err);
  95. return reject(err);
  96. }
  97. return resolve(data);
  98. });
  99. });
  100. };
  101. return mongoose.model('Bookmark', bookmarkSchema);
  102. };