Просмотр исходного кода

Merge pull request #4441 from weseek/imprv/#78284-moving-methods-to-appropriate-files

Imprv/#78284 moving methods to appropriate files
cao 4 лет назад
Родитель
Сommit
f50f39ea62

+ 1 - 60
packages/app/src/server/models/activity.ts

@@ -8,7 +8,6 @@ import loggerFactory from '../../utils/logger';
 import ActivityDefine from '../util/activityDefine';
 
 import Subscription from './subscription';
-// import { InAppNotification } from './in-app-notification';
 
 const logger = loggerFactory('growi:models:activity');
 
@@ -26,13 +25,7 @@ export interface ActivityDocument extends Document {
   getNotificationTargetUsers(): Promise<any[]>
 }
 
-export interface ActivityModel extends Model<ActivityDocument> {
-  createByParameters(parameters: any): Promise<ActivityDocument>
-  createByPageComment(comment: any): Promise<ActivityDocument>
-  createByPageLike(page: any, user: any): Promise<ActivityDocument>
-  findByUser(user: any): Promise<ActivityDocument[]>
-  getActionUsersFromActivities(activities: ActivityDocument[]): any[]
-}
+export type ActivityModel = Model<ActivityDocument>
 
 module.exports = function(crowi: Crowi) {
   const activityEvent = crowi.event('activity');
@@ -78,58 +71,6 @@ module.exports = function(crowi: Crowi) {
     user: 1, target: 1, action: 1, createdAt: 1,
   }, { unique: true });
 
-  /**
-     * @param {object} parameters
-     * @return {Promise}
-     */
-  activitySchema.statics.createByParameters = function(parameters) {
-    return this.create(parameters);
-  };
-
-  /**
-     * @param {Comment} comment
-     * @return {Promise}
-     */
-  activitySchema.statics.createByPageComment = function(comment) {
-    const parameters = {
-      user: comment.creator,
-      targetModel: ActivityDefine.MODEL_PAGE,
-      target: comment.page,
-      eventModel: ActivityDefine.MODEL_COMMENT,
-      event: comment._id,
-      action: ActivityDefine.ACTION_COMMENT,
-    };
-
-    return this.createByParameters(parameters);
-  };
-
-  /**
-     * @param {Page} page
-     * @param {User} user
-     * @return {Promise}
-     */
-  activitySchema.statics.createByPageLike = function(page, user) {
-    const parameters = {
-      user: user._id,
-      targetModel: ActivityDefine.MODEL_PAGE,
-      target: page,
-      action: ActivityDefine.ACTION_LIKE,
-    };
-
-    return this.createByParameters(parameters);
-  };
-
-  /**
-     * @param {User} user
-     * @return {Promise}
-     */
-  activitySchema.statics.findByUser = function(user) {
-    return this.find({ user }).sort({ createdAt: -1 }).exec();
-  };
-
-  activitySchema.statics.getActionUsersFromActivities = function(activities) {
-    return activities.map(({ user }) => user).filter((user, i, self) => self.indexOf(user) === i);
-  };
 
   activitySchema.methods.getNotificationTargetUsers = async function() {
     const User = getModelSafely('User') || require('~/server/models/user')();

+ 2 - 37
packages/app/src/server/models/in-app-notification.ts

@@ -25,13 +25,9 @@ export interface InAppNotificationDocument extends Document {
 
 export interface InAppNotificationModel extends Model<InAppNotificationDocument> {
   findLatestInAppNotificationsByUser(user: Types.ObjectId, skip: number, offset: number): Promise<InAppNotificationDocument[]>
-
-  // commented out type 'Query' temporary to avoid ts error
-  removeEmpty()/* : Query<any> */
-  read(user) /* : Promise<Query<any>> */
-
-  open(user, id: Types.ObjectId): Promise<InAppNotificationDocument | null>
   getUnreadCountByUser(user: Types.ObjectId): Promise<number | undefined>
+  open(user, id: Types.ObjectId): Promise<InAppNotificationDocument | null>
+  read(user) /* : Promise<Query<any>> */
 
   STATUS_UNREAD: string
   STATUS_UNOPENED: string
@@ -79,12 +75,6 @@ const inAppNotificationSchema = new Schema<InAppNotificationDocument, InAppNotif
   },
 });
 
