Просмотр исходного кода

implement function which import all posts from esa and clean code.

Ryu Sato 7 лет назад
Родитель
Сommit
98dcac83ba
4 измененных файлов с 137 добавлено и 64 удалено
  1. 22 4
      lib/routes/admin.js
  2. 1 0
      lib/routes/index.js
  3. 83 17
      lib/util/importer.js
  4. 31 43
      lib/views/admin/importer.html

+ 22 - 4
lib/routes/admin.js

@@ -1101,6 +1101,23 @@ module.exports = function(crowi, app) {
     }
   };
 
+  /**
+   * Import all posts from esa
+   *
+   * @param {*} req
+   * @param {*} res
+   */
+  actions.api.importAllPostsFromEsa = function(req, res) {
+    var user = req.user;
+    importer.importAllPostsFromEsa(user)
+    .then(function() {
+      return res.json({ status: true });
+    })
+    .catch(function(err) {
+      return res.json({ status: false, message: `${err}` });
+    });
+  }
+
   /**
    * Test connection to esa and response result with json
    *
@@ -1108,11 +1125,12 @@ module.exports = function(crowi, app) {
    * @param {*} res
    */
   actions.api.testEsaAPI = function(req, res) {
-    importer.testConnectionToEsa(function(data) {
-      if (!data.status) {
-        return res.json({ status: false, message: req.form.errors.join('\n') });
-      }
+    importer.testConnectionToEsa()
+    .then(function() {
       return res.json({ status: true });
+    })
+    .catch(function(err) {
+      return res.json({ status: false, message: `${err}` });
     });
   }
 

+ 1 - 0
lib/routes/index.js

@@ -137,6 +137,7 @@ module.exports = function(crowi, app) {
   // importer management for admin
   app.get('/admin/importer'                , loginRequired(crowi, app) , middleware.adminRequired() , admin.importer.index);
   app.post('/_api/admin/settings/importer' , loginRequired(crowi, app) , middleware.adminRequired() , csrf , form.admin.importer , admin.api.importerSetting);
+  app.post('/_api/admin/import/esa'        , loginRequired(crowi, app) , middleware.adminRequired() , csrf , form.admin.importer , admin.api.importAllPostsFromEsa);
   app.post('/_api/admin/imoprt/testEsaAPI' , loginRequired(crowi, app) , middleware.adminRequired() , csrf , form.admin.importer , admin.api.testEsaAPI);
 
   app.get('/me'                       , loginRequired(crowi, app) , me.index);

+ 83 - 17
lib/util/importer.js

@@ -6,10 +6,15 @@ module.exports = function(crowi) {
   'use strict';
 
   var debug = require('debug')('growi:lib:importer')
+    , request = require('request')
     , esa = require('esa-nodejs')
     , esaClient = {}
+    , Page = crowi.model('Page')
+    , User = crowi.model('User')
+    , pageRouter = require('../routes/page')(crowi)
+    , crowi = crowi
     , config = crowi.getConfig()
-    , util = {}
+    , importer = {}
     ;
 
   /**
@@ -22,33 +27,94 @@ module.exports = function(crowi) {
     });
     debug('esa client is initialized');
   }
+  /**
+   * Get teams from esa (Promise wrapper)
+   */
+  function getTeamsFromEsa() {
+    return new Promise(function(resolve, reject) {
+      esaClient.api.team(function(err, res) {
+        if (err) {
+          debug(err);
+          reject(err);
+        }
+        resolve(res);
+      })
+    });
+  }
+
+  /**
+   * Get posts from esa (Promise wrapper)
+   */
+  function getPostsFromEsa() {
+    return new Promise(function(resolve, reject) {
+      esaClient.api.posts(function(err, res) {
+        if (err) {
+          debug(err);
+          reject(err);
+        }
+        resolve(res);
+      });
+    });
+  }
 
   /**
    * Import post data from esa to GROWI
    */
-  util.importAllPostsFromEsa = function() {
-    // [TODO] TBD
+  importer.importAllPostsFromEsa = function(user) {
+    /* Get posts from esa */
+    return new Promise(function(resolve, reject) {
+      getPostsFromEsa()
+      .then(function(res) {
+        /* Import to GROWI */
+        var basePage = '/';
+        var ignoreNotFound = true;
+        res.body.posts.forEach(function(post) {
+          var pagePath = basePage + [post.category, post.name].filter(v => v).join('/')
+          Page.findPage(pagePath, user, null, ignoreNotFound)
+          .then(function(data) {
+            if (data !== null) {
+              reject('Page exists');
+            }
+            return Page.create(pagePath, post.body_md, user, { grant: Page.GRANT_PUBLIC, grantUserGroupId: null });
+          })
+          .then(function(createdPage) {
+            if (!createdPage) {
+              reject('Page exists');
+            }
+            debug('Crete page: ' + createdPage);
+            resolve();
+          })
+          .catch(function(err) {
+            debug(err);
+            reject(err);
+          })
+        });
+      })
+      .catch(function(err) {
+        debug(err);
+        reject(err);
+      });
+    });
   }
 
   /**
    * Import post data from esa to GROWI
    */
-  util.testConnectionToEsa = function(callback) {
-    esaClient.api.team(function(err, res) {
-      if (err) {
-        console.log(`team: ${config.crowi['importer:esa:team_name']}, access_token: ${config.crowi['importer:esa:access_token']}`);
-        var errMessage = `Test connection to esa failed. 'esa-nodejs' return ${err}`;
-        console.log(errMessage);
-        debug(errMessage);
-        return callback({ status: false, message: errMessage });
-      }
-      console.log("test Connection To esa success");
-      return callback({ status: true });
-    })
+  importer.testConnectionToEsa = function() {
+    return new Promise(function(resolve, reject) {
+      getTeamsFromEsa()
+      .then(function(res) {
+        resolve();
+      })
+      .catch(function(err) {
+        debug(err);
+        reject(err);
+      });
+    });
   }
 
   initialize();
-  util.esaClient = esaClient;
+  importer.esaClient = esaClient;
 
-  return util;
+  return importer;
 };

+ 31 - 43
lib/views/admin/importer.html

@@ -40,7 +40,8 @@
       {% endif %}
 
       <!-- Importer management forms -->
-      <form action="/_api/admin/settings/importer" method="post" class="form-horizontal" id="importerSettingForm" role="form">
+      <form action="/_api/admin/settings/importer" method="post" class="form-horizontal" id="importerSettingForm" role="form"
+          data-success-messaage="更新しました">
         <fieldset>
           <!-- esa importer -->
           <div class="form-group">
@@ -60,16 +61,18 @@
           </div>
 
           <div class="form-group">
+            <input type="hidden" name="_csrf" value="{{ csrf() }}" />
             <div class="col-xs-offset-3 col-xs-6">
-              <button type="button" class="btn btn-primary" onClick="importFromEsa()">
+              <button id="testConnectionToEsa" type="button" class="btn btn-primary" data-action="/_api/admin/import/esa"
+                  data-success-message="Import posts from esa success." data-error-message="Import posts from esa failed.">
                 {{ t("importer_management.import") }}
               </button>
               <button type="submit" class="btn btn-secondary">{# the first element is the default button to submit #}
-                <input type="hidden" name="_csrf" value="{{ csrf() }}">
                 {{ t('Update') }}
               </button>
               <span class="col-xs-offset-1">
-                <button type="button" class="btn btn-default" onClick="testConnectionToEsa(this)">
+                <button id="importFromEsa" type="button" class="btn btn-default" data-action="/_api/admin/imoprt/testEsaAPI"
+                    data-success-message="Test connection to esa success." data-error-message="Test connection to esa failed.">
                   {{ t("importer_management.test_connection") }}
                 </button>
               </span>
@@ -110,68 +113,53 @@
   }
 
   /**
-   * test connection to esa
+   * Post form data and process UI
    */
-  function testConnectionToEsa(buttonClicked) {
-    var $action = '/_api/admin/imoprt/testEsaAPI';
-    var $form = $('#importerSettingForm');
-    var $id = $form.attr('id');
-    var $button = $(buttonClicked);
-    $button.attr('disabled', 'disabled');
-    var jqxhr = $.post($action, $form.serialize(), function(data)
+  function postData(form, button, action, success_msg = "成功しました", error_msg = "エラーが発生しました") {
+    var id = form.attr('id');
+    button.attr('disabled', 'disabled');
+    var jqxhr = $.post(action, form.serialize(), function(data)
       {
         if (!data.status) {
-          showMessage($id, "test connection to esa failed", 'danger');
+          showMessage(id, `${error_msg} ${data.message}`, 'danger');
         }
         else {
-          showMessage($id, "test connection to esa success");
+          showMessage(id, success_msg);
         }
       })
       .fail(function() {
-        showMessage($id, "エラーが発生しました", 'danger');
+        showMessage(id, "エラーが発生しました", 'danger');
       })
       .always(function() {
-        $button.prop('disabled', false);
+        button.prop('disabled', false);
       });
     return false;
   }
 
   /**
-   * import from esa
+   * Handle button
    */
-  function importFromEsa() {
-    alert('importFromEsa');
-  }
+  $('#testConnectionToEsa, #importFromEsa').each(function() {
+    var $form = $('#importerSettingForm');
+    var $button = $(this);
+    var $action = $button.attr('data-action');
+    var $success_msg = $button.attr('data-success-message');
+    var $error_msg = $button.attr('data-error-message');
+    $button.click(function() { return postData($form, $button, $action, $success_msg, $error_msg) });
+  });
 
   /**
    * Handle submit button
    */
   $('#importerSettingForm').each(function() {
-    $(this).submit(function()
-    {
-      var $form = $(this);
-      var $id = $form.attr('id');
-      var $button = $('button', this);
-      $button.attr('disabled', 'disabled');
-      var jqxhr = $.post($form.attr('action'), $form.serialize(), function(data)
-        {
-          if (data.status) {
-            showMessage($id, '更新しました');
-          } else {
-            showMessage($id, data.message, 'danger');
-          }
-        })
-        .fail(function() {
-          showMessage($id, 'エラーが発生しました', 'danger');
-        })
-        .always(function() {
-          $button.prop('disabled', false);
-      });
-      return false;
-    });
+    var $form = $(this);
+    var $button = $("#importerSettingForm input[type='submit']");
+    var $action = $form.attr('action');
+    var $success_msg = $button.attr('data-success-message');
+    var $error_msg = $button.attr('data-error-message');
+    $form.submit(function() { return postData($form, $button, $action, $success_msg, $error_msg) });
   });
 
-
 </script>
 
 {% endblock content_main %}