Przeglądaj źródła

separated files

sou 7 lat temu
rodzic
commit
5183ad9650

+ 14 - 13
lib/models/GlobalNotificationSetting.js

@@ -1,14 +1,15 @@
 const debug = require('debug')('growi:models:GlobalNotificationSetting');
 const mongoose = require('mongoose');
+const notificationSchema = require('./GlobalNotificationSetting/GlobalNotificationSettingParentSchema');
 
 /**
  * parent schema in this model
  */
-const notificationSchema = new mongoose.Schema({
-  isEnabled: { type: Boolean, required: true, default: true },
-  triggerPath: { type: String, required: true },
-  triggerEvents: { type: [String] },
-});
+// const notificationSchema = new mongoose.Schema({
+//   isEnabled: { type: Boolean, required: true, default: true },
+//   triggerPath: { type: String, required: true },
+//   triggerEvents: { type: [String] },
+// });
 
 /**
  * create child schemas inherited from parentSchema
@@ -20,18 +21,18 @@ const notificationSchema = new mongoose.Schema({
  */
 const createChildSchemas = (parentSchema, modelName, discriminatorKey) => {
   const Notification = mongoose.model(modelName, parentSchema);
-  const mailNotification = Notification.discriminator('mail', new mongoose.Schema({
-    toEmail: String,
-  }, {discriminatorKey: discriminatorKey}));
+  // const mailNotification = Notification.discriminator('mail', new mongoose.Schema({
+  //   toEmail: String,
+  // }, {discriminatorKey: discriminatorKey}));
 
-  const slackNotification = Notification.discriminator('slack', new mongoose.Schema({
-    slackChannels: String,
-  }, {discriminatorKey: discriminatorKey}));
+  // const slackNotification = Notification.discriminator('slack', new mongoose.Schema({
+  //   slackChannels: String,
+  // }, {discriminatorKey: discriminatorKey}));
 
   return {
     Parent: Notification,
-    Mail: mailNotification,
-    Slack: slackNotification,
+    // Mail: mailNotification,
+    // Slack: slackNotification,
   };
 };
 

+ 122 - 0
lib/models/GlobalNotificationSetting/GlobalNotificationMailSetting.js

@@ -0,0 +1,122 @@
+const debug = require('debug')('growi:models:GlobalNotificationSetting');
+const mongoose = require('mongoose');
+const notificationSchema = require('./GlobalNotificationSettingParentSchema');
+
+/**
+ * create child schemas inherited from parentSchema
+ * all child schemas are stored in globalnotificationsettings collection
+ * @link{http://url.com module_name}
+ * @param {object} parentSchema
+ * @param {string} modelName
+ * @param {string} discriminatorKey
+ */
+const createChildSchemas = (parentSchema, modelName, discriminatorKey) => {
+  const Notification = mongoose.model(modelName, parentSchema);
+  const mailNotification = Notification.discriminator('mail', new mongoose.Schema({
+    toEmail: String,
+  }, {discriminatorKey: discriminatorKey}));
+
+  return mailNotification;
+};
+
+/**
+ * GlobalNotificationSetting Class
+ * @class GlobalNotificationSetting
+ */
+class GlobalNotificationSetting {
+
+  constructor(crowi) {
+    this.crowi = crowi;
+  }
+
+  /**
+   * enable notification setting
+   * @param {string} id
+   */
+  static async enable(id) {
+    const setting = await this.findOne({_id: id});
+
+    setting.isEnabled = true;
+    setting.save();
+
+    return setting;
+  }
+
+  /**
+   * disable notification setting
+   * @param {string} id
+   */
+  static async disable(id) {
+    const setting = await this.findOne({_id: id});
+
+    setting.isEnabled = false;
+    setting.save();
+
+    return setting;
+  }
+
+  /**
+   * find all notification settings
+   */
+  static async findAll() {
+    const settings = await this.find().sort({ triggerPath: 1 });
+
+    return settings;
+  }
+
+  /**
+   * find a list of notification settings by path and a list of events
+   * @param {string} path
+   * @param {string} event
+   */
+  static async findSettingByPathAndEvent(path, event) {
+    const pathsToMatch = generatePathsToMatch(path);
+
+    const settings = await this.find({
+      triggerPath: {$in: pathsToMatch},
+      triggerEvents: event,
+      isEnabled: true
+    })
+    .sort({ triggerPath: 1 });
+
+    return settings;
+  }
+}
+
+
+// move this to util
+// remove this from models/page
+const cutOffLastSlash = path => {
+  const lastSlash = path.lastIndexOf('/');
+  return path.substr(0, lastSlash);
+};
+
+const generatePathsOnTree = (path, pathList) => {
+  pathList.push(path);
+
+  if (path === '') {
+    return pathList;
+  }
+
+  const newPath = cutOffLastSlash(path);
+
+  return generatePathsOnTree(newPath, pathList);
+};
+
+const generatePathsToMatch = (originalPath) => {
+  const pathList = generatePathsOnTree(originalPath, []);
+  return pathList.map(path => {
+    if (path !== originalPath) {
+      return path + '/*';
+    }
+    else {
+      return path;
+    }
+  });
+};
+
+module.exports = function(crowi) {
+  GlobalNotificationSetting.crowi = crowi;
+  notificationSchema.loadClass(GlobalNotificationSetting);
+  return createChildSchemas(notificationSchema, 'GlobalNotificationSetting', 'type');
+};

