Pārlūkot izejas kodu

use PageOverwriteParamsFactory

Yuki Takei 6 gadi atpakaļ
vecāks
revīzija
03865109ad
2 mainītis faili ar 43 papildinājumiem un 67 dzēšanām
  1. 24 48
      src/server/routes/apiv3/import.js
  2. 19 19
      src/server/service/import.js

+ 24 - 48
src/server/routes/apiv3/import.js

@@ -10,6 +10,9 @@ const { ObjectId } = require('mongoose').Types;
 
 const express = require('express');
 
+const GrowiArchiveImportOption = require('@commons/models/admin/growi-archive-import-option');
+
+
 const router = express.Router();
 
 /**
@@ -74,46 +77,6 @@ module.exports = (crowi) => {
     },
   });
 
-  /**
-   * defined overwrite params for each collection
-   * all imported documents are overwriten by this value
-   * each value can be any value or a function (value, { document, schema, propertyName }) { return newValue }
-   *
-   * @param {string} collectionName MongoDB collection name
-   * @param {object} req request object
-   * @return {object} document to be persisted
-   */
-  const overwriteParamsFn = (collectionName, req) => {
-    /* eslint-disable no-case-declarations */
-    switch (collectionName) {
-      case 'pages':
-        // TODO: use schema and req to generate overwriteParams
-        // e.g. { creator: schema.creator === 'me' ? ObjectId(req.user._id) : importService.keepOriginal }
-        return {
-          status: 'published', // FIXME when importing users and user groups
-          grant: 1, // FIXME when importing users and user groups
-          grantedUsers: [], // FIXME when importing users and user groups
-          grantedGroup: null, // FIXME when importing users and user groups
-          creator: ObjectId(req.user._id), // FIXME when importing users
-          lastUpdateUser: ObjectId(req.user._id), // FIXME when importing users
-          liker: [], // FIXME when importing users
-          seenUsers: [], // FIXME when importing users
-          commentCount: 0, // FIXME when importing comments
-          extended: {}, // FIXME when ?
-          pageIdOnHackmd: undefined, // FIXME when importing hackmd?
-          revisionHackmdSynced: undefined, // FIXME when importing hackmd?
-          hasDraftOnHackmd: undefined, // FIXME when importing hackmd?
-        };
-      // case 'revisoins':
-      //   return {};
-      // case 'users':
-      //   return {};
-      // ... add more cases
-      default:
-        return {};
-    }
-    /* eslint-enable no-case-declarations */
-  };
 
   /**
    * @swagger
@@ -218,24 +181,37 @@ module.exports = (crowi) => {
       return res.apiv3Err(err);
     }
 
-    // generate maps of ImportOptions to import
-    const importOptionsMap = {};
+    // generate maps of ImportSettings to import
+    const importSettingsMap = {};
     fileStatsToImport.forEach(({ fileName, collectionName }) => {
-      const options = optionsMap[collectionName];
+      // instanciate GrowiArchiveImportOption
+      const options = new GrowiArchiveImportOption(optionsMap[collectionName]);
 
       // generate options
-      const importOptions = importService.generateImportOptions(options.mode);
-      importOptions.jsonFileName = fileName;
-      importOptions.overwriteParams = overwriteParamsFn(collectionName, req, options);
+      const importSettings = importService.generateImportSettings(options.mode);
+      importSettings.jsonFileName = fileName;
+
+      /*
+       * define overwrite params for each collection
+       * all imported documents are overwriten by this value
+       * each value can be any value or a function (value, { document, schema, propertyName }) { return newValue }
+       */
+      switch (collectionName) {
+        case 'pages':
+          importSettings.overwriteParams = require('./overwrite-params/pages')(req, options);
+          break;
+        default:
+          importSettings.overwriteParams = {};
+      }
 
