Browse Source

refactor SyncPageStatus as ConfigPubsubMessageHandlable

Yuki Takei 5 years ago
parent
commit
e904319249
2 changed files with 61 additions and 6 deletions
  1. 6 1
      src/server/crowi/index.js
  2. 55 5
      src/server/service/system-events/sync-page-status.js

+ 6 - 1
src/server/crowi/index.js

@@ -592,7 +592,12 @@ Crowi.prototype.setupPageService = async function() {
 Crowi.prototype.setupSyncPageStatusService = async function() {
   const SyncPageStatusService = require('../service/system-events/sync-page-status');
   if (this.syncPageStatusService == null) {
-    this.syncPageStatusService = new SyncPageStatusService(this, this.configPubsubService, this.socketIoService);
+    this.syncPageStatusService = new SyncPageStatusService(this, this.configPubsub, this.socketIoService);
+
+    // add as a message handler
+    if (this.configPubsub != null) {
+      this.configPubsub.addMessageHandler(this.syncPageStatusService);
+    }
   }
 };
 

+ 55 - 5
src/server/service/system-events/sync-page-status.js

@@ -1,18 +1,61 @@
 const logger = require('@alias/logger')('growi:service:system-events:SyncPageStatusService');
 
-class SyncPageStatusService {
+const ConfigPubsubMessage = require('../../models/vo/config-pubsub-message');
+const ConfigPubsubMessageHandlable = require('../config-pubsub/handlable');
+
+class SyncPageStatusService extends ConfigPubsubMessageHandlable {
+
+  constructor(crowi, configPubsub, socketIoService) {
+    super();
 
-  constructor(crowi, configPubsubService, socketIoService) {
     this.crowi = crowi;
-    this.configPubsubService = configPubsubService;
+    this.configPubsub = configPubsub;
     this.socketIoService = socketIoService;
 
     this.emitter = crowi.events.page;
 
-    this.init();
+    this.initSystemEventListeners();
+  }
+
+  /**
+   * @inheritdoc
+   */
+  shouldHandleConfigPubsubMessage(configPubsubMessage) {
+    const { eventName } = configPubsubMessage;
+    if (eventName !== 'pageStatusUpdated') {
+      return false;
+    }
+
+    return true;
+  }
+
+  /**
+   * @inheritdoc
+   */
+  async handleConfigPubsubMessage(configPubsubMessage) {
+    const { socketIoEventName, page, user } = configPubsubMessage;
+    const { socketIoService } = this;
+
+    // emit the updated information to clients
+    socketIoService.getDefaultSocket().emit(socketIoEventName, { page, user });
+  }
+
+  async publishToOtherServers(socketIoEventName, page, user) {
+    const { configPubsub } = this;
+
+    if (configPubsub != null) {
+      const configPubsubMessage = new ConfigPubsubMessage('pageStatusUpdated', { socketIoEventName, page, user });
+
+      try {
+        await configPubsub.publish(configPubsubMessage);
+      }
+      catch (e) {
+        logger.error('Failed to publish update message with configPubsub: ', e.message);
+      }
+    }
   }
 
-  init() {
+  initSystemEventListeners() {
     const { socketIoService } = this;
     const { pageService } = this.crowi;
 
@@ -22,21 +65,28 @@ class SyncPageStatusService {
 
       page = pageService.serializeToObj(page); // eslint-disable-line no-param-reassign
       socketIoService.getDefaultSocket().emit('page:create', { page, user, socketClientId });
+
+      this.publishToOtherServers('page:create', page, user);
     });
     this.emitter.on('update', (page, user, socketClientId) => {
       logger.debug('\'update\' event emitted.');
 
       page = pageService.serializeToObj(page); // eslint-disable-line no-param-reassign
       socketIoService.getDefaultSocket().emit('page:update', { page, user, socketClientId });
+
+      this.publishToOtherServers('page:update', page, user);
     });
     this.emitter.on('delete', (page, user, socketClientId) => {
       logger.debug('\'delete\' event emitted.');
 
       page = pageService.serializeToObj(page); // eslint-disable-line no-param-reassign
       socketIoService.getDefaultSocket().emit('page:delete', { page, user, socketClientId });
+
+      this.publishToOtherServers('page:delete', page, user);
     });
     this.emitter.on('saveOnHackmd', (page) => {
       socketIoService.getDefaultSocket().emit('page:editingWithHackmd', { page });
+      this.publishToOtherServers('page:editingWithHackmd', page);
     });
   }