+ 12 - 0
lib/models/GlobalNotificationSetting/GlobalNotificationSettingParentSchema.js

@@ -0,0 +1,12 @@
+const mongoose = require('mongoose');
+
+/**
+ * parent schema for GlobalNotificationSetting model
+ */
+const notificationSchema = new mongoose.Schema({
+  isEnabled: { type: Boolean, required: true, default: true },
+  triggerPath: { type: String, required: true },
+  triggerEvents: { type: [String] },
+});
+
+module.exports = notificationSchema;

+ 123 - 0
lib/models/GlobalNotificationSetting/GlobalNotificationSlackSetting.js

@@ -0,0 +1,123 @@
+const debug = require('debug')('growi:models:GlobalNotificationSetting');
+const mongoose = require('mongoose');
+const notificationSchema = require('./GlobalNotificationSettingParentSchema');
+
+/**
+ * create child schemas inherited from parentSchema
+ * all child schemas are stored in globalnotificationsettings collection
+ * @link{http://url.com module_name}
+ * @param {object} parentSchema
+ * @param {string} modelName
+ * @param {string} discriminatorKey
+ */
+const createChildSchemas = (parentSchema, modelName, discriminatorKey) => {
+  const Notification = mongoose.model(modelName, parentSchema);
+  const slackNotification = Notification.discriminator('slack', new mongoose.Schema({
+    slackChannels: String,
+  }, {discriminatorKey: discriminatorKey}));
+
+  return slackNotification;
+};
+
+
+/**
+ * GlobalNotificationSetting Class
+ * @class GlobalNotificationSetting
+ */
+class GlobalNotificationSetting {
+
+  constructor(crowi) {
+    this.crowi = crowi;
+  }
+
+  /**
+   * enable notification setting
+   * @param {string} id
+   */
+  static async enable(id) {
+    const setting = await this.findOne({_id: id});
+
+    setting.isEnabled = true;
+    setting.save();
+
+    return setting;
+  }
+
+  /**
+   * disable notification setting
+   * @param {string} id
+   */
+  static async disable(id) {
+    const setting = await this.findOne({_id: id});
+
+    setting.isEnabled = false;
+    setting.save();
+
+    return setting;
+  }
+
+  /**
+   * find all notification settings
+   */
+  static async findAll() {
+    const settings = await this.find().sort({ triggerPath: 1 });
+
+    return settings;
+  }
+
+  /**
+   * find a list of notification settings by path and a list of events
+   * @param {string} path
+   * @param {string} event
+   */
+  static async findSettingByPathAndEvent(path, event) {
+    const pathsToMatch = generatePathsToMatch(path);
+
+    const settings = await this.find({
+      triggerPath: {$in: pathsToMatch},
+      triggerEvents: event,
+      isEnabled: true
+    })
+    .sort({ triggerPath: 1 });
+
+    return settings;
+  }
+}
+
+
+// move this to util
+// remove this from models/page
+const cutOffLastSlash = path => {
+  const lastSlash = path.lastIndexOf('/');
+  return path.substr(0, lastSlash);
+};
+
+const generatePathsOnTree = (path, pathList) => {
+  pathList.push(path);
+
+  if (path === '') {
+    return pathList;
+  }
+
+  const newPath = cutOffLastSlash(path);
+
+  return generatePathsOnTree(newPath, pathList);
+};
+
+const generatePathsToMatch = (originalPath) => {
+  const pathList = generatePathsOnTree(originalPath, []);
+  return pathList.map(path => {
+    if (path !== originalPath) {
+      return path + '/*';
+    }
+    else {
+      return path;
+    }
+  });
+};
+
+module.exports = function(crowi) {
+  GlobalNotificationSetting.crowi = crowi;
+  notificationSchema.loadClass(GlobalNotificationSetting);
+  return createChildSchemas(notificationSchema, 'GlobalNotificationSetting', 'type');
+};

+ 2 - 0
lib/models/index.js

@@ -13,4 +13,6 @@ module.exports = {
   Attachment: require('./attachment'),
   UpdatePost: require('./updatePost'),
   GlobalNotificationSetting: require('./GlobalNotificationSetting'),
+  GlobalNotificationMailSetting: require('./GlobalNotificationSetting/GlobalNotificationMailSetting'),
+  GlobalNotificationSlackSetting: require('./GlobalNotificationSetting/GlobalNotificationSlackSetting'),
 };

+ 2 - 1
lib/routes/admin.js

@@ -13,6 +13,7 @@ module.exports = function(crowi, app) {
     , UserGroupRelation = models.UserGroupRelation
     , Config = models.Config
     , GlobalNotificationSetting = models.GlobalNotificationSetting
+    , GlobalNotificationMailSetting = models.GlobalNotificationMailSetting
     , PluginUtils = require('../plugins/plugin-utils')
     , pluginUtils = new PluginUtils()
     , ApiResponse = require('../util/apiResponse')
@@ -334,7 +335,7 @@ module.exports = function(crowi, app) {
 
     switch (form.notifyToType) {
       case 'mail':
-        setting = new GlobalNotificationSetting.Mail(crowi);
+        setting = new GlobalNotificationMailSetting(crowi);
         setting.toEmail = form.toEmail;
         break;
       // case 'slack':