Taichi Masuyama 4 лет назад
Родитель
Сommit
1163bb709f

+ 3 - 1
packages/app/src/server/routes/apiv3/import.js

@@ -280,7 +280,9 @@ module.exports = (crowi) => {
      * import
      */
     try {
-      importService.import(collections, importSettingsMap);
+      crowi.appService.useMaintenanceMode(async() => {
+        await importService.import(collections, importSettingsMap);
+      });
     }
     catch (err) {
       logger.error(err);

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

@@ -786,8 +786,10 @@ module.exports = (crowi) => {
 
     try {
       if (!isV5Compatible) {
-        // this method throws and emit socketIo event when error occurs
-        crowi.pageService.normalizeAllPublicPages(); // not await
+        crowi.appService.useMaintenanceMode(async() => {
+          // This method throws and emit socketIo event when error occurs
+          await crowi.pageService.normalizeAllPublicPages();
+        });
       }
     }
     catch (err) {

+ 22 - 0
packages/app/src/server/service/app.ts

@@ -119,4 +119,26 @@ export default class AppService implements S2sMessageHandlable {
     this.crowi.setupGlobalErrorHandlers();
   }
 
+  async useMaintenanceMode(operation: (...args: any[]) => any): Promise<void> {
+    try {
+      await this.startMaintenanceMode();
+
+      await operation();
+    }
+    catch (err) {
+      throw err;
+    }
+    finally {
+      await this.endMaintenanceMode();
+    }
+  }
+
+  private async startMaintenanceMode() {
+    await this.configManager.updateConfigsInTheSameNamespace('crowi', { 'app:isMaintenanceMode': true });
+  }
+
+  private async endMaintenanceMode() {
+    await this.configManager.updateConfigsInTheSameNamespace('crowi', { 'app:isMaintenanceMode': false });
+  }
+
 }

+ 6 - 0
packages/app/src/server/service/config-loader.ts

@@ -181,6 +181,12 @@ const ENV_VAR_NAME_TO_CONFIG_INFO = {
     type:    ValueType.BOOLEAN,
     default: undefined,
   },
+  IS_MAINTENANCE_MODE: {
+    ns:      'crowi',
+    key:     'app:isMaintenanceMode',
+    type:    ValueType.BOOLEAN,
+    default: false,
+  },
   AUTO_INSTALL_ADMIN_USERNAME: {
     ns:      'crowi',
     key:     'autoInstall:adminUsername',