Преглед изворни кода

save a snapshot when saving activity

Shun Miyazawa пре 4 година
родитељ
комит
283b581b94

+ 15 - 0
packages/app/src/models/serializers/activity-snapshot/user.ts

@@ -0,0 +1,15 @@
+import { IUser } from '~/interfaces/user';
+
+export type ISnapshot = {
+  actionUsername: string
+}
+
+export const stringifySnapshot = (user: IUser): string => {
+  return JSON.stringify({
+    username: user.username,
+  });
+};
+
+export const parseSnapshot = (snapshot: string): ISnapshot => {
+  return JSON.parse(snapshot);
+};

+ 4 - 0
packages/app/src/server/models/activity.ts

@@ -18,6 +18,7 @@ export interface ActivityDocument extends Document {
   targetModel: string
   targetModel: string
   target: Types.ObjectId
   target: Types.ObjectId
   action: string
   action: string
+  snapshot: string
 
 
   getNotificationTargetUsers(): Promise<any[]>
   getNotificationTargetUsers(): Promise<any[]>
 }
 }
@@ -48,6 +49,9 @@ const activitySchema = new Schema<ActivityDocument, ActivityModel>({
     require: true,
     require: true,
     enum: AllSupportedActionType,
     enum: AllSupportedActionType,
   },
   },
