comment.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. module.exports = function(crowi) {
  2. var debug = require('debug')('crowi:models:comment')
  3. , mongoose = require('mongoose')
  4. , ObjectId = mongoose.Schema.Types.ObjectId
  5. , USER_PUBLIC_FIELDS = '_id image isGravatarEnabled googleId name username email status createdAt' // TODO: どこか別の場所へ...
  6. , commentSchema
  7. ;
  8. commentSchema = new mongoose.Schema({
  9. page: { type: ObjectId, ref: 'Page', index: true },
  10. creator: { type: ObjectId, ref: 'User', index: true },
  11. revision: { type: ObjectId, ref: 'Revision', index: true },
  12. comment: { type: String, required: true },
  13. commentPosition: { type: Number, default: -1 },
  14. createdAt: { type: Date, default: Date.now }
  15. });
  16. commentSchema.statics.create = function(pageId, creatorId, revisionId, comment, position) {
  17. var Comment = this,
  18. commentPosition = position || -1;
  19. return new Promise(function(resolve, reject) {
  20. var newComment = new Comment();
  21. newComment.page = pageId;
  22. newComment.creator = creatorId;
  23. newComment.revision = revisionId;
  24. newComment.comment = comment;
  25. newComment.commentPosition = position;
  26. newComment.save(function(err, data) {
  27. if (err) {
  28. debug('Error on saving comment.', err);
  29. return reject(err);
  30. }
  31. debug('Comment saved.', data);
  32. return resolve(data);
  33. });
  34. });
  35. };
  36. commentSchema.statics.getCommentsByPageId = function(id) {
  37. var self = this;
  38. return new Promise(function(resolve, reject) {
  39. self
  40. .find({page: id})
  41. .sort({'createdAt': -1})
  42. .populate('creator', USER_PUBLIC_FIELDS)
  43. .exec(function(err, data) {
  44. if (err) {
  45. return reject(err);
  46. }
  47. if (data.length < 1) {
  48. return resolve([]);
  49. }
  50. //debug('Comment loaded', data);
  51. return resolve(data);
  52. });
  53. });
  54. };
  55. commentSchema.statics.getCommentsByRevisionId = function(id) {
  56. var self = this;
  57. return new Promise(function(resolve, reject) {
  58. self
  59. .find({revision: id})
  60. .sort({'createdAt': -1})
  61. .populate('creator', USER_PUBLIC_FIELDS)
  62. .exec(function(err, data) {
  63. if (err) {
  64. return reject(err);
  65. }
  66. if (data.length < 1) {
  67. return resolve([]);
  68. }
  69. debug('Comment loaded', data);
  70. return resolve(data);
  71. });
  72. });
  73. };
  74. commentSchema.statics.countCommentByPageId = function(page) {
  75. var self = this;
  76. return new Promise(function(resolve, reject) {
  77. self.count({page: page}, function(err, data) {
  78. if (err) {
  79. return reject(err);
  80. }
  81. return resolve(data);
  82. });
  83. });
  84. };
  85. commentSchema.statics.removeCommentsByPageId = function(pageId) {
  86. var Comment = this;
  87. return new Promise(function(resolve, reject) {
  88. Comment.remove({page: pageId}, function(err, done) {
  89. if (err) {
  90. return reject(err);
  91. }
  92. resolve(done);
  93. });;
  94. });
  95. };
  96. /**
  97. * post save hook
  98. */
  99. commentSchema.post('save', function(savedComment) {
  100. var Page = crowi.model('Page')
  101. , Comment = crowi.model('Comment')
  102. ;
  103. Comment.countCommentByPageId(savedComment.page)
  104. .then(function(count) {
  105. return Page.updateCommentCount(savedComment.page, count);
  106. }).then(function(page) {
  107. debug('CommentCount Updated', page);
  108. }).catch(function() {
  109. });
  110. });
  111. return mongoose.model('Comment', commentSchema);
  112. };