Explorar o código

Merge pull request #2770 from weseek/feat/GW-3797-setup-file-uploader

Feat/gw 3797 setup file uploader
itizawa %!s(int64=5) %!d(string=hai) anos
pai
achega
000447d077

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

@@ -549,7 +549,13 @@ Crowi.prototype.setUpApp = async function() {
 Crowi.prototype.setUpFileUpload = async function() {
   if (this.fileUploadService == null) {
     this.fileUploadService = require('../service/file-uploader')(this);
+
+    // add as a message handler
+    if (this.s2sMessagingService != null) {
+      this.s2sMessagingService.addMessageHandler(this.fileUploadService);
+    }
   }
+
 };
 
 /**

+ 4 - 6
src/server/routes/apiv3/app-settings.js

@@ -580,9 +580,8 @@ module.exports = (crowi) => {
     };
 
     try {
-      await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestAwsSettingParams);
-
-      // TODO GW-3797 re-setup file uploader
+      await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestAwsSettingParams, true);
+      crowi.fileUploadService.publishUpdatedMessage();
 
       const awsSettingParams = {
         s3Region: crowi.configManager.getConfig('crowi', 'aws:s3Region'),
@@ -633,9 +632,8 @@ module.exports = (crowi) => {
     };
 
     try {
-      await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestGcpSettingParams);
-
-      // TODO GW-3797 re-setup file uploader
+      await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestGcpSettingParams, true);
+      crowi.fileUploadService.publishUpdatedMessage();
 
       const gcpSettingParams = {
         gcsApiKeyJsonPath: crowi.configManager.getConfig('crowi', 'gcs:apiKeyJsonPath'),

+ 16 - 6
src/server/service/file-uploader/index.js

@@ -1,3 +1,5 @@
+const logger = require('@alias/logger')('growi:service:FileUploaderServise');
+
 const envToModuleMappings = {
   aws:     'aws',
   local:   'local',
@@ -9,22 +11,30 @@ const envToModuleMappings = {
   gcs:     'gcs',
 };
 
-class FileUploaderFactory {
+class FileUploadServiceFactory {
+
+  initializeUploader(crowi) {
+    const method = envToModuleMappings[process.env.FILE_UPLOAD] || 'aws';
+
+    const modulePath = `./${method}`;
+    this.uploader = require(modulePath)(crowi);
 
-  getUploader(crowi) {
     if (this.uploader == null) {
-      const method = envToModuleMappings[process.env.FILE_UPLOAD] || 'aws';
-      const modulePath = `./${method}`;
-      this.uploader = require(modulePath)(crowi);
+      logger.warn('Failed to initialize uploader.');
     }
+  }
 
+  getUploader(crowi) {
+    if (this.uploader == null) {
+      this.initializeUploader(crowi);
+    }
     return this.uploader;
   }
 
 }
 
-const factory = new FileUploaderFactory();
 
 module.exports = (crowi) => {
+  const factory = new FileUploadServiceFactory(crowi);
   return factory.getUploader(crowi);
 };

+ 52 - 1
src/server/service/file-uploader/uploader.js

@@ -1,11 +1,22 @@
+const logger = require('@alias/logger')('growi:service:FileUploader');
+
 // file uploader virtual class
 // 各アップローダーで共通のメソッドはここで定義する
+const S2sMessage = require('../../models/vo/s2s-message');
+const S2sMessageHandlable = require('../s2s-messaging/handlable');
 
-class Uploader {
+class Uploader extends S2sMessageHandlable {
 
   constructor(crowi) {
+    super();
+
     this.crowi = crowi;
     this.configManager = crowi.configManager;
+    this.s2sMessagingService = crowi.s2sMessagingService;
+    this.appService = crowi.appService;
+    this.xssService = crowi.xssService;
+
+    this.lastLoadedAt = null;
   }
 
   getIsUploadable() {
@@ -24,6 +35,46 @@ class Uploader {
     return !!this.configManager.getConfig('crowi', 'app:fileUpload');
   }
 
+  /**
+   * @inheritdoc
+   */
+  shouldHandleS2sMessage(s2sMessage) {
+    const { eventName, updatedAt } = s2sMessage;
+    if (eventName !== 'fileUploadServiceUpdated' || updatedAt == null) {
+      return false;
+    }
+
+    return this.lastLoadedAt == null || this.lastLoadedAt < new Date(s2sMessage.updatedAt);
+  }
+
+  /**
+   * @inheritdoc
+   */
+  async handleS2sMessage(s2sMessage) {
+    const { configManager } = this;
+
+    logger.info('Reset fileupload service by pubsub notification');
+    await configManager.loadConfigs();
+    this.initCustomCss();
+    this.initCustomTitle();
+  }
+
+
+  async publishUpdatedMessage() {
+    const { s2sMessagingService } = this;
+
+    if (s2sMessagingService != null) {
+      const s2sMessage = new S2sMessage('customizeServiceUpdated', { updatedAt: new Date() });
+
+      try {
+        await s2sMessagingService.publish(s2sMessage);
+      }
+      catch (e) {
+        logger.error('Failed to publish update message with S2sMessagingService: ', e.message);
+      }
+    }
+  }
+
   /**
    * Check files size limits for all uploaders
    *