|
|
@@ -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');
|
|
|
+};
|