Browse Source

Merge pull request #2917 from weseek/feat/GW-3826-setup-uploader-when-update-gcp-config

Feat/gw 3826 setup uploader when update gcp config
Yuki Takei 5 years ago
parent
commit
2a4e0a505f

+ 14 - 7
src/server/crowi/index.js

@@ -105,6 +105,7 @@ Crowi.prototype.init = async function() {
     this.setupSlack(),
     this.setupSlack(),
     this.setupCsrf(),
     this.setupCsrf(),
     this.setUpFileUpload(),
     this.setUpFileUpload(),
+    this.setUpFileUploaderSwitchService(),
     this.setupAttachmentService(),
     this.setupAttachmentService(),
     this.setUpAcl(),
     this.setUpAcl(),
     this.setUpCustomize(),
     this.setUpCustomize(),
@@ -546,16 +547,22 @@ Crowi.prototype.setUpApp = async function() {
 /**
 /**
  * setup FileUploadService
  * setup FileUploadService
  */
  */
-Crowi.prototype.setUpFileUpload = async function() {
-  if (this.fileUploadService == null) {
+Crowi.prototype.setUpFileUpload = async function(isForceUpdate = false) {
+  if (this.fileUploadService == null || isForceUpdate) {
     this.fileUploadService = require('../service/file-uploader')(this);
     this.fileUploadService = require('../service/file-uploader')(this);
-
-    // add as a message handler
-    if (this.s2sMessagingService != null) {
-      this.s2sMessagingService.addMessageHandler(this.fileUploadService);
-    }
   }
   }
+};
 
 
+/**
+ * setup FileUploaderSwitchService
+ */
+Crowi.prototype.setUpFileUploaderSwitchService = async function() {
+  const FileUploaderSwitchService = require('../service/file-uploader-switch');
+  this.fileUploaderSwitchService = new FileUploaderSwitchService(this);
+  // add as a message handler
+  if (this.s2sMessagingService != null) {
+    this.s2sMessagingService.addMessageHandler(this.fileUploaderSwitchService);
+  }
 };
 };
 
 
 /**
 /**

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

@@ -581,7 +581,8 @@ module.exports = (crowi) => {
 
 
     try {
     try {
       await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestAwsSettingParams, true);
       await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestAwsSettingParams, true);
-      crowi.fileUploadService.publishUpdatedMessage();
+      await crowi.setUpFileUpload(true);
+      crowi.fileUploadMessageService.publishUpdatedMessage();
 
 
       const awsSettingParams = {
       const awsSettingParams = {
         s3Region: crowi.configManager.getConfig('crowi', 'aws:s3Region'),
         s3Region: crowi.configManager.getConfig('crowi', 'aws:s3Region'),
@@ -633,7 +634,8 @@ module.exports = (crowi) => {
 
 
     try {
     try {
       await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestGcpSettingParams, true);
       await crowi.configManager.updateConfigsInTheSameNamespace('crowi', requestGcpSettingParams, true);
-      crowi.fileUploadService.publishUpdatedMessage();
+      await crowi.setUpFileUpload(true);
+      crowi.fileUploadMessageService.publishUpdatedMessage();
 
 
       const gcpSettingParams = {
       const gcpSettingParams = {
         gcsApiKeyJsonPath: crowi.configManager.getConfig('crowi', 'gcs:apiKeyJsonPath'),
         gcsApiKeyJsonPath: crowi.configManager.getConfig('crowi', 'gcs:apiKeyJsonPath'),

+ 60 - 0
src/server/service/file-uploader-switch.js

@@ -0,0 +1,60 @@
+const logger = require('@alias/logger')('growi:service:FileUploader');
+
+const S2sMessage = require('../models/vo/s2s-message');
+const S2sMessageHandlable = require('./s2s-messaging/handlable');
+
+class fileUploaderSwitch 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;
+  }
+
+  /**
+   * @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();
+    await this.crowi.setUpFileUpload(true);
+  }
+
+  async publishUpdatedMessage() {
+    const { s2sMessagingService } = this;
+
+    if (s2sMessagingService != null) {
+      const s2sMessage = new S2sMessage('fileUploadServiceUpdated', { updatedAt: new Date() });
+
+      try {
+        await s2sMessagingService.publish(s2sMessage);
+      }
+      catch (e) {
+        logger.error('Failed to publish update message with S2sMessagingService: ', e.message);
+      }
+    }
+  }
+
+}
+
+module.exports = fileUploaderSwitch;

+ 4 - 5
src/server/service/file-uploader/index.js

@@ -14,8 +14,10 @@ const envToModuleMappings = {
 class FileUploadServiceFactory {
 class FileUploadServiceFactory {
 
 
   initializeUploader(crowi) {
   initializeUploader(crowi) {
-    const method = envToModuleMappings[process.env.FILE_UPLOAD] || 'aws';
+    // temporarily use envToModuleMappings [remove in GW-4136]
+    const fileUplodeTypeInConfig = envToModuleMappings[crowi.configManager.getConfig('crowi', 'app:fileUploadType')];
 
 
+    const method = envToModuleMappings[process.env.FILE_UPLOAD] || fileUplodeTypeInConfig || 'aws';
     const modulePath = `./${method}`;
     const modulePath = `./${method}`;
     this.uploader = require(modulePath)(crowi);
     this.uploader = require(modulePath)(crowi);
 
 
@@ -25,15 +27,12 @@ class FileUploadServiceFactory {
   }
   }
 
 
   getUploader(crowi) {
   getUploader(crowi) {
-    if (this.uploader == null) {
-      this.initializeUploader(crowi);
-    }
+    this.initializeUploader(crowi);
     return this.uploader;
     return this.uploader;
   }
   }
 
 
 }
 }
 
 
-
 module.exports = (crowi) => {
 module.exports = (crowi) => {
   const factory = new FileUploadServiceFactory(crowi);
   const factory = new FileUploadServiceFactory(crowi);
   return factory.getUploader(crowi);
   return factory.getUploader(crowi);

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

@@ -1,22 +1,11 @@
-const logger = require('@alias/logger')('growi:service:FileUploader');
-
 // file uploader virtual class
 // file uploader virtual class
 // 各アップローダーで共通のメソッドはここで定義する
 // 各アップローダーで共通のメソッドはここで定義する
-const S2sMessage = require('../../models/vo/s2s-message');
-const S2sMessageHandlable = require('../s2s-messaging/handlable');
 
 
-class Uploader extends S2sMessageHandlable {
+class Uploader {
 
 
   constructor(crowi) {
   constructor(crowi) {
-    super();
-
     this.crowi = crowi;
     this.crowi = crowi;
     this.configManager = crowi.configManager;
     this.configManager = crowi.configManager;
-    this.s2sMessagingService = crowi.s2sMessagingService;
-    this.appService = crowi.appService;
-    this.xssService = crowi.xssService;
-
-    this.lastLoadedAt = null;
   }
   }
 
 
   getIsUploadable() {
   getIsUploadable() {
@@ -35,46 +24,6 @@ class Uploader extends S2sMessageHandlable {
     return !!this.configManager.getConfig('crowi', 'app:fileUpload');
     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
    * Check files size limits for all uploaders
    *
    *