Browse Source

Merge pull request #5421 from weseek/imprv/send-update-through-websocket

imprv: Send update through websocket
Haku Mizuki 4 năm trước cách đây
mục cha
commit
24770e682d

+ 12 - 0
packages/app/src/interfaces/websocket.ts

@@ -0,0 +1,12 @@
+export const SocketNamespace = {
+  UpdateDescCount: 'UpdateDsecCount',
+} as const;
+export type SocketNamespace = typeof SocketNamespace[keyof typeof SocketNamespace];
+
+type PagePath = string;
+type DescendantCount = number;
+/**
+ * Data of updateDescCount when used through socket.io. Convert to UpdateDescCountData type when use with swr cache.
+ */
+export type UpdateDescCountRawData = Record<PagePath, DescendantCount>;
+export type UpdateDescCountData = Map<PagePath, DescendantCount>;

+ 11 - 0
packages/app/src/server/service/page.ts

@@ -21,6 +21,7 @@ import { ObjectIdLike } from '../interfaces/mongoose-utils';
 import { IUserHasId } from '~/interfaces/user';
 import { Ref } from '~/interfaces/common';
 import { HasObjectId } from '~/interfaces/has-object-id';
+import { SocketNamespace, UpdateDescCountRawData } from '~/interfaces/websocket';
 import PageOperation, { PageActionStage, PageActionType } from '../models/page-operation';
 import ActivityDefine from '../util/activityDefine';
 
@@ -2635,7 +2636,17 @@ class PageService {
     const Page = this.crowi.model('Page');
     const ancestors = await Page.findAncestorsUsingParentRecursively(pageId, shouldIncludeTarget);
     const ancestorPageIds = ancestors.map(p => p._id);
+
     await Page.incrementDescendantCountOfPageIds(ancestorPageIds, inc);
+
+    const updateDescCountData: UpdateDescCountRawData = Object.fromEntries(ancestors.map(p => [p.path, p.descendantCount + inc]));
+    this.emitUpdateDescCount(updateDescCountData);
+  }
+
+  private emitUpdateDescCount(data: UpdateDescCountRawData): void {
+    const socket = this.crowi.socketIoService.getDefaultSocket();
+
+    socket.emit(SocketNamespace.UpdateDescCount, data);
   }
 
 }

+ 3 - 0
packages/app/test/integration/setup-crowi.js

@@ -1,3 +1,5 @@
+import { Server } from 'http';
+
 import Crowi from '~/server/crowi';
 
 let _instance = null;
@@ -7,6 +9,7 @@ const initCrowi = async(crowi) => {
   await crowi.setupConfigManager();
 
   await crowi.setupSocketIoService();
+  await crowi.socketIoService.attachServer(new Server()); // attach dummy server
 
   await Promise.all([
     crowi.setUpApp(),