-// TODO: move this virtual property getter to the service layer if necessary by #78284
-// inAppNotificationSchema.virtual('actionUsers').get(function(this: InAppNotificationDocument) {
-//   const Activity = getModelSafely('Activity') || require('../models/activity')(this.crowi);
-//   return Activity.getActionUsersFromActivities((this.activities as any) as ActivityDocument[]);
-// });
-
 const transform = (doc, ret) => {
   // delete ret.activities
 };
@@ -107,31 +97,6 @@ inAppNotificationSchema.statics.findLatestInAppNotificationsByUser = function(us
     .exec();
 };
 
-inAppNotificationSchema.statics.removeEmpty = function() {
-  return InAppNotification.deleteMany({ activities: { $size: 0 } });
-};
-
-inAppNotificationSchema.statics.read = async function(user) {
-  const query = { user, status: STATUS_UNREAD };
-  const parameters = { status: STATUS_UNOPENED };
-
-  return InAppNotification.updateMany(query, parameters);
-};
-
-inAppNotificationSchema.statics.getUnreadCountByUser = async function(user) {
-  const query = { user, status: STATUS_UNREAD };
-
-  try {
-    const count = await InAppNotification.countDocuments(query);
-
-    return count;
-  }
-  catch (err) {
-    logger.error('Error on getUnreadCountByUser', err);
-    throw err;
-  }
-};
-
 inAppNotificationSchema.statics.STATUS_UNOPENED = function() {
   return STATUS_UNOPENED;
 };

+ 16 - 12
packages/app/src/server/service/activity.ts

@@ -1,6 +1,5 @@
 import Crowi from '../crowi';
 
-import ActivityDefine from '../util/activityDefine';
 import { getModelSafely } from '../util/mongoose-utils';
 
 
@@ -18,23 +17,28 @@ class ActivityService {
     this.activityEvent = crowi.event('activity');
   }
 
+
+  /**
+     * @param {object} parameters
+     * @return {Promise}
+     */
+  createByParameters = function(parameters) {
+    const Activity = getModelSafely('Activity') || require('../models/activity')(this.crowi);
+    return Activity.create(parameters);
+  };
+
+
   /**
-   * @param {Page} page
    * @param {User} user
    * @return {Promise}
    */
-  createByPageUpdate = async function(page, user) {
-    const parameters = {
-      user: user._id,
-      targetModel: ActivityDefine.MODEL_PAGE,
-      target: page,
-      action: ActivityDefine.ACTION_UPDATE,
-    };
-    const Activity = getModelSafely('Activity') || require('../models/activity')(this.crowi);
-    const savedActivity = await Activity.createByParameters(parameters);
-    return savedActivity;
+  findByUser = function(user) {
+    return this.find({ user }).sort({ createdAt: -1 }).exec();
   };
 
+  getActionUsersFromActivities = function(activities) {
+    return activities.map(({ user }) => user).filter((user, i, self) => self.indexOf(user) === i);
+  };
 
 }
 

+ 23 - 3
packages/app/src/server/service/comment.ts

@@ -1,7 +1,7 @@
 import { Types } from 'mongoose';
 import loggerFactory from '../../utils/logger';
 import { getModelSafely } from '../util/mongoose-utils';
-import { ActivityDocument } from '../models/activity';
+import ActivityDefine from '../util/activityDefine';
 import Crowi from '../crowi';
 
 const logger = loggerFactory('growi:service:CommentService');
@@ -37,8 +37,7 @@ class CommentService {
         const Page = getModelSafely('Page') || require('../models/page')(this.crowi);
         await Page.updateCommentCount(savedComment.page);
 
-        const Activity = getModelSafely('Activity') || require('../models/activity')(this.crowi);
-        const savedActivity = await Activity.createByPageComment(savedComment);
+        const savedActivity = await this.createByPageComment(savedComment);
 
         let targetUsers: Types.ObjectId[] = [];
         targetUsers = await savedActivity.getNotificationTargetUsers();
@@ -73,6 +72,27 @@ class CommentService {
     });
   }
 
