comment.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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. debug('Comment saved.', data);
  34. return resolve(data);
  35. });
  36. });
  37. };
  38. commentSchema.statics.getCommentsByPageId = function(id) {
  39. var self = this;
  40. return new Promise(function(resolve, reject) {
  41. self
  42. .find({page: id})
  43. .sort({'createdAt': -1})
  44. .populate('creator', USER_PUBLIC_FIELDS)
  45. .exec(function(err, data) {
  46. if (err) {
  47. return reject(err);
  48. }
  49. if (data.length < 1) {
  50. return resolve([]);
  51. }
  52. //debug('Comment loaded', data);
  53. return resolve(data);
  54. });
  55. });
  56. };
  57. commentSchema.statics.getCommentsByRevisionId = function(id) {
  58. var self = this;
  59. return new Promise(function(resolve, reject) {
  60. self
  61. .find({revision: id})
  62. .sort({'createdAt': -1})
  63. .populate('creator', USER_PUBLIC_FIELDS)
  64. .exec(function(err, data) {
  65. if (err) {
  66. return reject(err);
  67. }
  68. if (data.length < 1) {
  69. return resolve([]);
  70. }
  71. debug('Comment loaded', data);
  72. return resolve(data);
  73. });
  74. });
  75. };
  76. commentSchema.statics.countCommentByPageId = function(page) {
  77. var self = this;
  78. return new Promise(function(resolve, reject) {
  79. self.count({page: page}, function(err, data) {
  80. if (err) {
  81. return reject(err);
  82. }
  83. return resolve(data);
  84. });
  85. });
  86. };
  87. commentSchema.statics.removeCommentsByPageId = function(pageId) {
  88. var Comment = this;
  89. return new Promise(function(resolve, reject) {
  90. Comment.remove({page: pageId}, function(err, done) {
  91. if (err) {
  92. return reject(err);
  93. }
  94. resolve(done);
  95. });
  96. });
  97. };
  98. /**
  99. * post save hook
  100. */
  101. commentSchema.post('save', function(savedComment) {
  102. var Page = crowi.model('Page')
  103. , Comment = crowi.model('Comment')
  104. ;
  105. Page.updateCommentCount(savedComment.page)
  106. .then(function(page) {
  107. debug('CommentCount Updated', page);
  108. }).catch(function() {
  109. });
  110. });
  111. return mongoose.model('Comment', commentSchema);
  112. };