-      importOptionsMap[collectionName] = importOptions;
+      importSettingsMap[collectionName] = importSettings;
     });
 
     /*
      * import
      */
     try {
-      importService.import(collections, importOptionsMap);
+      importService.import(collections, importSettingsMap);
       return res.apiv3();
     }
     catch (err) {

+ 19 - 19
src/server/service/import.js

@@ -16,7 +16,7 @@ const CollectionProgressingStatus = require('../models/vo/collection-progressing
 const BULK_IMPORT_SIZE = 100;
 
 
-class ImportOptions {
+class ImportSettings {
 
   constructor(mode) {
     this.mode = mode || 'insert';
@@ -55,11 +55,11 @@ class ImportService {
   }
 
   /**
-   * generate ImportOptions instance
+   * generate ImportSettings instance
    * @param {string} mode bulk operation mode (insert | upsert | flushAndInsert)
    */
-  generateImportOptions(mode) {
-    return new ImportOptions(mode);
+  generateImportSettings(mode) {
+    return new ImportSettings(mode);
   }
 
   /**
@@ -137,16 +137,16 @@ class ImportService {
    * import collections from json
    *
    * @param {string} collections MongoDB collection name
-   * @param {array} importOptionsMap key: collection name, value: ImportOptions instance
+   * @param {array} importSettingsMap key: collection name, value: ImportSettings instance
    */
-  async import(collections, importOptionsMap) {
+  async import(collections, importSettingsMap) {
     // init status object
     this.currentProgressingStatus = new CollectionProgressingStatus(collections);
 
     try {
       const promises = collections.map((collectionName) => {
-        const importOptions = importOptionsMap[collectionName];
-        return this.importCollection(collectionName, importOptions);
+        const importSettings = importSettingsMap[collectionName];
+        return this.importCollection(collectionName, importSettings);
       });
       await Promise.all(promises);
     }
@@ -167,24 +167,24 @@ class ImportService {
    *
    * @memberOf ImportService
    * @param {string} collectionName MongoDB collection name
-   * @param {ImportOptions} importOptions
+   * @param {ImportSettings} importSettings
    * @return {insertedIds: Array.<string>, failedIds: Array.<string>}
    */
-  async importCollection(collectionName, importOptions) {
+  async importCollection(collectionName, importSettings) {
     // prepare functions invoked from custom streams
     const convertDocuments = this.convertDocuments.bind(this);
     const bulkOperate = this.bulkOperate.bind(this);
     const execUnorderedBulkOpSafely = this.execUnorderedBulkOpSafely.bind(this);
     const emitProgressEvent = this.emitProgressEvent.bind(this);
 
-    const { mode, jsonFileName, overwriteParams } = importOptions;
+    const { mode, jsonFileName, overwriteParams } = importSettings;
     const Model = this.growiBridgeService.getModelFromCollectionName(collectionName);
     const jsonFile = this.getFile(jsonFileName);
     const collectionProgress = this.currentProgressingStatus.progressMap[collectionName];
 
     try {
       // validate options
-      this.validateImportOptions(collectionName, importOptions);
+      this.validateImportSettings(collectionName, importSettings);
 
       // flush
       if (mode === 'flushAndInsert') {
@@ -218,7 +218,7 @@ class ImportService {
 
           // documents are not persisted until unorderedBulkOp.execute()
           batch.forEach((document) => {
-            bulkOperate(unorderedBulkOp, collectionName, document, importOptions);
+            bulkOperate(unorderedBulkOp, collectionName, document, importSettings);
           });
 
           // exec
@@ -261,10 +261,10 @@ class ImportService {
   /**
    *
    * @param {string} collectionName
-   * @param {ImportOptions} importOptions
+   * @param {importSettings} importSettings
    */
-  validateImportOptions(collectionName, importOptions) {
-    const { mode } = importOptions;
+  validateImportSettings(collectionName, importSettings) {
+    const { mode } = importSettings;
 
     switch (collectionName) {
       case 'configs':
@@ -280,11 +280,11 @@ class ImportService {
    * @param {object} bulk MongoDB Bulk instance
    * @param {string} collectionName collection name
    * @param {object} document
-   * @param {ImportOptions} importOptions
+   * @param {ImportSettings} importSettings
    */
-  bulkOperate(bulk, collectionName, document, importOptions) {
+  bulkOperate(bulk, collectionName, document, importSettings) {
     // insert
-    if (importOptions.mode !== 'upsert') {
+    if (importSettings.mode !== 'upsert') {
       return bulk.insert(document);
     }