updatePost.js 4.0 KB

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