+  snapshot: {
+    type: String,
+  },
 }, {
 }, {
   timestamps: {
   timestamps: {
     createdAt: true,
     createdAt: true,

+ 5 - 2
packages/app/src/server/service/comment.ts

@@ -2,7 +2,8 @@ import { getModelSafely } from '@growi/core';
 import { Types } from 'mongoose';
 import { Types } from 'mongoose';
 
 
 import { SUPPORTED_TARGET_MODEL_TYPE, SUPPORTED_ACTION_TYPE } from '~/interfaces/activity';
 import { SUPPORTED_TARGET_MODEL_TYPE, SUPPORTED_ACTION_TYPE } from '~/interfaces/activity';
-import { stringifySnapshot } from '~/models/serializers/in-app-notification-snapshot/page';
+import { stringifySnapshot as stringifySnapshotForActivity } from '~/models/serializers/activity-snapshot/user';
+import { stringifySnapshot as stringifySnapshotForInAppNotification } from '~/models/serializers/in-app-notification-snapshot/page';
 
 
 import loggerFactory from '../../utils/logger';
 import loggerFactory from '../../utils/logger';
 import Crowi from '../crowi';
 import Crowi from '../crowi';
@@ -80,24 +81,26 @@ class CommentService {
   }
   }
 
 
   private createActivity = async function(user, target, action) {
   private createActivity = async function(user, target, action) {
+    const snapshot = stringifySnapshotForActivity(user);
     const parameters = {
     const parameters = {
       user: user._id,
       user: user._id,
       targetModel: SUPPORTED_TARGET_MODEL_TYPE.MODEL_PAGE,
       targetModel: SUPPORTED_TARGET_MODEL_TYPE.MODEL_PAGE,
       target,
       target,
       action,
       action,
+      snapshot,
     };
     };
     const activity = await this.activityService.createByParameters(parameters);
     const activity = await this.activityService.createByParameters(parameters);
     return activity;
     return activity;
   };
   };
 
 
   private createAndSendNotifications = async function(activity, page) {
   private createAndSendNotifications = async function(activity, page) {
-    const snapshot = stringifySnapshot(page);
 
 
     // Get user to be notified
     // Get user to be notified
     let targetUsers: Types.ObjectId[] = [];
     let targetUsers: Types.ObjectId[] = [];
     targetUsers = await activity.getNotificationTargetUsers();
     targetUsers = await activity.getNotificationTargetUsers();
 
 
     // Create and send notifications
     // Create and send notifications
+    const snapshot = stringifySnapshotForInAppNotification(page);
     await this.inAppNotificationService.upsertByActivity(targetUsers, activity, snapshot);
     await this.inAppNotificationService.upsertByActivity(targetUsers, activity, snapshot);
     await this.inAppNotificationService.emitSocketIo(targetUsers);
     await this.inAppNotificationService.emitSocketIo(targetUsers);
   };
   };

+ 16 - 15
packages/app/src/server/service/page.ts

@@ -18,7 +18,8 @@ import {
 } from '~/interfaces/page-delete-config';
 } from '~/interfaces/page-delete-config';
 import { IUserHasId } from '~/interfaces/user';
 import { IUserHasId } from '~/interfaces/user';
 import { SocketEventName, UpdateDescCountRawData } from '~/interfaces/websocket';
 import { SocketEventName, UpdateDescCountRawData } from '~/interfaces/websocket';
-import { stringifySnapshot } from '~/models/serializers/in-app-notification-snapshot/page';
+import { stringifySnapshot as stringifySnapshotForActivity } from '~/models/serializers/activity-snapshot/user';
+import { stringifySnapshot as stringifySnapshotForInAppNotification } from '~/models/serializers/in-app-notification-snapshot/page';
 import {
 import {
   CreateMethod, PageCreateOptions, PageModel, PageDocument,
   CreateMethod, PageCreateOptions, PageModel, PageDocument,
 } from '~/server/models/page';
 } from '~/server/models/page';
@@ -159,7 +160,7 @@ class PageService {
       this.pageEvent.onUpdate();
       this.pageEvent.onUpdate();
 
 
       try {
       try {
-        await this.createAndSendNotifications(page, user, SUPPORTED_ACTION_TYPE.ACTION_PAGE_UPDATE);
+        await this.createAndSendNotifications(user, page, SUPPORTED_ACTION_TYPE.ACTION_PAGE_UPDATE);
       }
       }
       catch (err) {
       catch (err) {
         logger.error(err);
         logger.error(err);
@@ -169,7 +170,7 @@ class PageService {
     // rename
     // rename
     this.pageEvent.on('rename', async(page, user) => {
     this.pageEvent.on('rename', async(page, user) => {
       try {
       try {
-        await this.createAndSendNotifications(page, user, SUPPORTED_ACTION_TYPE.ACTION_PAGE_RENAME);
+        await this.createAndSendNotifications(user, page, SUPPORTED_ACTION_TYPE.ACTION_PAGE_RENAME);
       }
       }
       catch (err) {
       catch (err) {
         logger.error(err);
         logger.error(err);
@@ -179,7 +180,7 @@ class PageService {
     // duplicate
     // duplicate
     this.pageEvent.on('duplicate', async(page, user) => {
     this.pageEvent.on('duplicate', async(page, user) => {
       try {
       try {
-        await this.createAndSendNotifications(page, user, SUPPORTED_ACTION_TYPE.ACTION_PAGE_DUPLICATE);
+        await this.createAndSendNotifications(user, page, SUPPORTED_ACTION_TYPE.ACTION_PAGE_DUPLICATE);
       }
       }
       catch (err) {
       catch (err) {
         logger.error(err);
         logger.error(err);
@@ -189,7 +190,7 @@ class PageService {
     // delete
     // delete
     this.pageEvent.on('delete', async(page, user) => {
     this.pageEvent.on('delete', async(page, user) => {
       try {
       try {
-        await this.createAndSendNotifications(page, user, SUPPORTED_ACTION_TYPE.ACTION_PAGE_DELETE);
+        await this.createAndSendNotifications(user, page, SUPPORTED_ACTION_TYPE.ACTION_PAGE_DELETE);
       }
       }
       catch (err) {
       catch (err) {
         logger.error(err);
         logger.error(err);
@@ -199,7 +200,7 @@ class PageService {
     // delete completely
     // delete completely
     this.pageEvent.on('deleteCompletely', async(page, user) => {
     this.pageEvent.on('deleteCompletely', async(page, user) => {
       try {
       try {
-        await this.createAndSendNotifications(page, user, SUPPORTED_ACTION_TYPE.ACTION_PAGE_DELETE_COMPLETELY);
+        await this.createAndSendNotifications(user, page, SUPPORTED_ACTION_TYPE.ACTION_PAGE_DELETE_COMPLETELY);
       }
       }
       catch (err) {
       catch (err) {
         logger.error(err);
         logger.error(err);
@@ -209,7 +210,7 @@ class PageService {
     // revert
     // revert
     this.pageEvent.on('revert', async(page, user) => {
     this.pageEvent.on('revert', async(page, user) => {
       try {
       try {
-        await this.createAndSendNotifications(page, user, SUPPORTED_ACTION_TYPE.ACTION_PAGE_REVERT);
+        await this.createAndSendNotifications(user, page, SUPPORTED_ACTION_TYPE.ACTION_PAGE_REVERT);
       }
       }
       catch (err) {
       catch (err) {
         logger.error(err);
         logger.error(err);
@@ -219,7 +220,7 @@ class PageService {
     // likes
     // likes
     this.pageEvent.on('like', async(page, user) => {
     this.pageEvent.on('like', async(page, user) => {
       try {
       try {
-        await this.createAndSendNotifications(page, user, SUPPORTED_ACTION_TYPE.ACTION_PAGE_LIKE);
+        await this.createAndSendNotifications(user, page, SUPPORTED_ACTION_TYPE.ACTION_PAGE_LIKE);
       }
       }
       catch (err) {
       catch (err) {
         logger.error(err);
         logger.error(err);
@@ -229,7 +230,7 @@ class PageService {
     // bookmark
     // bookmark
     this.pageEvent.on('bookmark', async(page, user) => {
     this.pageEvent.on('bookmark', async(page, user) => {
       try {
       try {
-        await this.createAndSendNotifications(page, user, SUPPORTED_ACTION_TYPE.ACTION_PAGE_BOOKMARK);
+        await this.createAndSendNotifications(user, page, SUPPORTED_ACTION_TYPE.ACTION_PAGE_BOOKMARK);
       }
       }
       catch (err) {
       catch (err) {
         logger.error(err);
         logger.error(err);
@@ -2231,18 +2232,17 @@ class PageService {
     return shortBodiesMap;
     return shortBodiesMap;
   }
   }
 
 
-  private async createAndSendNotifications(page, user, action) {
+  private async createAndSendNotifications(user, target, action) {
     const { activityService, inAppNotificationService } = this.crowi;
     const { activityService, inAppNotificationService } = this.crowi;
-    console.log(user);
-
-    const snapshot = stringifySnapshot(page);
 
 
     // Create activity
     // Create activity
+    const snapshotForActivity = stringifySnapshotForActivity(user);
     const parameters = {
     const parameters = {
       user: user._id,
       user: user._id,
       targetModel: SUPPORTED_TARGET_MODEL_TYPE.MODEL_PAGE,
       targetModel: SUPPORTED_TARGET_MODEL_TYPE.MODEL_PAGE,
-      target: page,
+      target,
       action,
       action,
+      snapshot: snapshotForActivity,
     };
     };
     const activity = await activityService.createByParameters(parameters);
     const activity = await activityService.createByParameters(parameters);
 
 
@@ -2250,7 +2250,8 @@ class PageService {
     const targetUsers = await activity.getNotificationTargetUsers();
     const targetUsers = await activity.getNotificationTargetUsers();
 
 
     // Create and send notifications
     // Create and send notifications
-    await inAppNotificationService.upsertByActivity(targetUsers, activity, snapshot);
+    const snapshotForInAppNotification = stringifySnapshotForInAppNotification(target);
+    await inAppNotificationService.upsertByActivity(targetUsers, activity, snapshotForInAppNotification);
     await inAppNotificationService.emitSocketIo(targetUsers);
     await inAppNotificationService.emitSocketIo(targetUsers);
   }
   }