Răsfoiți Sursa

Keep upload configs if not none, vice versa

Taichi Masuyama 3 ani în urmă
părinte
comite
a4f7d90822

+ 0 - 1
packages/app/src/components/Admin/G2GDataTransfer.tsx

@@ -1,7 +1,6 @@
 import React, { useCallback, useEffect, useState } from 'react';
 
 import { useTranslation } from 'react-i18next';
-import * as toastr from 'toastr';
 
 import { useGenerateTransferKeyWithThrottle } from '~/client/services/g2g-transfer';
 import { toastError } from '~/client/util/apiNotification';

+ 31 - 4
packages/app/src/server/routes/apiv3/g2g-transfer.ts

@@ -9,7 +9,7 @@ import { SupportedAction } from '~/interfaces/activity';
 import GrowiArchiveImportOption from '~/models/admin/growi-archive-import-option';
 import TransferKeyModel from '~/server/models/transfer-key';
 import { isG2GTransferError } from '~/server/models/vo/g2g-transfer-error';
-import { IDataGROWIInfo, X_GROWI_TRANSFER_KEY_HEADER_NAME } from '~/server/service/g2g-transfer';
+import { IDataGROWIInfo, uploadConfigKeys, X_GROWI_TRANSFER_KEY_HEADER_NAME } from '~/server/service/g2g-transfer';
 import loggerFactory from '~/utils/logger';
 import { TransferKey } from '~/utils/vo/transfer-key';
 
