updatePost.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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. reg = reg.replace(/(\*)/g, '.*');
  49. return new RegExp(reg);
  50. }
  51. updatePostSchema.statics.findSettingsByPath = function(path)
  52. {
  53. var UpdatePost = this;
  54. var prefixes = UpdatePost.createPrefixesByPathPattern(path);
  55. return new Promise(function(resolve, reject) {
  56. UpdatePost.find({$or: [
  57. {patternPrefix: prefixes[0], patternPrefix2: prefixes[1]},
  58. {patternPrefix: '*', patternPrefix2: '*'},
  59. {patternPrefix: prefixes[0], patternPrefix2: '*'},
  60. {patternPrefix: '*', patternPrefix2: prefixes[1]},
  61. ]}).then(function(settings) {
  62. if (settings.length <= 0) {
  63. return resolve(settings);
  64. }
  65. settings = settings.filter(function(setting) {
  66. var patternRegex = UpdatePost.getRegExpByPattern(setting.pathPattern);
  67. return patternRegex.test(path);
  68. });
  69. return resolve(settings);
  70. });
  71. });
  72. };
  73. updatePostSchema.statics.findAll = function(offset)
  74. {
  75. var UpdatePost = this;
  76. var offset = offset || 0;
  77. return new Promise(function(resolve, reject) {
  78. UpdatePost
  79. .find()
  80. .sort({'createdAt': 1})
  81. .populate('creator')
  82. .exec(function(err, data) {
  83. if (err) {
  84. return reject(err);
  85. }
  86. if (data.length < 1) {
  87. return resolve([]);
  88. }
  89. return resolve(data);
  90. });
  91. });
  92. };
  93. updatePostSchema.statics.create = function(pathPattern, channel, user)
  94. {
  95. var UpdatePost = this;
  96. var provider = 'slack'; // now slack only
  97. var prefixes = UpdatePost.createPrefixesByPathPattern(pathPattern);
  98. var notif = new UpdatePost;
  99. notif.pathPattern = pathPattern;
  100. notif.patternPrefix = prefixes[0];
  101. notif.patternPrefix2 = prefixes[1];
  102. notif.channel = UpdatePost.normalizeChannelName(channel);
  103. notif.provider = provider;
  104. notif.creator = user;
  105. notif.createdAt = Date.now();
  106. return new Promise(function(resolve, reject) {
  107. notif.save(function(err, doc) {
  108. if (err) {
  109. return reject(err);
  110. }
  111. return resolve(doc);
  112. });
  113. });
  114. };
  115. updatePostSchema.statics.remove = function(id)
  116. {
  117. var UpdatePost = this;
  118. return new Promise(function(resolve, reject) {
  119. UpdatePost.findOneAndRemove({_id: id}, function(err, data) {
  120. if (err) {
  121. debug('UpdatePost.findOneAndRemove failed', err);
  122. return reject(err);
  123. }
  124. return resolve(data);
  125. });
  126. });
  127. };
  128. return mongoose.model('UpdatePost', updatePostSchema);
  129. };