Explorar el Código

Merge branch 'feat/80099-create-in-app-notification-settings-route' into feat/80098-appearance-of-in-app-notification-settings

Shun Miyazawa hace 4 años
padre
commit
845c6371a4

+ 13 - 0
packages/app/src/interfaces/in-app-notification-settings.ts

@@ -0,0 +1,13 @@
+import { Schema } from 'mongoose';
+
+export enum subscribeRules {
+  PAGE_CREATE = 'PAGE_CREATE'
+}
+export interface IDefaultSubscribeRule {
+  name: subscribeRules;
+  isEnabled: boolean;
+}
+export interface IInAppNotificationSettings {
+  userId: Schema.Types.ObjectId;
+  defaultSubscribeRules: IDefaultSubscribeRule[];
+}

+ 20 - 0
packages/app/src/server/models/in-app-notification-settings.ts

@@ -0,0 +1,20 @@
+import { Schema, Model, Document } from 'mongoose';
+import { getOrCreateModel } from '../util/mongoose-utils';
+
+import { IInAppNotificationSettings, subscribeRules } from '../../interfaces/in-app-notification-settings';
+
+export interface InAppNotificationSettingsDocument extends IInAppNotificationSettings, Document {}
+export type InAppNotificationSettingsModel = Model<InAppNotificationSettingsDocument>
+
+const inAppNotificationSettingsSchema = new Schema<IInAppNotificationSettings>({
+  userId: { type: String },
+  defaultSubscribeRules: [
+    {
+      name: { type: String, require: true, enum: subscribeRules },
+      isEnabled: { type: Boolean },
+    },
+  ],
+});
+
+// eslint-disable-next-line max-len
+export default getOrCreateModel<InAppNotificationSettingsDocument, InAppNotificationSettingsModel>('InAppNotificationSettings', inAppNotificationSettingsSchema);

+ 1 - 0
packages/app/src/server/routes/apiv3/pages.js

@@ -320,6 +320,7 @@ module.exports = (crowi) => {
       }
       }
     }
     }
 
 
+    // TODO: 80103
     // create subscription
     // create subscription
     try {
     try {
       await Subscription.subscribeByPageId(req.user._id, createdPage._id, STATUS_SUBSCRIBE);
       await Subscription.subscribeByPageId(req.user._id, createdPage._id, STATUS_SUBSCRIBE);

+ 78 - 0
packages/app/src/server/routes/apiv3/personal-setting.js

@@ -4,6 +4,8 @@ import loggerFactory from '~/utils/logger';
 
 
 import { listLocaleIds } from '~/utils/locale-utils';
 import { listLocaleIds } from '~/utils/locale-utils';
 
 
+import InAppNotificationSettngs from '../../models/in-app-notification-settings';
+
 const logger = loggerFactory('growi:routes:apiv3:personal-setting');
 const logger = loggerFactory('growi:routes:apiv3:personal-setting');
 
 
 const express = require('express');
 const express = require('express');
@@ -98,6 +100,10 @@ module.exports = (crowi) => {
       body('providerType').isString().not().isEmpty(),
       body('providerType').isString().not().isEmpty(),
       body('accountId').isString().not().isEmpty(),
       body('accountId').isString().not().isEmpty(),
     ],
     ],
+    inAppNotificationSettngs: [
+      body('defaultSubscribeRules.*.name').isString(),
+      body('defaultSubscribeRules.*.isEnabled').optional().isBoolean(),
+    ],
   };
   };
 
 
   /**
   /**
@@ -459,5 +465,77 @@ module.exports = (crowi) => {
 
 
   });
   });
 
 
+  /**
+   * @swagger
+   *
+   *    /personal-setting/in-app-notification-settngs:
+   *      put:
+   *        tags: [in-app-notification-settngs]
+   *        operationId: putInAppNotificationSettngs
+   *        summary: personal-setting/in-app-notification-settngs
+   *        description: Put InAppNotificationSettngs
+   *        responses:
+   *          200:
+   *            description: params of InAppNotificationSettngs
+   *            content:
+   *              application/json:
+   *                schema:
+   *                  properties:
+   *                    currentUser:
+   *                      type: object
+   *                      description: in-app-notification-settngs
+   */
+  // eslint-disable-next-line max-len
+  router.put('/in-app-notification-settngs', accessTokenParser, loginRequiredStrictly, csrf, validator.inAppNotificationSettngs, apiV3FormValidator, async(req, res) => {
+    const query = { userId: req.user.id };
+    const defaultSubscribeRules = req.body.defaultSubscribeRules;
+
+    if (defaultSubscribeRules == null) {
+      return res.apiv3Err('no-rules-found');
+    }
+
+    const options = { upsert: true, new: true, runValidators: true };
+    try {
+      const response = await InAppNotificationSettngs.findOneAndUpdate(query, { defaultSubscribeRules }, options);
+      return res.apiv3({ response });
+    }
+    catch (err) {
+      logger.error(err);
+      return res.apiv3Err('updating-in-app-notification-settings-failed');
+    }
+  });
+
+  /**
+   * @swagger
+   *
+   *    /personal-setting/in-app-notification-settngs:
+   *      get:
+   *        tags: [in-app-notification-settngs]
+   *        operationId: getInAppNotificationSettngs
+   *        summary: personal-setting/in-app-notification-settngs
+   *        description: Get InAppNotificationSettngs
+   *        responses:
+   *          200:
+   *            description: params of InAppNotificationSettngs
+   *            content:
+   *              application/json:
+   *                schema:
+   *                  properties:
+   *                    currentUser:
+   *                      type: object
+   *                      description: InAppNotificationSettngs
+   */
+  router.get('/in-app-notification-settngs', accessTokenParser, loginRequiredStrictly, async(req, res) => {
+    const query = { userId: req.user.id };
+    try {
+      const response = await InAppNotificationSettngs.findOne(query);
+      return res.apiv3(response);
+    }
+    catch (err) {
+      logger.error(err);
+      return res.apiv3Err('getting-in-app-notification-settngs-failed');
+    }
+  });
+
   return router;
   return router;
 };
 };