comment.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. module.exports = function(crowi) {
  2. var debug = require('debug')('growi: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. isMarkdown: { type: Boolean, default: false}
  16. });
  17. commentSchema.statics.create = function(pageId, creatorId, revisionId, comment, position, isMarkdown) {
  18. var Comment = this,
  19. commentPosition = position || -1;
  20. return new Promise(function(resolve, reject) {
  21. var newComment = new Comment();
  22. newComment.page = pageId;
  23. newComment.creator = creatorId;
  24. newComment.revision = revisionId;
  25. newComment.comment = comment;
  26. newComment.commentPosition = position;
  27. newComment.isMarkdown = isMarkdown || false;
  28. newComment.save(function(err, data) {
  29. if (err) {
  30. debug('Error on saving comment.', err);
  31. return reject(err);
  32. }
  33. data.populate('page', function(err, commentWithPage) {
  34. debug('Comment saved.', commentWithPage);
  35. return resolve(commentWithPage);
  36. });
  37. });
  38. });
  39. };
  40. commentSchema.statics.getCommentsByPageId = function(id) {
  41. var self = this;
  42. return new Promise(function(resolve, reject) {
  43. self
  44. .find({page: id})
  45. .sort({'createdAt': -1})
  46. .populate('creator', USER_PUBLIC_FIELDS)
  47. .exec(function(err, data) {
  48. if (err) {
  49. return reject(err);
  50. }
  51. if (data.length < 1) {
  52. return resolve([]);
  53. }
  54. //debug('Comment loaded', data);
  55. return resolve(data);
  56. });
  57. });
  58. };
  59. commentSchema.statics.getCommentsByRevisionId = function(id) {
  60. var self = this;
  61. return new Promise(function(resolve, reject) {
  62. self
  63. .find({revision: id})
  64. .sort({'createdAt': -1})
  65. .populate('creator', USER_PUBLIC_FIELDS)
  66. .exec(function(err, data) {
  67. if (err) {
  68. return reject(err);
  69. }
  70. if (data.length < 1) {
  71. return resolve([]);
  72. }
  73. debug('Comment loaded', data);
  74. return resolve(data);
  75. });
  76. });
  77. };
  78. commentSchema.statics.countCommentByPageId = function(page) {
  79. var self = this;
  80. return new Promise(function(resolve, reject) {
  81. self.count({page: page}, function(err, data) {
  82. if (err) {
  83. return reject(err);
  84. }
  85. return resolve(data);
  86. });
  87. });
  88. };
  89. commentSchema.statics.removeCommentsByPageId = function(pageId) {
  90. var Comment = this;
  91. return new Promise(function(resolve, reject) {
  92. Comment.remove({page: pageId}, function(err, done) {
  93. if (err) {
  94. return reject(err);
  95. }
  96. resolve(done);
  97. });
  98. });
  99. };
  100. /**
  101. * post save hook
  102. */
  103. commentSchema.post('save', function(savedComment) {
  104. var Page = crowi.model('Page')
  105. , Comment = crowi.model('Comment')
  106. ;
  107. Page.updateCommentCount(savedComment.page)
  108. .then(function(page) {
  109. debug('CommentCount Updated', page);
  110. }).catch(function() {
  111. });
  112. });
  113. return mongoose.model('Comment', commentSchema);
  114. };