bookmark.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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 User = crowi.model('User');
  26. var Bookmark = this;
  27. var limit = option.limit || 50;
  28. var offset = option.skip || 0;
  29. return new Promise(function(resolve, reject) {
  30. Bookmark
  31. .find({ user: user._id })
  32. .sort({createdAt: -1})
  33. .skip(offset)
  34. .populate([{path: 'page'}, {path: 'user', select: User.USER_PUBLIC_FIELDS}])
  35. .limit(limit)
  36. .exec(function(err, bookmarks) {
  37. if (err) {
  38. return reject(err);
  39. }
  40. //Page.populatePageList();
  41. return resolve(bookmarks);
  42. });
  43. });
  44. };
  45. bookmarkSchema.statics.add = function(page, user) {
  46. var Bookmark = this;
  47. return new Promise(function(resolve, reject) {
  48. var newBookmark = new Bookmark;
  49. newBookmark.page = page;
  50. newBookmark.user = user;
  51. newBookmark.createdAt = Date.now();
  52. newBookmark.save(function(err, bookmark) {
  53. debug('Bookmark.save', err, bookmark);
  54. if (err) {
  55. if (err.code === 11000) { // duplicate key (dummy reesponse of new object)
  56. return resolve(newBookmark);
  57. }
  58. return reject(err);
  59. }
  60. resolve(bookmark);
  61. });
  62. });
  63. };
  64. bookmarkSchema.statics.remove = function(page, user) {
  65. var Bookmark = this;
  66. return new Promise(function(resolve, reject) {
  67. Bookmark.findOneAndRemove({page: page, user: user}, function(err, data) {
  68. if (err) {
  69. debug('Bookmark.findOneAndRemove failed', err);
  70. return reject(err);
  71. }
  72. return resolve(data);
  73. });
  74. });
  75. };
  76. return mongoose.model('Bookmark', bookmarkSchema);
  77. };