@@ -41,10 +41,10 @@ const validator = {
 module.exports = (crowi: Crowi): Router => {
   const {
     g2gTransferPusherService, g2gTransferReceiverService, exportService, importService,
-    growiBridgeService,
+    growiBridgeService, configManager,
   } = crowi;
   if (g2gTransferPusherService == null || g2gTransferReceiverService == null || exportService == null || importService == null
-    || growiBridgeService == null) {
+    || growiBridgeService == null || configManager == null) {
     throw Error('GROWI is not ready for g2g transfer');
   }
 
@@ -145,14 +145,21 @@ module.exports = (crowi: Crowi): Router => {
 
     const zipFile = importService.getFile(file.filename);
 
-    const { collections: strCollections, optionsMap: strOptionsMap, operatorUserId } = req.body;
+    const {
+      collections: strCollections,
+      optionsMap: strOptionsMap,
+      operatorUserId,
+      uploadConfigs: strUploadConfigs,
+    } = req.body;
 
     // Parse multipart form data
     let collections;
     let optionsMap;
+    let sourceGROWIUploadConfigs;
     try {
       collections = JSON.parse(strCollections);
       optionsMap = JSON.parse(strOptionsMap);
+      sourceGROWIUploadConfigs = JSON.parse(strUploadConfigs);
     }
     catch (err) {
       logger.error(err);
@@ -230,8 +237,28 @@ module.exports = (crowi: Crowi): Router => {
      * import
      */
     try {
+      const shouldKeepUploadConfigs = configManager.getConfig('crowi', 'app:fileUploadType') === 'none';
+
+      let savedUploadConfigs;
+      if (shouldKeepUploadConfigs) {
+        // save
+        savedUploadConfigs = Object.fromEntries(uploadConfigKeys.map((key) => {
+          return [key, configManager.getConfigFromDB('crowi', key)];
+        }));
+      }
+
       await importService.import(collections, importSettingsMap);
       await crowi?.setUpFileUpload(true);
+
+      // remove & save if none
+      if (shouldKeepUploadConfigs) {
+        await configManager.removeConfigsInTheSameNamespace('crowi', uploadConfigKeys);
+        await configManager.updateConfigsInTheSameNamespace('crowi', savedUploadConfigs);
+      }
+      else {
+        await configManager.updateConfigsInTheSameNamespace('crowi', sourceGROWIUploadConfigs);
+      }
+
       await crowi?.appService?.setupAfterInstall();
     }
     catch (err) {

+ 20 - 1
packages/app/src/server/service/config-manager.ts

@@ -187,7 +187,7 @@ export default class ConfigManager implements S2sMessageHandlable {
    *  );
    * ```
    */
-  async updateConfigsInTheSameNamespace(namespace, configs, withoutPublishingS2sMessage) {
+  async updateConfigsInTheSameNamespace(namespace, configs, withoutPublishingS2sMessage?) {
     const queries: any[] = [];
     for (const key of Object.keys(configs)) {
       queries.push({
@@ -208,6 +208,25 @@ export default class ConfigManager implements S2sMessageHandlable {
     }
   }
 
+  async removeConfigsInTheSameNamespace(namespace, configKeys: string[], withoutPublishingS2sMessage?) {
+    const queries: any[] = [];
+    for (const key of configKeys) {
+      queries.push({
+        deleteOne: {
+          filter: { ns: namespace, key },
+        },
+      });
+    }
+    await ConfigModel.bulkWrite(queries);
+
+    await this.loadConfigs();
+
+    // publish updated date after reloading
+    if (this.s2sMessagingService != null && !withoutPublishingS2sMessage) {
+      this.publishUpdateMessage();
+    }
+  }
+
   /**
    * return whether the specified namespace/key should be retrieved only from env vars
    */

+ 18 - 25
packages/app/src/server/service/g2g-transfer.ts

@@ -18,6 +18,18 @@ const logger = loggerFactory('growi:service:g2g-transfer');
 
 export const X_GROWI_TRANSFER_KEY_HEADER_NAME = 'x-growi-transfer-key';
 
+export const uploadConfigKeys = [
+  'app:fileUploadType',
+  'app:useOnlyEnvVarForFileUploadType',
+  'aws:referenceFileWithRelayMode',
+  'aws:lifetimeSecForTemporaryUrl',
+  'gcs:apiKeyJsonPath',
+  'gcs:bucket',
+  'gcs:uploadNamespace',
+  'gcs:referenceFileWithRelayMode',
+  'gcs:useOnlyEnvVarsForSomeOptions',
+];
+
 /**
  * Data used for comparing to/from GROWI information
  */
@@ -223,31 +235,11 @@ export class G2GTransferPusherService implements Pusher {
 
     if (shouldEmit) socket.emit('admin:onStartTransferMongoData', {});
 
-    if (toGROWIInfo.attachmentInfo.type === 'none') {
-      try {
-        const targetConfigKeys = [
-          'app:fileUploadType',
-          'app:useOnlyEnvVarForFileUploadType',
-          'aws:referenceFileWithRelayMode',
-          'aws:lifetimeSecForTemporaryUrl',
-          'gcs:apiKeyJsonPath',
-          'gcs:bucket',
-          'gcs:uploadNamespace',
-          'gcs:referenceFileWithRelayMode',
-          'gcs:useOnlyEnvVarsForSomeOptions',
-        ];
-
-        const updateConfigs = Object.fromEntries(targetConfigKeys.map((key) => {
-          return [key, this.crowi.configManager.getConfig('crowi', key)];
-        }));
-
-        await this.crowi.configManager.updateConfigsInTheSameNamespace('crowi', updateConfigs);
-      }
-      catch (err) {
-        logger.error(err);
-        throw err;
-      }
-    }
+    const targetConfigKeys = uploadConfigKeys;
+
+    const uploadConfigs = Object.fromEntries(targetConfigKeys.map((key) => {
+      return [key, this.crowi.configManager.getConfig('crowi', key)];
+    }));
 
     let zipFileStream: ReadStream;
     try {
@@ -272,6 +264,7 @@ export class G2GTransferPusherService implements Pusher {
       form.append('collections', JSON.stringify(collections));
       form.append('optionsMap', JSON.stringify(optionsMap));
       form.append('operatorUserId', user._id.toString());
+      form.append('uploadConfigs', JSON.stringify(uploadConfigs));
       await rawAxios.post('/_api/v3/g2g-transfer/', form, generateAxiosRequestConfigWithTransferKey(tk, form.getHeaders()));
     }
     catch (errs) {