+  /**
+   * @param {Comment} comment
+   * @return {Promise}
+   */
+  createByPageComment = function(comment) {
+    const { activityService } = this.crowi;
+
+
+    const parameters = {
+      user: comment.creator,
+      targetModel: ActivityDefine.MODEL_PAGE,
+      target: comment.page,
+      eventModel: ActivityDefine.MODEL_COMMENT,
+      event: comment._id,
+      action: ActivityDefine.ACTION_COMMENT,
+    };
+
+    return activityService.createByParameters(parameters);
+  };
+
+
 }
 
 module.exports = CommentService;

+ 31 - 1
packages/app/src/server/service/in-app-notification.ts

@@ -1,7 +1,9 @@
 import { Types } from 'mongoose';
 import { subDays } from 'date-fns';
 import Crowi from '../crowi';
-import { InAppNotification, InAppNotificationDocument, STATUS_UNREAD } from '~/server/models/in-app-notification';
+import {
+  InAppNotification, InAppNotificationDocument, STATUS_UNREAD, STATUS_UNOPENED,
+} from '~/server/models/in-app-notification';
 import { ActivityDocument } from '~/server/models/activity';
 
 import loggerFactory from '~/utils/logger';
@@ -68,6 +70,34 @@ export default class InAppNotificationService {
     return;
   }
 
+  // inAppNotificationSchema.virtual('actionUsers').get(function(this: InAppNotificationDocument) {
+  //   const Activity = getModelSafely('Activity') || require('../models/activity')(this.crowi);
+  //   return Activity.getActionUsersFromActivities((this.activities as any) as ActivityDocument[]);
+  // });
+
+  read = async function(user: Types.ObjectId): Promise<void> {
+    const query = { user, status: STATUS_UNREAD };
+    const parameters = { status: STATUS_UNOPENED };
+    await InAppNotification.updateMany(query, parameters);
+
+    return;
+  };
+
+  getUnreadCountByUser = async function(user: Types.ObjectId): Promise<number| undefined> {
+    const query = { user, status: STATUS_UNREAD };
+
+    try {
+      const count = await InAppNotification.countDocuments(query);
+
+      return count;
+    }
+    catch (err) {
+      logger.error('Error on getUnreadCountByUser', err);
+      throw err;
+    }
+  };
+
+
 }
 
 module.exports = InAppNotificationService;

+ 24 - 2
packages/app/src/server/service/page.js

@@ -1,5 +1,7 @@
 import { pagePathUtils } from '@growi/core';
+import isThisHour from 'date-fns/isThisHour/index.js';
 import loggerFactory from '~/utils/logger';
+import ActivityDefine from '../util/activityDefine';
 
 const mongoose = require('mongoose');
 const escapeStringRegexp = require('escape-string-regexp');
@@ -31,12 +33,12 @@ class PageService {
 
     // update
     this.pageEvent.on('update', async(page, user) => {
-      const { activityService, inAppNotificationService } = this.crowi;
+      const { inAppNotificationService } = this.crowi;
 
       this.pageEvent.onUpdate();
 
       try {
-        const savedActivity = await activityService.createByPageUpdate(page, user);
+        const savedActivity = await this.createByPageUpdate(page, user);
         let targetUsers = [];
         targetUsers = await savedActivity.getNotificationTargetUsers();
 
@@ -764,6 +766,26 @@ class PageService {
     }
   }
 
+  /**
+   * @param {Page} page
+   * @param {User} user
+   * @return {Promise}
+   */
+  createByPageUpdate = async function(page, user) {
+    const { activityService } = this.crowi;
+
+    const parameters = {
+      user: user._id,
+      targetModel: ActivityDefine.MODEL_PAGE,
+      target: page,
+      action: ActivityDefine.ACTION_UPDATE,
+    };
+
+    const savedActivity = await activityService.createByParameters(parameters);
+    return savedActivity;
+  };
+
+
 }
 
 module.exports = PageService;