updatePost.js 3.9 KB

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