Browse Source

Merge pull request #4624 from weseek/feat/80103-check-subscribe-rule-of-in-app-notification-settings-when-creating-a-page

Feat/80103 check subscribe rule of in app notification settings when creating a page
Shun Miyazawa 4 years ago
parent
commit
69f8128ab2

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

@@ -1,4 +1,4 @@
-import { Schema } from 'mongoose';
+import { Types } from 'mongoose';
 
 export enum subscribeRuleNames {
   PAGE_CREATE = 'PAGE_CREATE'
@@ -12,6 +12,6 @@ export interface ISubscribeRule {
   isEnabled: boolean;
 }
 export interface IInAppNotificationSettings {
-  userId: Schema.Types.ObjectId;
+  userId: Types.ObjectId;
   subscribeRules: ISubscribeRule[];
 }

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

@@ -7,7 +7,7 @@ export interface InAppNotificationSettingsDocument extends IInAppNotificationSet
 export type InAppNotificationSettingsModel = Model<InAppNotificationSettingsDocument>
 
 const inAppNotificationSettingsSchema = new Schema<IInAppNotificationSettings>({
-  userId: { type: String },
+  userId: { type: Schema.Types.ObjectId },
   subscribeRules: [
     {
       name: { type: String, require: true, enum: subscribeRuleNames },

+ 2 - 3
packages/app/src/server/routes/apiv3/pages.js

@@ -1,7 +1,7 @@
 import { pagePathUtils } from '@growi/core';
 import loggerFactory from '~/utils/logger';
 
-import Subscription, { STATUS_SUBSCRIBE } from '~/server/models/subscription';
+import { subscribeRuleNames } from '~/interfaces/in-app-notification-settings';
 
 const logger = loggerFactory('growi:routes:apiv3:pages'); // eslint-disable-line no-unused-vars
 const express = require('express');
@@ -320,10 +320,9 @@ module.exports = (crowi) => {
       }
     }
 
-    // TODO: 80103
     // create subscription
     try {
-      await Subscription.subscribeByPageId(req.user._id, createdPage._id, STATUS_SUBSCRIBE);
+      await crowi.inAppNotificationService.createSubscription(req.user.id, createdPage._id, subscribeRuleNames.PAGE_CREATE);
     }
     catch (err) {
       logger.error('Failed to create subscription document', err);

+ 14 - 0
packages/app/src/server/service/in-app-notification.ts

@@ -5,6 +5,8 @@ import {
   InAppNotification, STATUS_UNREAD, STATUS_UNOPENED, STATUS_OPENED,
 } from '~/server/models/in-app-notification';
 import { ActivityDocument } from '~/server/models/activity';
+import InAppNotificationSettings from '~/server/models/in-app-notification-settings';
+import Subscription, { STATUS_SUBSCRIBE } from '~/server/models/subscription';
 
 import { IUser } from '~/interfaces/user';
 import { HasObjectId } from '~/interfaces/has-object-id';
@@ -135,6 +137,18 @@ export default class InAppNotificationService {
     }
   };
 
+  createSubscription = async function(userId: Types.ObjectId, pageId: Types.ObjectId, targetRuleName: string): Promise<void> {
+    const query = { userId };
+    const inAppNotificationSettings = await InAppNotificationSettings.findOne(query);
+    if (inAppNotificationSettings != null) {
+      const subscribeRule = inAppNotificationSettings.subscribeRules.find(subscribeRule => subscribeRule.name === targetRuleName);
+      if (subscribeRule != null && subscribeRule.isEnabled) {
+        await Subscription.subscribeByPageId(userId, pageId, STATUS_SUBSCRIBE);
+      }
+    }
+
+    return;
+  };
 
 }