Procházet zdrojové kódy

refactor parsing import options

Yuki Takei před 1 rokem
rodič
revize
5aee49dc63

+ 2 - 2
apps/app/src/client/components/Admin/ImportData/GrowiArchive/ImportForm.jsx

@@ -73,7 +73,7 @@ class ImportForm extends React.Component {
         : DEFAULT_MODE;
       // create GrowiArchiveImportOption instance
       const ImportOption = IMPORT_OPTION_CLASS_MAPPING[collectionName] || GrowiArchiveImportOption;
-      this.initialState.optionsMap[collectionName] = new ImportOption(initialMode);
+      this.initialState.optionsMap[collectionName] = new ImportOption(collectionName, initialMode);
     });
 
     this.state = this.initialState;
@@ -303,7 +303,7 @@ class ImportForm extends React.Component {
       await apiv3Post('/import', {
         fileName,
         collections: Array.from(selectedCollections),
-        optionsMap,
+        options: Object.values(optionsMap),
       });
 
       if (onPostImport != null) {

+ 2 - 1
apps/app/src/models/admin/growi-archive-import-option.js

@@ -1,6 +1,7 @@
 class GrowiArchiveImportOption {
 
-  constructor(mode, initProps = {}) {
+  constructor(collectionName, mode, initProps = {}) {
+    this.collectionName = collectionName;
     this.mode = mode;
 
     Object.entries(initProps).forEach(([key, value]) => {

+ 2 - 2
apps/app/src/models/admin/import-option-for-pages.ts

@@ -20,8 +20,8 @@ export class ImportOptionForPages extends GrowiArchiveImportOption {
 
   initPageMetadatas;
 
-  constructor(mode, initProps) {
-    super(mode, initProps || DEFAULT_PROPS);
+  constructor(collectionName: string, mode: string, initProps) {
+    super(collectionName, mode, initProps || DEFAULT_PROPS);
   }
 
 }

+ 2 - 2
apps/app/src/models/admin/import-option-for-revisions.js

@@ -6,8 +6,8 @@ const DEFAULT_PROPS = {
 
 export class ImportOptionForRevisions extends GrowiArchiveImportOption {
 
-  constructor(mode, initProps) {
-    super(mode, initProps || DEFAULT_PROPS);
+  constructor(collectionName, mode, initProps) {
+    super(collectionName, mode, initProps || DEFAULT_PROPS);
   }
 
 }

+ 17 - 13
apps/app/src/server/routes/apiv3/import.js

@@ -179,29 +179,32 @@ export default function route(crowi) {
    *                  type: array
    *                  items:
    *                    type: string
-   *                optionsMap:
+   *                options:
    *                  description: |
-   *                    the map object of importing option that have collection name as the key
+   *                    the array of importing option that have collection name as the key
    *                  additionalProperties:
-   *                    type: object
-   *                    properties:
-   *                      mode:
-   *                        description: Import mode
-   *                        type: string
-   *                        enum: [insert, upsert, flushAndInsert]
+   *                    type: array
+   *                    items:
+   *                      type: object
+   *                        properties:
+   *                          mode:
+   *                            description: Import mode
+   *                            type: string
+   *                            enum: [insert, upsert, flushAndInsert]
    *      responses:
    *        200:
    *          description: Import process has requested
    */
   router.post('/', accessTokenParser, loginRequired, adminRequired, addActivity, async(req, res) => {
     // TODO: add express validator
-    const { fileName, collections, optionsMap } = req.body;
+    const { fileName, collections, options } = req.body;
 
     // pages collection can only be imported by upsert if isV5Compatible is true
     const isV5Compatible = crowi.configManager.getConfig('crowi', 'app:isV5Compatible');
     const isImportPagesCollection = collections.includes('pages');
     if (isV5Compatible && isImportPagesCollection) {
-      const option = new GrowiArchiveImportOption(null, optionsMap.pages);
+      /** @type {ImportOptionForPages} */
+      const option = options.find(opt => opt.collectionName === 'pages');
       if (option.mode !== 'upsert') {
         return res.apiv3Err(new ErrorV3('Upsert is only available for importing pages collection.', 'only_upsert_available'));
       }
@@ -258,14 +261,15 @@ export default function route(crowi) {
     const importSettingsMap = {};
     fileStatsToImport.forEach(({ fileName, collectionName }) => {
       // instanciate GrowiArchiveImportOption
-      const options = new GrowiArchiveImportOption(null, optionsMap[collectionName]);
+      /** @type {GrowiArchiveImportOption} */
+      const option = options.find(opt => opt.collectionName === collectionName);
 
       // generate options
       /** @type {import('~/server/service/import').ImportSettings} */
       const importSettings = {
-        mode: options.mode,
+        mode: option.mode,
         jsonFileName: fileName,
-        overwriteParams: generateOverwriteParams(collectionName, req.user._id, options),
+        overwriteParams: generateOverwriteParams(collectionName, req.user._id, option),
       };
 
       importSettingsMap[collectionName] = importSettings;

+ 5 - 5
apps/app/src/server/service/import/overwrite-params/index.ts

@@ -11,20 +11,20 @@ import { generateOverwriteParams as generateForRevisions } from './revisions';
  * generate overwrite params with overwrite-params/* modules
  */
 export const generateOverwriteParams = <OPT extends GrowiArchiveImportOption>(
-  collectionName: string, operatorUserId: string, options: OPT,
+  collectionName: string, operatorUserId: string, option: OPT,
 ): OverwriteParams => {
 
   switch (collectionName) {
     case 'pages':
-      if (!isImportOptionForPages(options)) {
+      if (!isImportOptionForPages(option)) {
         throw new Error('Invalid option for pages');
       }
-      return generateForPages(operatorUserId, options);
+      return generateForPages(operatorUserId, option);
     case 'revisions':
-      if (!isImportOptionForPages(options)) {
+      if (!isImportOptionForPages(option)) {
         throw new Error('Invalid option for revisions');
       }
-      return generateForRevisions(operatorUserId, options);
+      return generateForRevisions(operatorUserId, option);
     case 'attachmentFiles.chunks':
       return overwriteParamsForAttachmentFilesChunks;
     default: