|
@@ -0,0 +1,152 @@
|
|
|
|
|
+/**
|
|
|
|
|
+ * This is the setting for notify to 3rd party tool (like Slack).
|
|
|
|
|
+ */
|
|
|
|
|
+module.exports = function(crowi) {
|
|
|
|
|
+ var debug = require('debug')('crowi:models:updatePost')
|
|
|
|
|
+ , mongoose = require('mongoose')
|
|
|
|
|
+ , ObjectId = mongoose.Schema.Types.ObjectId
|
|
|
|
|
+ ;
|
|
|
|
|
+
|
|
|
|
|
+ // TODO: slack 以外の対応
|
|
|
|
|
+ updatePostSchema = new mongoose.Schema({
|
|
|
|
|
+ pathPattern: { type: String, required: true },
|
|
|
|
|
+ patternPrefix: { type: String, required: true },
|
|
|
|
|
+ patternPrefix2: { type: String, required: true },
|
|
|
|
|
+ channel: { type: String, required: true },
|
|
|
|
|
+ provider: { type: String, required: true },
|
|
|
|
|
+ creator: { type: ObjectId, ref: 'User', index: true },
|
|
|
|
|
+ createdAt: { type: Date, default: Date.now }
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ updatePostSchema.statics.normalizeChannelName = function(channel)
|
|
|
|
|
+ {
|
|
|
|
|
+ return channel.replace(/(#|,)/g, '');
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ updatePostSchema.statics.createPrefixesByPathPattern = function(pathPattern)
|
|
|
|
|
+ {
|
|
|
|
|
+ var patternPrefix = ['*', '*'];
|
|
|
|
|
+
|
|
|
|
|
+ // not begin with slash
|
|
|
|
|
+ if (!pathPattern.match(/^\/.+/)) {
|
|
|
|
|
+ return patternPrefix;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ var pattern = pathPattern.split('/');
|
|
|
|
|
+ pattern.shift();
|
|
|
|
|
+ if (pattern[0] && pattern[0] != '*') {
|
|
|
|
|
+ patternPrefix[0] = pattern[0];
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (pattern[1] && pattern[1] != '*') {
|
|
|
|
|
+ patternPrefix[1] = pattern[1];
|
|
|
|
|
+ }
|
|
|
|
|
+ return patternPrefix;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ updatePostSchema.statics.getRegExpByPattern = function(pattern)
|
|
|
|
|
+ {
|
|
|
|
|
+ var reg = pattern;
|
|
|
|
|
+ if (!reg.match(/^\/.*/)) {
|
|
|
|
|
+ reg = '/*' + reg + '*';
|
|
|
|
|
+ }
|
|
|
|
|
+ reg = '^' + reg;
|
|
|
|
|
+ reg = reg.replace(/(\*)/g, '.*');
|
|
|
|
|
+
|
|
|
|
|
+ return new RegExp(reg);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ updatePostSchema.statics.findSettingsByPath = function(path)
|
|
|
|
|
+ {
|
|
|
|
|
+ var UpdatePost = this;
|
|
|
|
|
+ var prefixes = UpdatePost.createPrefixesByPathPattern(path);
|
|
|
|
|
+
|
|
|
|
|
+ return UpdatePost.find({$or: [
|
|
|
|
|
+ {patternPrefix: prefixes[0], patternPrefix2: prefixes[1]},
|
|
|
|
|
+ {patternPrefix: '*', patternPrefix2: '*'},
|
|
|
|
|
+ {patternPrefix: prefixes[0], patternPrefix2: '*'},
|
|
|
|
|
+ {patternPrefix: '*', patternPrefix2: prefixes[1]},
|
|
|
|
|
+ ]})
|
|
|
|
|
+ .then(function(settings) {
|
|
|
|
|
+ if (settings.length <= 0) {
|
|
|
|
|
+ return Promise.resolve(settings);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ settings = settings.filter(function(setting) {
|
|
|
|
|
+ var patternRegex = UpdatePost.getRegExpByPattern(setting.pathPattern);
|
|
|
|
|
+ return pathPattern.test(path);
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ return Promise.resolve(settings);
|
|
|
|
|
+ });
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ updatePostSchema.statics.findAll = function(offset)
|
|
|
|
|
+ {
|
|
|
|
|
+ var UpdatePost = this;
|
|
|
|
|
+ var offset = offset || 0;
|
|
|
|
|
+
|
|
|
|
|
+ return new Promise(function(resolve, reject) {
|
|
|
|
|
+ UpdatePost
|
|
|
|
|
+ .find()
|
|
|
|
|
+ .sort({'createdAt': 1})
|
|
|
|
|
+ .populate('creator')
|
|
|
|
|
+ .exec(function(err, data) {
|
|
|
|
|
+ if (err) {
|
|
|
|
|
+ return reject(err);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (data.length < 1) {
|
|
|
|
|
+ return resolve([]);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return resolve(data);
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ updatePostSchema.statics.create = function(pathPattern, channel, user)
|
|
|
|
|
+ {
|
|
|
|
|
+ var UpdatePost = this;
|
|
|
|
|
+ var provider = 'slack'; // now slack only
|
|
|
|
|
+
|
|
|
|
|
+ var prefixes = UpdatePost.createPrefixesByPathPattern(pathPattern);
|
|
|
|
|
+ var notif = new UpdatePost;
|
|
|
|
|
+ notif.pathPattern = pathPattern;
|
|
|
|
|
+ notif.patternPrefix = prefixes[0];
|
|
|
|
|
+ notif.patternPrefix2 = prefixes[1];
|
|
|
|
|
+ notif.channel = UpdatePost.normalizeChannelName(channel);
|
|
|
|
|
+ notif.provider = provider;
|
|
|
|
|
+ notif.creator = user;
|
|
|
|
|
+ notif.createdAt = Date.now();
|
|
|
|
|
+
|
|
|
|
|
+ return new Promise(function(resolve, reject) {
|
|
|
|
|
+ notif.save(function(err, doc) {
|
|
|
|
|
+ if (err) {
|
|
|
|
|
+ return reject(err);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return resolve(doc);
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ updatePostSchema.statics.remove = function(id)
|
|
|
|
|
+ {
|
|
|
|
|
+ var UpdatePost = this;
|
|
|
|
|
+
|
|
|
|
|
+ return new Promise(function(resolve, reject) {
|
|
|
|
|
+ UpdatePost.findOneAndRemove({_id: id}, function(err, data) {
|
|
|
|
|
+ if (err) {
|
|
|
|
|
+ debug('UpdatePost.findOneAndRemove failed', err);
|
|
|
|
|
+ return reject(err);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return resolve(data);
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ return mongoose.model('UpdatePost', updatePostSchema);
|
|
|
|
|
+};
|
|
|
|
|
+
|