updatePost.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /**
  2. * This is the setting for notify to 3rd party tool (like Slack).
  3. */
  4. module.exports = function(crowi) {
  5. var debug = require('debug')('growi:models:updatePost')
  6. , mongoose = require('mongoose')
  7. , ObjectId = mongoose.Schema.Types.ObjectId
  8. , updatePostSchema
  9. ;
  10. // TODO: slack 以外の対応
  11. updatePostSchema = new mongoose.Schema({
  12. pathPattern: { type: String, required: true },
  13. patternPrefix: { type: String, required: true },
  14. patternPrefix2: { type: String, required: true },
  15. channel: { type: String, required: true },
  16. provider: { type: String, required: true },
  17. creator: { type: ObjectId, ref: 'User', index: true },
  18. createdAt: { type: Date, default: Date.now }
  19. });
  20. updatePostSchema.statics.normalizeChannelName = function(channel) {
  21. return channel.replace(/(#|,)/g, '');
  22. };
  23. updatePostSchema.statics.createPrefixesByPathPattern = function(pathPattern) {
  24. var patternPrefix = ['*', '*'];
  25. // not begin with slash
  26. if (!pathPattern.match(/^\/.+/)) {
  27. return patternPrefix;
  28. }
  29. var pattern = pathPattern.split('/');
  30. pattern.shift();
  31. if (pattern[0] && pattern[0] != '*') {
  32. patternPrefix[0] = pattern[0];
  33. }
  34. if (pattern[1] && pattern[1] != '*') {
  35. patternPrefix[1] = pattern[1];
  36. }
  37. return patternPrefix;
  38. };
  39. updatePostSchema.statics.getRegExpByPattern = function(pattern) {
  40. var reg = pattern;
  41. if (!reg.match(/^\/.*/)) {
  42. reg = '/*' + reg + '*';
  43. }
  44. reg = '^' + reg;
  45. reg = reg.replace(/\//g, '\\/');
  46. reg = reg.replace(/(\*)/g, '.*');
  47. return new RegExp(reg);
  48. };
  49. updatePostSchema.statics.findSettingsByPath = function(path) {
  50. var UpdatePost = this;
  51. var prefixes = UpdatePost.createPrefixesByPathPattern(path);
  52. return new Promise(function(resolve, reject) {
  53. UpdatePost.find({$or: [
  54. {patternPrefix: prefixes[0], patternPrefix2: prefixes[1]},
  55. {patternPrefix: '*', patternPrefix2: '*'},
  56. {patternPrefix: prefixes[0], patternPrefix2: '*'},
  57. {patternPrefix: '*', patternPrefix2: prefixes[1]},
  58. ]}).then(function(settings) {
  59. if (settings.length <= 0) {
  60. return resolve(settings);
  61. }
  62. settings = settings.filter(function(setting) {
  63. var patternRegex = UpdatePost.getRegExpByPattern(setting.pathPattern);
  64. return patternRegex.test(path);
  65. });
  66. return resolve(settings);
  67. });
  68. });
  69. };
  70. updatePostSchema.statics.findAll = function(offset) {
  71. var UpdatePost = this;
  72. var offset = offset || 0;
  73. return new Promise(function(resolve, reject) {
  74. UpdatePost
  75. .find()
  76. .sort({'createdAt': 1})
  77. .populate('creator')
  78. .exec(function(err, data) {
  79. if (err) {
  80. return reject(err);
  81. }
  82. if (data.length < 1) {
  83. return resolve([]);
  84. }
  85. return resolve(data);
  86. });
  87. });
  88. };
  89. updatePostSchema.statics.create = function(pathPattern, channel, user) {
  90. var UpdatePost = this;
  91. var provider = 'slack'; // now slack only
  92. var prefixes = UpdatePost.createPrefixesByPathPattern(pathPattern);
  93. var notif = new UpdatePost;
  94. notif.pathPattern = pathPattern;
  95. notif.patternPrefix = prefixes[0];
  96. notif.patternPrefix2 = prefixes[1];
  97. notif.channel = UpdatePost.normalizeChannelName(channel);
  98. notif.provider = provider;
  99. notif.creator = user;
  100. notif.createdAt = Date.now();
  101. return new Promise(function(resolve, reject) {
  102. notif.save(function(err, doc) {
  103. if (err) {
  104. return reject(err);
  105. }
  106. return resolve(doc);
  107. });
  108. });
  109. };
  110. updatePostSchema.statics.remove = function(id) {
  111. var UpdatePost = this;
  112. return new Promise(function(resolve, reject) {
  113. UpdatePost.findOneAndRemove({_id: id}, function(err, data) {
  114. if (err) {
  115. debug('UpdatePost.findOneAndRemove failed', err);
  116. return reject(err);
  117. }
  118. return resolve(data);
  119. });
  120. });
  121. };
  122. return mongoose.model('UpdatePost', updatePostSchema);
  123. };