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

Merge pull request #1148 from weseek/reacrify-admin-importer-2

qiita end
Yuki Takei 6 лет назад
Родитель
Сommit
7e3667de98

+ 2 - 2
resource/locales/en-US/translation.json

@@ -725,8 +725,8 @@
   },
   },
 
 
   "importer_management": {
   "importer_management": {
-    "import_from_esa": "Import from esa.io",
-    "import_from_qiita": "import_from Qiita:Team",
+    "import_form_esa": "Import from esa.io",
+    "import_form_qiita": "import_from Qiita:Team",
     "esa_settings": {
     "esa_settings": {
       "team_name": "Team name",
       "team_name": "Team name",
       "access_token": "Access token",
       "access_token": "Access token",

+ 2 - 2
resource/locales/ja/translation.json

@@ -709,8 +709,8 @@
   },
   },
 
 
   "importer_management": {
   "importer_management": {
-    "import_from_esa": "esa.ioからインポート",
-    "import_from_qiita": "Qiita:Teamからインポート",
+    "import_form_esa": "esa.ioからインポート",
+    "import_form_qiita": "Qiita:Teamからインポート",
     "esa_settings": {
     "esa_settings": {
       "team_name": "チーム名",
       "team_name": "チーム名",
       "access_token": "アクセストークン",
       "access_token": "アクセストークン",

+ 170 - 17
src/client/js/components/Admin/Importer.jsx

@@ -1,11 +1,14 @@
 import React, { Fragment } from 'react';
 import React, { Fragment } from 'react';
 import { withTranslation } from 'react-i18next';
 import { withTranslation } from 'react-i18next';
 import PropTypes from 'prop-types';
 import PropTypes from 'prop-types';
+import loggerFactory from '@alias/logger';
 
 
 import AppContainer from '../../services/AppContainer';
 import AppContainer from '../../services/AppContainer';
 import { createSubscribedElement } from '../UnstatedUtils';
 import { createSubscribedElement } from '../UnstatedUtils';
 import { toastSuccess, toastError } from '../../util/apiNotification';
 import { toastSuccess, toastError } from '../../util/apiNotification';
 
 
+const logger = loggerFactory('growi:importer');
+
 class Importer extends React.Component {
 class Importer extends React.Component {
 
 
   constructor(props) {
   constructor(props) {
@@ -13,10 +16,15 @@ class Importer extends React.Component {
     this.state = {
     this.state = {
       esaTeamName: '',
       esaTeamName: '',
       esaAccessToken: '',
       esaAccessToken: '',
+      qiitaTeamName: '',
+      qiitaAccessToken: '',
     };
     };
     this.esaHandleSubmit = this.esaHandleSubmit.bind(this);
     this.esaHandleSubmit = this.esaHandleSubmit.bind(this);
     this.esaHandleSubmitTest = this.esaHandleSubmitTest.bind(this);
     this.esaHandleSubmitTest = this.esaHandleSubmitTest.bind(this);
     this.esaHandleSubmitUpdate = this.esaHandleSubmitUpdate.bind(this);
     this.esaHandleSubmitUpdate = this.esaHandleSubmitUpdate.bind(this);
+    this.qiitaHandleSubmit = this.qiitaHandleSubmit.bind(this);
+    this.qiitaHandleSubmitTest = this.qiitaHandleSubmitTest.bind(this);
+    this.qiitaHandleSubmitUpdate = this.qiitaHandleSubmitUpdate.bind(this);
     this.handleInputValue = this.handleInputValue.bind(this);
     this.handleInputValue = this.handleInputValue.bind(this);
   }
   }
 
 
@@ -26,29 +34,28 @@ class Importer extends React.Component {
     });
     });
   }
   }
 
 
-  esaHandleSubmit() {
+  async esaHandleSubmit() {
     try {
     try {
       const params = {
       const params = {
         'importer:esa:team_name': this.state.esaTeamName,
         'importer:esa:team_name': this.state.esaTeamName,
         'importer:esa:access_token': this.state.esaAccessToken,
         'importer:esa:access_token': this.state.esaAccessToken,
       };
       };
-      this.props.appContainer.apiPost('/admin/import/esa', params);
+      await this.props.appContainer.apiPost('/admin/import/esa', params);
       toastSuccess('Import posts from esa success.');
       toastSuccess('Import posts from esa success.');
     }
     }
-    catch (error) {
-      toastError(error, 'Error occurred in importing pages from esa.io');
+    catch (err) {
+      logger.error(err);
+      toastError(err, 'Error occurred in importing pages from esa.io');
     }
     }
   }
   }
 
 
-  esaHandleSubmitTest() {
+  async esaHandleSubmitTest() {
     try {
     try {
       const params = {
       const params = {
         'importer:esa:team_name': this.state.esaTeamName,
         'importer:esa:team_name': this.state.esaTeamName,
         'importer:esa:access_token': this.state.esaAccessToken,
         'importer:esa:access_token': this.state.esaAccessToken,
-
       };
       };
-
-      this.props.appContainer.apiPost('/admin/import/testEsaAPI', params);
+      await this.props.appContainer.apiPost('/admin/import/testEsaAPI', params);
       toastSuccess('Test connection to esa success.');
       toastSuccess('Test connection to esa success.');
     }
     }
     catch (error) {
     catch (error) {
@@ -56,22 +63,71 @@ class Importer extends React.Component {
     }
     }
   }
   }
 
 
-  esaHandleSubmitUpdate() {
+  async esaHandleSubmitUpdate() {
+    const params = {
+      'importer:esa:team_name': this.state.esaTeamName,
+      'importer:esa:access_token': this.state.esaAccessToken,
+    };
+    try {
+      await this.props.appContainer.apiPost('/admin/settings/importerEsa', params);
+      toastSuccess('Updated');
+    }
+    catch (err) {
+      logger.error(err);
+      toastError(err, 'Errors');
+    }
+  }
+
+  async qiitaHandleSubmit() {
     try {
     try {
       const params = {
       const params = {
-        'importer:esa:team_name': this.state.esaTeamName,
-        'importer:esa:access_token': this.state.esaAccessToken,
+        'importer:qiita:team_name': this.state.qiitaTeamName,
+        'importer:qiita:access_token': this.state.qiitaAccessToken,
       };
       };
-      this.props.appContainer.apiPost('/admin/settings/importerEsa', params);
-      toastSuccess('Update');
+      await this.props.appContainer.apiPost('/admin/import/qiita', params);
+      toastSuccess('Import posts from qiita:team success.');
     }
     }
-    catch (error) {
-      toastError(error);
+    catch (err) {
+      logger.error(err);
+      toastError(err, 'Error occurred in importing pages from qiita:team');
+    }
+  }
+
+
+  async qiitaHandleSubmitTest() {
+    try {
+      const params = {
+        'importer:qiita:team_name': this.state.qiitaTeamName,
+        'importer:qiita:access_token': this.state.qiitaAccessToken,
+      };
+      await this.props.appContainer.apiPost('/admin/import/testQiitaAPI', params);
+      toastSuccess('Test connection to qiita:team success.');
+    }
+    catch (err) {
+      logger.error(err);
+      toastError(err, 'Test connection to qiita:team failed.');
+    }
+  }
+
+  async qiitaHandleSubmitUpdate() {
+    const params = {
+      'importer:qiita:team_name': this.state.qiitaTeamName,
+      'importer:qiita:access_token': this.state.qiitaAccessToken,
+    };
+    try {
+      await this.props.appContainer.apiPost('/admin/settings/importerQiita', params);
+      toastSuccess('Updated');
+    }
+    catch (err) {
+      logger.error(err);
+      toastError(err, 'Errors');
     }
     }
   }
   }
 
 
   render() {
   render() {
-    const { esaTeamName, esaAccessToken } = this.state;
+    const {
+      esaTeamName, esaAccessToken, qiitaTeamName, qiitaAccessToken,
+    } = this.state;
     const { t } = this.props;
     const { t } = this.props;
     return (
     return (
       <Fragment>
       <Fragment>
@@ -81,7 +137,7 @@ class Importer extends React.Component {
           role="form"
           role="form"
         >
         >
           <fieldset>
           <fieldset>
-            <legend>{ t('importer_management.import_from_esa') }</legend>
+            <legend>{ t('importer_management.import_form_esa') }</legend>
             <table className="table table-bordered table-mapping">
             <table className="table table-bordered table-mapping">
               <thead>
               <thead>
                 <tr>
                 <tr>
@@ -164,6 +220,103 @@ class Importer extends React.Component {
             </div>
             </div>
           </fieldset>
           </fieldset>
         </form>
         </form>
+
+        <form
+          className="form-horizontal mt-5"
+          id="importerSettingFormQiita"
+          role="form"
+        >
+          <fieldset>
+            <legend>{ t('importer_management.import_form_qiita', 'Qiita:Team') }</legend>
+            <table className="table table-bordered table-mapping">
+              <thead>
+                <tr>
+                  <th width="45%">Qiita:Team</th>
+                  <th width="10%"></th>
+                  <th>GROWI</th>
+                </tr>
+              </thead>
+              <tbody>
+                <tr>
+                  <th>{ t('Article') }</th>
+                  <th><i className="icon-arrow-right-circle text-success"></i></th>
+                  <th>{ t('Page') }</th>
+                </tr>
+                <tr>
+                  <th>{ t('Tag')}</th>
+                  <th></th>
+                  <th>-</th>
+                </tr>
+                <tr>
+                  <th>{ t('importer_management.Directory_hierarchy_tag') }</th>
+                  <th></th>
+                  <th>(TBD)</th>
+                </tr>
+                <tr>
+                  <th>{ t('User') }</th>
+                  <th></th>
+                  <th>(TBD)</th>
+                </tr>
+              </tbody>
+            </table>
+            <div className="well well-sm mb-0 small">
+              <ul>
+                <li>{ t('importer_management.page_skip') }</li>
+              </ul>
+            </div>
+
+            <div className="form-group">
+              <input type="password" name="dummypass" style={{ display: 'none', top: '-100px', left: '-100px' }} />
+            </div>
+            <div className="form-group">
+              <label htmlFor="settingForm[importer:qiita:team_name]" className="col-xs-3 control-label">
+                { t('importer_management.qiita_settings.team_name') }
+              </label>
+              <div className="col-xs-6">
+                <input className="form-control" type="text" name="qiitaTeamName" value={qiitaTeamName} onChange={this.handleInputValue} />
+              </div>
+            </div>
+
+            <div className="form-group">
+              <label htmlFor="settingForm[importer:qiita:access_token]" className="col-xs-3 control-label">
+                { t('importer_management.qiita_settings.access_token') }
+              </label>
+              <div className="col-xs-6">
+                <input className="form-control" type="password" name="qiitaAccessToken" value={qiitaAccessToken} onChange={this.handleInputValue} />
+              </div>
+            </div>
+
+
+            <div className="form-group">
+              <div className="col-xs-offset-3 col-xs-6">
+                <input
+                  id="testConnectionToQiita"
+                  type="button"
+                  className="btn btn-primary btn-qiita"
+                  name="Qiita"
+                  onClick={this.qiitaHandleSubmit}
+                  value={t('importer_management.import')}
+                />
+                <input type="button" className="btn btn-secondary" onClick={this.qiitaHandleSubmitUpdate} value={t('Update')} />
+                <span className="col-xs-offset-1">
+                  <input
+                    name="Qiita"
+                    type="button"
+                    id="importFromQiita"
+                    className="btn btn-default btn-qiita"
+                    onClick={this.qiitaHandleSubmitTest}
+                    value={t('importer_management.qiita_settings.test_connection')}
+                  />
+                </span>
+
+              </div>
+            </div>
+
+
+          </fieldset>
+
+
+        </form>
       </Fragment>
       </Fragment>
 
 
     );
     );

+ 0 - 2
src/server/form/index.js

@@ -15,8 +15,6 @@ module.exports = {
     siteUrl: require('./admin/siteUrl'),
     siteUrl: require('./admin/siteUrl'),
     mail: require('./admin/mail'),
     mail: require('./admin/mail'),
     aws: require('./admin/aws'),
     aws: require('./admin/aws'),
-    importerEsa: require('./admin/importerEsa'),
-    importerQiita: require('./admin/importerQiita'),
     plugin: require('./admin/plugin'),
     plugin: require('./admin/plugin'),
     securityGeneral: require('./admin/securityGeneral'),
     securityGeneral: require('./admin/securityGeneral'),
     securityPassportLdap: require('./admin/securityPassportLdap'),
     securityPassportLdap: require('./admin/securityPassportLdap'),

+ 47 - 15
src/server/routes/admin.js

@@ -31,6 +31,10 @@ module.exports = function(crowi, app) {
   const MAX_PAGE_LIST = 50;
   const MAX_PAGE_LIST = 50;
   const actions = {};
   const actions = {};
 
 
+  const { check } = require('express-validator/check');
+
+  const api = {};
+
   function createPager(total, limit, page, pagesCount, maxPageList) {
   function createPager(total, limit, page, pagesCount, maxPageList) {
     const pager = {
     const pager = {
       page,
       page,
@@ -807,14 +811,34 @@ module.exports = function(crowi, app) {
 
 
   // Importer management
   // Importer management
   actions.importer = {};
   actions.importer = {};
+  actions.importer.api = api;
+  api.validators = {};
+  api.validators.importer = {};
+
   actions.importer.index = function(req, res) {
   actions.importer.index = function(req, res) {
     const settingForm = configManager.getConfigByPrefix('crowi', 'importer:');
     const settingForm = configManager.getConfigByPrefix('crowi', 'importer:');
-
     return res.render('admin/importer', {
     return res.render('admin/importer', {
       settingForm,
       settingForm,
     });
     });
   };
   };
 
 
+  api.validators.importer.esa = function() {
+    const validator = [
+      check('importer:esa:team_name').not().isEmpty().withMessage('Error. Empty esa:team_name'),
+      check('importer:esa:access_token').not().isEmpty().withMessage('Error. Empty esa:access_token'),
+    ];
+    return validator;
+  };
+
+  api.validators.importer.qiita = function() {
+    const validator = [
+      check('importer:qiita:team_name').not().isEmpty().withMessage('Error. Empty qiita:team_name'),
+      check('importer:qiita:access_token').not().isEmpty().withMessage('Error. Empty qiita:access_token'),
+    ];
+    return validator;
+  };
+
+
   actions.api = {};
   actions.api = {};
   actions.api.appSetting = async function(req, res) {
   actions.api.appSetting = async function(req, res) {
     const form = req.form.settingForm;
     const form = req.form.settingForm;
@@ -1170,10 +1194,15 @@ module.exports = function(crowi, app) {
   actions.api.importerSettingEsa = async(req, res) => {
   actions.api.importerSettingEsa = async(req, res) => {
     const form = req.body;
     const form = req.body;
 
 
+    const { validationResult } = require('express-validator');
+    const errors = validationResult(req);
+    if (!errors.isEmpty()) {
+      return res.json(ApiResponse.error('esa.io form is blank'));
+    }
+
     await configManager.updateConfigsInTheSameNamespace('crowi', form);
     await configManager.updateConfigsInTheSameNamespace('crowi', form);
     importer.initializeEsaClient(); // let it run in the back aftert res
     importer.initializeEsaClient(); // let it run in the back aftert res
-
-    return res.json({ status: true });
+    return res.json(ApiResponse.success());
   };
   };
 
 
   /**
   /**
@@ -1183,16 +1212,19 @@ module.exports = function(crowi, app) {
    * @param {*} res
    * @param {*} res
    */
    */
   actions.api.importerSettingQiita = async(req, res) => {
   actions.api.importerSettingQiita = async(req, res) => {
-    const form = req.form.settingForm;
+    const form = req.body;
 
 
-    if (!req.form.isValid) {
-      return res.json({ status: false, message: req.form.errors.join('\n') });
+    const { validationResult } = require('express-validator');
+    const errors = validationResult(req);
+    if (!errors.isEmpty()) {
+      console.log('validator', errors);
+      return res.json(ApiResponse.error('Qiita form is blank'));
     }
     }
 
 
     await configManager.updateConfigsInTheSameNamespace('crowi', form);
     await configManager.updateConfigsInTheSameNamespace('crowi', form);
     importer.initializeQiitaClient(); // let it run in the back aftert res
     importer.initializeQiitaClient(); // let it run in the back aftert res
 
 
-    return res.json({ status: true });
+    return res.json(ApiResponse.success());
   };
   };
 
 
   /**
   /**
@@ -1213,9 +1245,9 @@ module.exports = function(crowi, app) {
     }
     }
 
 
     if (errors.length > 0) {
     if (errors.length > 0) {
-      return res.json({ status: false, message: `<br> - ${errors.join('<br> - ')}` });
+      return res.json(ApiResponse.error(`<br> - ${errors.join('<br> - ')}`));
     }
     }
-    return res.json({ status: true });
+    return res.json(ApiResponse.success());
   };
   };
 
 
   /**
   /**
@@ -1236,9 +1268,9 @@ module.exports = function(crowi, app) {
     }
     }
 
 
     if (errors.length > 0) {
     if (errors.length > 0) {
-      return res.json({ status: false, message: `<br> - ${errors.join('<br> - ')}` });
+      return res.json(ApiResponse.error(`<br> - ${errors.join('<br> - ')}`));
     }
     }
-    return res.json({ status: true });
+    return res.json(ApiResponse.success());
   };
   };
 
 
   /**
   /**
@@ -1250,10 +1282,10 @@ module.exports = function(crowi, app) {
   actions.api.testEsaAPI = async(req, res) => {
   actions.api.testEsaAPI = async(req, res) => {
     try {
     try {
       await importer.testConnectionToEsa();
       await importer.testConnectionToEsa();
-      return res.json({ status: true });
+      return res.json(ApiResponse.success());
     }
     }
     catch (err) {
     catch (err) {
-      return res.json({ status: false, message: `${err}` });
+      return res.json(ApiResponse.error(err));
     }
     }
   };
   };
 
 
@@ -1266,10 +1298,10 @@ module.exports = function(crowi, app) {
   actions.api.testQiitaAPI = async(req, res) => {
   actions.api.testQiitaAPI = async(req, res) => {
     try {
     try {
       await importer.testConnectionToQiita();
       await importer.testConnectionToQiita();
-      return res.json({ status: true });
+      return res.json(ApiResponse.success());
     }
     }
     catch (err) {
     catch (err) {
-      return res.json({ status: false, message: `${err}` });
+      return res.json(ApiResponse.error(err));
     }
     }
   };
   };
 
 

+ 0 - 2
src/server/routes/comment.js

@@ -89,8 +89,6 @@ module.exports = function(crowi, app) {
 
 
     const errors = validationResult(req.body);
     const errors = validationResult(req.body);
     if (!errors.isEmpty()) {
     if (!errors.isEmpty()) {
-      // return res.json(ApiResponse.error('Invalid comment.'));
-      // return res.status(422).json({ errors: errors.array() });
       return res.json(ApiResponse.error('コメントを入力してください。'));
       return res.json(ApiResponse.error('コメントを入力してください。'));
     }
     }
 
 

+ 4 - 4
src/server/routes/index.js

@@ -142,12 +142,12 @@ module.exports = function(crowi, app) {
 
 
   // importer management for admin
   // importer management for admin
   app.get('/admin/importer'                , loginRequired() , adminRequired , admin.importer.index);
   app.get('/admin/importer'                , loginRequired() , adminRequired , admin.importer.index);
-  app.post('/_api/admin/settings/importerEsa' , loginRequired() , adminRequired , csrf , form.admin.importerEsa , admin.api.importerSettingEsa);
-  app.post('/_api/admin/settings/importerQiita' , loginRequired() , adminRequired , csrf , form.admin.importerQiita , admin.api.importerSettingQiita);
+  app.post('/_api/admin/settings/importerEsa' ,  loginRequired() , adminRequired , csrf, admin.importer.api.validators.importer.esa(),admin.api.importerSettingEsa);
+  app.post('/_api/admin/settings/importerQiita' ,loginRequired() , adminRequired , csrf , admin.importer.api.validators.importer.qiita(), admin.api.importerSettingQiita);
   app.post('/_api/admin/import/esa'        , loginRequired() , adminRequired , admin.api.importDataFromEsa);
   app.post('/_api/admin/import/esa'        , loginRequired() , adminRequired , admin.api.importDataFromEsa);
-  app.post('/_api/admin/import/testEsaAPI' , loginRequired() , adminRequired , csrf , form.admin.importerEsa , admin.api.testEsaAPI);
+  app.post('/_api/admin/import/testEsaAPI' , loginRequired() , adminRequired , csrf, admin.api.testEsaAPI);
   app.post('/_api/admin/import/qiita'        , loginRequired() , adminRequired , admin.api.importDataFromQiita);
   app.post('/_api/admin/import/qiita'        , loginRequired() , adminRequired , admin.api.importDataFromQiita);
-  app.post('/_api/admin/import/testQiitaAPI' , loginRequired() , adminRequired , csrf , form.admin.importerQiita , admin.api.testQiitaAPI);
+  app.post('/_api/admin/import/testQiitaAPI' , loginRequired() , adminRequired , csrf, admin.api.testQiitaAPI);
 
 
   app.get('/me'                       , loginRequired() , me.index);
   app.get('/me'                       , loginRequired() , me.index);
   app.get('/me/password'              , loginRequired() , me.password);
   app.get('/me/password'              , loginRequired() , me.password);