updatePost.js 4.0 KB

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