فهرست منبع

Merge pull request #10584 from growilabs/support/omit-esa-and-qiita-importers

support: Omit importers for esa.io and Qiita
Yuki Takei 3 ماه پیش
والد
کامیت
12664ece4a

+ 0 - 1
apps/app/package.json

@@ -127,7 +127,6 @@
     "diff_match_patch": "^0.1.1",
     "dotenv-flow": "^3.2.0",
     "ejs": "^3.1.10",
-    "esa-node": "^0.2.2",
     "escape-string-regexp": "^4.0.0",
     "expose-gc": "^1.0.0",
     "express": "^4.20.0",

+ 2 - 20
apps/app/public/static/locales/en_US/admin.json

@@ -531,7 +531,7 @@
     "page_path": "Page Path",
     "beta_warning": "This function is Beta.",
     "import_from": "Import from {{from}}",
-    "import_growi_archive": "Import GROWI archive",
+    "import_growi_archive": "Import Archive Data",
     "error": {
       "only_upsert_available": "Only 'Upsert' option is available for pages collection."
     },
@@ -577,23 +577,11 @@
         }
       }
     },
-    "esa_settings": {
-      "team_name": "Team name",
-      "access_token": "Access token",
-      "test_connection": "Test connection to esa"
-    },
-    "qiita_settings": {
-      "team_name": "Team name",
-      "access_token": "Access token",
-      "test_connection": "Test connection to qiita:team"
-    },
     "import": "Import",
     "skip_username_and_email_when_overlapped": "Skip username and email using same username and email in new environment",
     "prepare_new_account_for_migration": "Prepare new account for migration",
     "archive_data_import_detail": "More Details? Ckick here.",
-    "admin_archive_data_import_guide_url": "https://docs.growi.org/en/admin-guide/management-cookbook/import.html",
-    "page_skip": "Pages with a name that already exists on GROWI are not imported",
-    "Directory_hierarchy_tag": "Directory hierarchy tag"
+    "admin_archive_data_import_guide_url": "https://docs.growi.org/en/admin-guide/management-cookbook/import.html"
   },
   "export_management": {
     "export_archive_data": "Export Archive Data",
@@ -1015,12 +1003,6 @@
     "ADMIN_ARCHIVE_DATA_UPLOAD": "Upload Archived Data",
     "ADMIN_GROWI_DATA_IMPORTED": "Import Archived Data",
     "ADMIN_UPLOADED_GROWI_DATA_DISCARDED": "Discard Archived Data",
-    "ADMIN_ESA_DATA_IMPORTED": "Import from esa.io",
-    "ADMIN_ESA_DATA_UPDATED": "Update esa.io import settings",
-    "ADMIN_CONNECTION_TEST_OF_ESA_DATA": "Test connection to esa",
-    "ADMIN_QIITA_DATA_IMPORTED": "Import from Qiita:Team",
-    "ADMIN_QIITA_DATA_UPDATED": "Update Qiita:Team import settings",
-    "ADMIN_CONNECTION_TEST_OF_QIITA_DATA": "Test connection to Qiita:Team",
     "ADMIN_ARCHIVE_DATA_CREATE": "Create Archived Data",
     "ADMIN_ARCHIVE_DATA_DOWNLOAD": "Download Archive Data",
     "ADMIN_ARCHIVE_DATA_DELETE": "Delete Archive Data",

+ 2 - 20
apps/app/public/static/locales/fr_FR/admin.json

@@ -531,7 +531,7 @@
     "page_path": "Chemin de page",
     "beta_warning": "Cette fonctionnalité est en beta.",
     "import_from": "Importer depuis {{from}}",
-    "import_growi_archive": "Importer une archive GROWI",
+    "import_growi_archive": "Importer les données d'archive",
     "error": {
       "only_upsert_available": "Seul l'option 'Upsert' est disponible pour les collections de pages"
     },
@@ -577,23 +577,11 @@
         }
       }
     },
-    "esa_settings": {
-      "team_name": "Nom de l'équipe",
-      "access_token": "Jeton d'accès",
-      "test_connection": "Essai de la connection esa"
-    },
-    "qiita_settings": {
-      "team_name": "Nom de l'équipe",
-      "access_token": "Jeton d'accès",
-      "test_connection": "Essai de la connection qiita:team"
-    },
     "import": "Importer",
     "skip_username_and_email_when_overlapped": "Passe le nom et adresse courriel exactes dans le nouvel environnement",
     "prepare_new_account_for_migration": "Préparer le compte pour la migration",
     "archive_data_import_detail": "En savoir plus",
-    "admin_archive_data_import_guide_url": "https://docs.growi.org/en/admin-guide/management-cookbook/import.html",
-    "page_skip": "Les pages ayant le nom d'une page déjà existante ne seront pas importées.",
-    "Directory_hierarchy_tag": "Tag de hiérarchie"
+    "admin_archive_data_import_guide_url": "https://docs.growi.org/en/admin-guide/management-cookbook/import.html"
   },
   "export_management": {
     "export_archive_data": "Archive de données d'export",
@@ -1014,12 +1002,6 @@
     "ADMIN_ARCHIVE_DATA_UPLOAD": "Téléverser les données d'archive",
     "ADMIN_GROWI_DATA_IMPORTED": "Importer les données d'archive",
     "ADMIN_UPLOADED_GROWI_DATA_DISCARDED": "Supprimer les données d'archive",
-    "ADMIN_ESA_DATA_IMPORTED": "Importer depuis esa.io",
-    "ADMIN_ESA_DATA_UPDATED": "Mettre à jour les paramètres d'import esa.io",
-    "ADMIN_CONNECTION_TEST_OF_ESA_DATA": "Tester la connexion esa",
-    "ADMIN_QIITA_DATA_IMPORTED": "Importer depuis Qiita:Team",
-    "ADMIN_QIITA_DATA_UPDATED": "Mettre à jour les paramètres d'import Qiita:Team",
-    "ADMIN_CONNECTION_TEST_OF_QIITA_DATA": "Tester la connexion Qiita:Team",
     "ADMIN_ARCHIVE_DATA_CREATE": "Créer données d'archive",
     "ADMIN_ARCHIVE_DATA_DOWNLOAD": "Télécharger les données d'archive",
     "ADMIN_ARCHIVE_DATA_DELETE": "Supprimer les données d'archive",

+ 2 - 21
apps/app/public/static/locales/ja_JP/admin.json

@@ -540,7 +540,7 @@
     "page_path": "ページパス",
     "beta_warning": "この機能はベータ版です",
     "import_from": "{{from}} からインポート",
-    "import_growi_archive": "GROWI アーカイブをインポート",
+    "import_growi_archive": "データインポート",
     "error": {
       "only_upsert_available": "pages コレクションには 'Upsert' オプションのみ対応しています"
     },
@@ -586,23 +586,11 @@
         }
       }
     },
-    "esa_settings": {
-      "team_name": "チーム名",
-      "access_token": "アクセストークン",
-      "test_connection": "接続テスト"
-    },
-    "qiita_settings": {
-      "team_name": "チーム名",
-      "access_token": "アクセストークン",
-      "test_connection": "接続テスト"
-    },
     "import": "インポート",
     "skip_username_and_email_when_overlapped": "ユーザー名またはメールアドレスが同じ場合、その部分がスキップされます。",
     "prepare_new_account_for_migration": "移行用のアカウントを新環境で用意してください。",
     "archive_data_import_detail": "参考: GROWI Docs - データのインポート",
-    "admin_archive_data_import_guide_url": "https://docs.growi.org/ja/admin-guide/management-cookbook/import.html#growi-%E3%82%A2%E3%83%BC%E3%82%AB%E3%82%A4%E3%83%96%E3%83%87%E3%83%BC%E3%82%BF%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88",
-    "page_skip": "既に GROWI 側に同名のページが存在する場合、そのページはスキップされます",
-    "Directory_hierarchy_tag": "ディレクトリ階層タグ"
+    "admin_archive_data_import_guide_url": "https://docs.growi.org/ja/admin-guide/management-cookbook/import.html#growi-%E3%82%A2%E3%83%BC%E3%82%AB%E3%82%A4%E3%83%96%E3%83%87%E3%83%BC%E3%82%BF%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88"
   },
   "export_management": {
     "export_archive_data": "データアーカイブ",
@@ -811,7 +799,6 @@
       "inactive": "非アクティブ"
     }
   },
-
   "user_group_management": {
     "user_group_management": "グループ管理",
     "create_group": "新規グループの作成",
@@ -1025,12 +1012,6 @@
     "ADMIN_ARCHIVE_DATA_UPLOAD": "アーカイブデータのアップロード",
     "ADMIN_GROWI_DATA_IMPORTED": "アーカイブデータのインポート",
     "ADMIN_UPLOADED_GROWI_DATA_DISCARDED": "アーカイブデータの破棄",
-    "ADMIN_ESA_DATA_IMPORTED": "esa.io からインポート",
-    "ADMIN_ESA_DATA_UPDATED": "esa.io のインポート設定の更新",
-    "ADMIN_CONNECTION_TEST_OF_ESA_DATA": "esa.io の接続テスト",
-    "ADMIN_QIITA_DATA_IMPORTED": "Qiita:Team からのインポート",
-    "ADMIN_QIITA_DATA_UPDATED": "Qiita:Team のインポート設定の更新",
-    "ADMIN_CONNECTION_TEST_OF_QIITA_DATA": "Qiita:Team の接続テスト",
     "ADMIN_ARCHIVE_DATA_CREATE": "アーカイブデータの作成",
     "ADMIN_ARCHIVE_DATA_DOWNLOAD": "アーカイブデータのダウンロード",
     "ADMIN_ARCHIVE_DATA_DELETE": "アーカイブデータの削除",

+ 2 - 20
apps/app/public/static/locales/ko_KR/admin.json

@@ -531,7 +531,7 @@
     "page_path": "페이지 경로",
     "beta_warning": "이 기능은 베타입니다.",
     "import_from": "{{from}}에서 가져오기",
-    "import_growi_archive": "GROWI 아카이브 가져오기",
+    "import_growi_archive": "아카이브 데이터 가져오기",
     "error": {
       "only_upsert_available": "페이지 컬렉션에는 'Upsert' 옵션만 사용할 수 있습니다."
     },
@@ -577,23 +577,11 @@
         }
       }
     },
-    "esa_settings": {
-      "team_name": "팀 이름",
-      "access_token": "액세스 토큰",
-      "test_connection": "esa 연결 테스트"
-    },
-    "qiita_settings": {
-      "team_name": "팀 이름",
-      "access_token": "액세스 토큰",
-      "test_connection": "qiita:team 연결 테스트"
-    },
     "import": "가져오기",
     "skip_username_and_email_when_overlapped": "새 환경에서 동일한 사용자 이름과 이메일을 사용하는 경우 사용자 이름과 이메일 건너뛰기",
     "prepare_new_account_for_migration": "마이그레이션을 위한 새 계정 준비",
     "archive_data_import_detail": "자세한 내용은 여기를 클릭하십시오.",
-    "admin_archive_data_import_guide_url": "https://docs.growi.org/en/admin-guide/management-cookbook/import.html",
-    "page_skip": "GROWI에 이미 존재하는 이름의 페이지는 가져오지 않습니다.",
-    "Directory_hierarchy_tag": "디렉토리 계층 태그"
+    "admin_archive_data_import_guide_url": "https://docs.growi.org/en/admin-guide/management-cookbook/import.html"
   },
   "export_management": {
     "export_archive_data": "아카이브 데이터 내보내기",
@@ -1015,12 +1003,6 @@
     "ADMIN_ARCHIVE_DATA_UPLOAD": "아카이브 데이터 업로드",
     "ADMIN_GROWI_DATA_IMPORTED": "아카이브 데이터 가져오기",
     "ADMIN_UPLOADED_GROWI_DATA_DISCARDED": "업로드된 GROWI 데이터 버리기",
-    "ADMIN_ESA_DATA_IMPORTED": "esa.io에서 가져오기",
-    "ADMIN_ESA_DATA_UPDATED": "esa.io 가져오기 설정 업데이트",
-    "ADMIN_CONNECTION_TEST_OF_ESA_DATA": "esa 연결 테스트",
-    "ADMIN_QIITA_DATA_IMPORTED": "Qiita:Team에서 가져오기",
-    "ADMIN_QIITA_DATA_UPDATED": "Qiita:Team 가져오기 설정 업데이트",
-    "ADMIN_CONNECTION_TEST_OF_QIITA_DATA": "Qiita:Team 연결 테스트",
     "ADMIN_ARCHIVE_DATA_CREATE": "아카이브 데이터 생성",
     "ADMIN_ARCHIVE_DATA_DOWNLOAD": "아카이브 데이터 다운로드",
     "ADMIN_ARCHIVE_DATA_DELETE": "아카이브 데이터 삭제",

+ 2 - 20
apps/app/public/static/locales/zh_CN/admin.json

@@ -540,7 +540,7 @@
     "page_path": "相对路径",
     "beta_warning": "这个函数是Beta。",
     "import_from": "Import from {{from}}",
-    "import_growi_archive": "Import GROWI archive",
+    "import_archive_data": "导入存档数据",
     "error": {
       "only_upsert_available": "Only 'Upsert' option is available for pages collection."
     },
@@ -586,23 +586,11 @@
         }
       }
     },
-    "esa_settings": {
-      "team_name": "Team name",
-      "access_token": "Access token",
-      "test_connection": "Test connection to esa"
-    },
-    "qiita_settings": {
-      "team_name": "Team name",
-      "access_token": "Access token",
-      "test_connection": "Test connection to qiita:team"
-    },
     "import": "Import",
     "skip_username_and_email_when_overlapped": "Skip username and email using same username and email in new environment",
     "prepare_new_account_for_migration": "Prepare new account for migration",
     "archive_data_import_detail": "More details? Click here.",
-    "admin_archive_data_import_guide_url": "https://docs.growi.org/en/admin-guide/management-cookbook/import.html",
-    "page_skip": "Pages with a name that already exists on GROWI are not imported",
-    "Directory_hierarchy_tag": "Directory hierarchy tag"
+    "admin_archive_data_import_guide_url": "https://docs.growi.org/en/admin-guide/management-cookbook/import.html"
   },
   "export_management": {
     "export_archive_data": "导出主题数据",
@@ -1024,12 +1012,6 @@
     "ADMIN_ARCHIVE_DATA_UPLOAD": "上传存档数据",
     "ADMIN_GROWI_DATA_IMPORTED": "导入存档数据",
     "ADMIN_UPLOADED_GROWI_DATA_DISCARDED": "丢弃存档数据",
-    "ADMIN_ESA_DATA_IMPORTED": "从 esa.io 导入",
-    "ADMIN_ESA_DATA_UPDATED": "更新 esa.io 导入设置",
-    "ADMIN_CONNECTION_TEST_OF_ESA_DATA": "测试与 esa 的连接",
-    "ADMIN_QIITA_DATA_IMPORTED": "从 Qiita:Team 导入",
-    "ADMIN_QIITA_DATA_UPDATED": "更新 Qiita:团队导入设置",
-    "ADMIN_CONNECTION_TEST_OF_QIITA_DATA": "测试与 Qiita:Team 的连接",
     "ADMIN_ARCHIVE_DATA_CREATE": "创建归档数据",
     "ADMIN_ARCHIVE_DATA_DOWNLOAD": "下载存档数据",
     "ADMIN_ARCHIVE_DATA_DELETE": "删除存档数据",

+ 2 - 264
apps/app/src/client/components/Admin/ImportData/ImportDataPageContents.jsx

@@ -1,280 +1,18 @@
-import React, { useEffect } from 'react';
-
-import { useTranslation } from 'next-i18next';
-import PropTypes from 'prop-types';
-import { useForm } from 'react-hook-form';
-
-import AdminImportContainer from '~/client/services/AdminImportContainer';
-import { toastError } from '~/client/util/toastr';
-import { toArrayIfNot } from '~/utils/array-utils';
-import loggerFactory from '~/utils/logger';
-
 import { withUnstatedContainers } from '../../UnstatedUtils';
 
 import GrowiArchiveSection from './GrowiArchiveSection';
 
-const logger = loggerFactory('growi:importer');
-
-const ImportDataPageContents = ({ t, adminImportContainer }) => {
-  const { register: registerEsa, reset: resetEsa, handleSubmit: handleSubmitEsa } = useForm();
-  const { register: registerQiita, reset: resetQiita, handleSubmit: handleSubmitQiita } = useForm();
-
-  useEffect(() => {
-    resetEsa({
-      esaTeamName: adminImportContainer.state.esaTeamName || '',
-      esaAccessToken: adminImportContainer.state.esaAccessToken || '',
-    });
-  }, [resetEsa, adminImportContainer.state.esaTeamName, adminImportContainer.state.esaAccessToken]);
-
-  useEffect(() => {
-    resetQiita({
-      qiitaTeamName: adminImportContainer.state.qiitaTeamName || '',
-      qiitaAccessToken: adminImportContainer.state.qiitaAccessToken || '',
-    });
-  }, [resetQiita, adminImportContainer.state.qiitaTeamName, adminImportContainer.state.qiitaAccessToken]);
-
+const ImportDataPageContents = () => {
   return (
     <div data-testid="admin-import-data">
       <GrowiArchiveSection />
-
-      <form
-        className="mt-5"
-        id="importerSettingFormEsa"
-        role="form"
-        onSubmit={handleSubmitEsa(adminImportContainer.esaHandleSubmitUpdate)}
-      >
-        <fieldset>
-          <h2 className="admin-setting-header">{t('importer_management.import_from', { from: 'esa.io' })}</h2>
-          <table className="table table-bordered table-mapping">
-            <thead>
-              <tr>
-                <th width="45%">esa.io</th>
-                <th width="10%"></th>
-                <th>GROWI</th>
-              </tr>
-            </thead>
-            <tbody>
-              <tr>
-                <th>{t('importer_management.article')}</th>
-                <th><span className="material-symbols-outlined text-success">arrow_circle_right</span></th>
-                <th>{t('importer_management.page')}</th>
-              </tr>
-              <tr>
-                <th>{t('importer_management.category')}</th>
-                <th><span className="material-symbols-outlined text-success">arrow_circle_right</span></th>
-                <th>{t('importer_management.page_path')}</th>
-              </tr>
-              <tr>
-                <th>{t('User')}</th>
-                <th></th>
-                <th>(TBD)</th>
-              </tr>
-            </tbody>
-          </table>
-
-          <div className="card custom-card bg-body-tertiary mb-0 small">
-            <ul>
-              <li>{t('importer_management.page_skip')}</li>
-            </ul>
-          </div>
-
-          <div className="row mt-4">
-            <input type="password" name="dummypass" style={{ display: 'none', top: '-100px', left: '-100px' }} />
-          </div>
-
-          <div className="row">
-            <label htmlFor="settingForm[importer:esa:team_name]" className="text-start text-md-end col-md-3 col-form-label">
-              {t('importer_management.esa_settings.team_name')}
-            </label>
-            <div className="col-md-6">
-              <input
-                className="form-control"
-                type="text"
-                {...registerEsa('esaTeamName')}
-              />
-            </div>
-
-          </div>
-
-          <div className="row mt-3">
-            <label htmlFor="settingForm[importer:esa:access_token]" className="text-start text-md-end col-md-3 col-form-label">
-              {t('importer_management.esa_settings.access_token')}
-            </label>
-            <div className="col-md-6">
-              <input
-                className="form-control"
-                type="password"
-                {...registerEsa('esaAccessToken')}
-              />
-            </div>
-          </div>
-
-          <div className="row mt-3">
-            <div className="offset-md-3 col-md-6">
-              <input
-                id="testConnectionToEsa"
-                type="button"
-                className="btn btn-primary btn-esa me-3"
-                name="Esa"
-                onClick={adminImportContainer.esaHandleSubmit}
-                value={t('importer_management.import')}
-              />
-              <input type="submit" className="btn btn-secondary" value={t('Update')} />
-              <span className="offset-0 offset-sm-1">
-                <input
-                  id="importFromEsa"
-                  type="button"
-                  name="Esa"
-                  className="btn btn-secondary btn-esa"
-                  onClick={adminImportContainer.esaHandleSubmitTest}
-                  value={t('importer_management.esa_settings.test_connection')}
-                />
-              </span>
-            </div>
-          </div>
-        </fieldset>
-      </form>
-
-      <form
-        className="mt-5"
-        id="importerSettingFormQiita"
-        role="form"
-        onSubmit={handleSubmitQiita(adminImportContainer.qiitaHandleSubmitUpdate)}
-      >
-        <fieldset>
-          <h2 className="admin-setting-header">{t('importer_management.import_from', { from: 'Qiita:Team' })}</h2>
-          <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('importer_management.article')}</th>
-                <th><span className="material-symbols-outlined">arrow_circle_right</span></th>
-                <th>{t('importer_management.page')}</th>
-              </tr>
-              <tr>
-                <th>{t('importer_management.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="card custom-card bg-body-tertiary mb-3 small">
-            <ul>
-              <li>{t('importer_management.page_skip')}</li>
-            </ul>
-          </div>
-
-          <div className="row mt-3">
-            <input type="password" name="dummypass" style={{ display: 'none', top: '-100px', left: '-100px' }} />
-          </div>
-          <div className="row mt-3">
-            <label htmlFor="settingForm[importer:qiita:team_name]" className="text-start text-md-end col-md-3 col-form-label">
-              {t('importer_management.qiita_settings.team_name')}
-            </label>
-            <div className="col-md-6">
-              <input
-                className="form-control"
-                type="text"
-                {...registerQiita('qiitaTeamName')}
-              />
-            </div>
-          </div>
-
-          <div className="row mt-3">
-            <label htmlFor="settingForm[importer:qiita:access_token]" className="text-start text-md-end col-md-3 col-form-label">
-              {t('importer_management.qiita_settings.access_token')}
-            </label>
-            <div className="col-md-6">
-              <input
-                className="form-control"
-                type="password"
-                {...registerQiita('qiitaAccessToken')}
-              />
-            </div>
-          </div>
-
-
-          <div className="row mt-3">
-            <div className="offset-md-3 col-md-6">
-              <input
-                id="testConnectionToQiita"
-                type="button"
-                className="btn btn-primary btn-qiita me-3"
-                name="Qiita"
-                onClick={adminImportContainer.qiitaHandleSubmit}
-                value={t('importer_management.import')}
-              />
-              <input type="submit" className="btn btn-secondary" value={t('Update')} />
-              <span className="offset-0 offset-sm-1">
-                <input
-                  name="Qiita"
-                  type="button"
-                  id="importFromQiita"
-                  className="btn btn-secondary btn-qiita"
-                  onClick={adminImportContainer.qiitaHandleSubmitTest}
-                  value={t('importer_management.qiita_settings.test_connection')}
-                />
-              </span>
-
-            </div>
-          </div>
-
-
-        </fieldset>
-
-
-      </form>
     </div>
   );
 };
 
-ImportDataPageContents.propTypes = {
-  t: PropTypes.func.isRequired,
-  adminImportContainer: PropTypes.instanceOf(AdminImportContainer).isRequired,
-};
-
-const ImportDataPageContentsWrapperFc = (props) => {
-  const { t } = useTranslation('admin');
-
-  const { adminImportContainer } = props;
-
-  useEffect(() => {
-    const fetchImportSettingsData = async() => {
-      await adminImportContainer.retrieveImportSettingsData();
-    };
-
-    try {
-      fetchImportSettingsData();
-    }
-    catch (err) {
-      const errs = toArrayIfNot(err);
-      toastError(errs);
-      logger.error(errs);
-    }
-  }, [adminImportContainer]);
-
-  return <ImportDataPageContents t={t} {...props} />;
-};
-
 /**
  * Wrapper component for using unstated
  */
-const ImportDataPageContentsWrapper = withUnstatedContainers(ImportDataPageContentsWrapperFc, [AdminImportContainer]);
+const ImportDataPageContentsWrapper = withUnstatedContainers(ImportDataPageContents, []);
 
 export default ImportDataPageContentsWrapper;

+ 0 - 117
apps/app/src/client/services/AdminImportContainer.js

@@ -1,14 +1,6 @@
 import { isServer } from '@growi/core/dist/utils';
 import { Container } from 'unstated';
 
-import loggerFactory from '~/utils/logger';
-
-import { apiPost } from '../util/apiv1-client';
-import { apiv3Get } from '../util/apiv3-client';
-import { toastSuccess, toastError } from '../util/toastr';
-
-const logger = loggerFactory('growi:appSettings');
-
 /**
  * Service container for admin app setting page (AppSettings.jsx)
  * @extends {Container} unstated Container
@@ -26,19 +18,7 @@ export default class AdminImportContainer extends Container {
 
     this.state = {
       retrieveError: null,
-      esaTeamName: '',
-      esaAccessToken: '',
-      qiitaTeamName: '',
-      qiitaAccessToken: '',
     };
-
-    this.esaHandleSubmit = this.esaHandleSubmit.bind(this);
-    this.esaHandleSubmitTest = this.esaHandleSubmitTest.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);
   }
 
   /**
@@ -48,101 +28,4 @@ export default class AdminImportContainer extends Container {
     return 'AdminImportContainer';
   }
 
-  /**
-   * retrieve app sttings data
-   */
-  async retrieveImportSettingsData() {
-    const response = await apiv3Get('/import/');
-    const {
-      importSettingsParams,
-    } = response.data;
-
-    this.setState({
-      esaTeamName: importSettingsParams.esaTeamName,
-      esaAccessToken: importSettingsParams.esaAccessToken,
-      qiitaTeamName: importSettingsParams.qiitaTeamName,
-      qiitaAccessToken: importSettingsParams.qiitaAccessToken,
-    });
-  }
-
-  handleInputValue(event) {
-    this.setState({
-      [event.target.name]: event.target.value,
-    });
-  }
-
-  async esaHandleSubmit() {
-    try {
-      await apiPost('/admin/import/esa');
-      toastSuccess('Import posts from esa success.');
-    }
-    catch (err) {
-      logger.error(err);
-      toastError(err);
-    }
-  }
-
-  async esaHandleSubmitTest() {
-    try {
-      await apiPost('/admin/import/testEsaAPI');
-      toastSuccess('Test connection to esa success.');
-    }
-    catch (error) {
-      toastError(error);
-    }
-  }
-
-  async esaHandleSubmitUpdate(formData) {
-    const params = {
-      'importer:esa:team_name': formData.esaTeamName,
-      'importer:esa:access_token': formData.esaAccessToken,
-    };
-    try {
-      await apiPost('/admin/settings/importerEsa', params);
-      toastSuccess('Updated');
-    }
-    catch (err) {
-      logger.error(err);
-      toastError(err);
-    }
-  }
-
-  async qiitaHandleSubmit() {
-    try {
-      await apiPost('/admin/import/qiita');
-      toastSuccess('Import posts from qiita:team success.');
-    }
-    catch (err) {
-      logger.error(err);
-      toastError(err);
-    }
-  }
-
-
-  async qiitaHandleSubmitTest() {
-    try {
-      await apiPost('/admin/import/testQiitaAPI');
-      toastSuccess('Test connection to qiita:team success.');
-    }
-    catch (err) {
-      logger.error(err);
-      toastError(err);
-    }
-  }
-
-  async qiitaHandleSubmitUpdate(formData) {
-    const params = {
-      'importer:qiita:team_name': formData.qiitaTeamName,
-      'importer:qiita:access_token': formData.qiitaAccessToken,
-    };
-    try {
-      await apiPost('/admin/settings/importerQiita', params);
-      toastSuccess('Updated');
-    }
-    catch (err) {
-      logger.error(err);
-      toastError(err);
-    }
-  }
-
 }

+ 0 - 20
apps/app/src/interfaces/activity.ts

@@ -136,14 +136,6 @@ const ACTION_ADMIN_ARCHIVE_DATA_UPLOAD = 'ADMIN_ARCHIVE_DATA_UPLOAD';
 const ACTION_ADMIN_GROWI_DATA_IMPORTED = 'ADMIN_GROWI_DATA_IMPORTED';
 const ACTION_ADMIN_UPLOADED_GROWI_DATA_DISCARDED =
   'ADMIN_UPLOADED_GROWI_DATA_DISCARDED';
-const ACTION_ADMIN_ESA_DATA_IMPORTED = 'ADMIN_ESA_DATA_IMPORTED';
-const ACTION_ADMIN_ESA_DATA_UPDATED = 'ADMIN_ESA_DATA_UPDATED';
-const ACTION_ADMIN_CONNECTION_TEST_OF_ESA_DATA =
-  'ADMIN_CONNECTION_TEST_OF_ESA_DATA';
-const ACTION_ADMIN_QIITA_DATA_IMPORTED = 'ADMIN_QIITA_DATA_IMPORTED';
-const ACTION_ADMIN_QIITA_DATA_UPDATED = 'ADMIN_QIITA_DATA_UPDATED';
-const ACTION_ADMIN_CONNECTION_TEST_OF_QIITA_DATA =
-  'ADMIN_CONNECTION_TEST_OF_QIITA_DATA';
 const ACTION_ADMIN_ARCHIVE_DATA_CREATE = 'ADMIN_ARCHIVE_DATA_CREATE';
 const ACTION_ADMIN_ARCHIVE_DATA_DOWNLOAD = 'ADMIN_ARCHIVE_DATA_DOWNLOAD';
 const ACTION_ADMIN_ARCHIVE_DATA_DELETE = 'ADMIN_ARCHIVE_DATA_DELETE';
@@ -330,13 +322,7 @@ export const SupportedAction = {
   ACTION_ADMIN_CUSTOM_SCRIPT_UPDATE,
   ACTION_ADMIN_ARCHIVE_DATA_UPLOAD,
   ACTION_ADMIN_GROWI_DATA_IMPORTED,
-  ACTION_ADMIN_ESA_DATA_IMPORTED,
-  ACTION_ADMIN_QIITA_DATA_IMPORTED,
   ACTION_ADMIN_UPLOADED_GROWI_DATA_DISCARDED,
-  ACTION_ADMIN_ESA_DATA_UPDATED,
-  ACTION_ADMIN_CONNECTION_TEST_OF_ESA_DATA,
-  ACTION_ADMIN_QIITA_DATA_UPDATED,
-  ACTION_ADMIN_CONNECTION_TEST_OF_QIITA_DATA,
   ACTION_ADMIN_ARCHIVE_DATA_CREATE,
   ACTION_ADMIN_ARCHIVE_DATA_DOWNLOAD,
   ACTION_ADMIN_ARCHIVE_DATA_DELETE,
@@ -527,13 +513,7 @@ export const LargeActionGroup = {
   ACTION_ADMIN_CUSTOM_SCRIPT_UPDATE,
   ACTION_ADMIN_ARCHIVE_DATA_UPLOAD,
   ACTION_ADMIN_GROWI_DATA_IMPORTED,
-  ACTION_ADMIN_ESA_DATA_IMPORTED,
-  ACTION_ADMIN_QIITA_DATA_IMPORTED,
   ACTION_ADMIN_UPLOADED_GROWI_DATA_DISCARDED,
-  ACTION_ADMIN_ESA_DATA_UPDATED,
-  ACTION_ADMIN_CONNECTION_TEST_OF_ESA_DATA,
-  ACTION_ADMIN_QIITA_DATA_UPDATED,
-  ACTION_ADMIN_CONNECTION_TEST_OF_QIITA_DATA,
   ACTION_ADMIN_ARCHIVE_DATA_CREATE,
   ACTION_ADMIN_ARCHIVE_DATA_DOWNLOAD,
   ACTION_ADMIN_ARCHIVE_DATA_DELETE,

+ 51 - 0
apps/app/src/migrations/20251209120000-remove-esa-qiita-importer-configs.js

@@ -0,0 +1,51 @@
+import mongoose from 'mongoose';
+
+import { Config } from '~/server/models/config';
+import { getMongoUri, mongoOptions } from '~/server/util/mongoose-utils';
+import loggerFactory from '~/utils/logger';
+
+const logger = loggerFactory('growi:migrate:remove-esa-qiita-importer-configs');
+
+module.exports = {
+  async up() {
+    logger.info('Apply migration: Remove esa and qiita importer configs');
+    await mongoose.connect(getMongoUri(), mongoOptions);
+
+    const keysToDelete = [
+      'importer:esa:team_name',
+      'importer:esa:access_token',
+      'importer:qiita:team_name',
+      'importer:qiita:access_token',
+    ];
+
+    // Check if any configs exist before deletion
+    const existingConfigs = await Config.countDocuments({
+      key: {
+        $in: keysToDelete,
+      },
+    });
+
+    if (existingConfigs === 0) {
+      logger.info('No configs to delete - migration not needed');
+      return;
+    }
+
+    logger.info(`Found ${existingConfigs} config(s) to delete`);
+
+    const result = await Config.deleteMany({
+      key: {
+        $in: keysToDelete,
+      },
+    });
+
+    logger.info(
+      `Migration completed: ${result.deletedCount} config(s) deleted`,
+    );
+  },
+
+  async down() {
+    logger.info('Rollback migration: Remove esa and qiita importer configs');
+    // No rollback action - configs are intentionally removed
+    logger.info('No rollback action needed');
+  },
+};

+ 0 - 14
apps/app/src/server/crowi/index.js

@@ -107,9 +107,6 @@ class Crowi {
   /** @type {PassportService} */
   passportService;
 
-  /** @type {import('../service/rest-qiita-API')} */
-  restQiitaAPIService;
-
   /** @type {SearchService} */
   searchService;
 
@@ -205,7 +202,6 @@ Crowi.prototype.init = async function () {
     this.setUpFileUploaderSwitchService(),
     this.setupAttachmentService(),
     this.setUpAcl(),
-    this.setUpRestQiitaAPI(),
     this.setupUserGroupService(),
     this.setupExport(),
     this.setupImport(),
@@ -702,16 +698,6 @@ Crowi.prototype.setupAttachmentService = async function () {
   }
 };
 
-/**
- * setup RestQiitaAPIService
- */
-Crowi.prototype.setUpRestQiitaAPI = async function () {
-  const RestQiitaAPIService = require('../service/rest-qiita-API');
-  if (this.restQiitaAPIService == null) {
-    this.restQiitaAPIService = new RestQiitaAPIService(this);
-  }
-};
-
 Crowi.prototype.setupUserGroupService = async function () {
   if (this.userGroupService == null) {
     this.userGroupService = new UserGroupService(this);

+ 2 - 189
apps/app/src/server/routes/admin.js

@@ -1,7 +1,6 @@
 import { SupportedAction } from '~/interfaces/activity';
 import loggerFactory from '~/utils/logger';
 
-import { configManager } from '../service/config-manager';
 import { exportService } from '../service/export';
 
 const logger = loggerFactory('growi:routes:admin');
@@ -10,53 +9,17 @@ const logger = loggerFactory('growi:routes:admin');
 /** @param {import('~/server/crowi').default} crowi Crowi instance */
 module.exports = (crowi, app) => {
   const ApiResponse = require('../util/apiResponse');
-  const importer = require('../util/importer')(crowi);
 
   const actions = {};
 
-  const { check, param } = require('express-validator');
-
-  const activityEvent = crowi.event('activity');
+  const { param } = require('express-validator');
 
   const api = {};
 
-  // Importer management
-  actions.importer = {};
-  actions.importer.api = api;
-  api.validators = {};
-  api.validators.importer = {};
-
-  api.validators.importer.esa = () => {
-    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 = () => {
-    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;
-  };
-
   // Export management
   actions.export = {};
   actions.export.api = api;
+  api.validators = {};
   api.validators.export = {};
 
   api.validators.export.download = () => {
@@ -128,156 +91,6 @@ module.exports = (crowi, app) => {
     return true;
   }
 
-  /**
-   * save esa settings, update config cache, and response json
-   *
-   * @param {*} req
-   * @param {*} res
-   */
-  actions.api.importerSettingEsa = async (req, res) => {
-    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'));
-    }
-
-    const ALLOWED_KEYS = [
-      'importer:esa:team_name',
-      'importer:esa:access_token',
-    ];
-    if (!isValidFormKeys(form, ALLOWED_KEYS, res)) return;
-
-    await configManager.updateConfigs(form);
-    importer.initializeEsaClient(); // let it run in the back aftert res
-    const parameters = {
-      action: SupportedAction.ACTION_ADMIN_ESA_DATA_UPDATED,
-    };
-    activityEvent.emit('update', res.locals.activity._id, parameters);
-    return res.json(ApiResponse.success());
-  };
-
-  /**
-   * save qiita settings, update config cache, and response json
-   *
-   * @param {*} req
-   * @param {*} res
-   */
-  actions.api.importerSettingQiita = async (req, res) => {
-    const form = req.body;
-
-    const { validationResult } = require('express-validator');
-    const errors = validationResult(req);
-    if (!errors.isEmpty()) {
-      return res.json(ApiResponse.error('Qiita form is blank'));
-    }
-
-    const ALLOWED_KEYS = [
-      'importer:qiita:team_name',
-      'importer:qiita:access_token',
-    ];
-    if (!isValidFormKeys(form, ALLOWED_KEYS, res)) return;
-
-    await configManager.updateConfigs(form);
-    importer.initializeQiitaClient(); // let it run in the back aftert res
-    const parameters = {
-      action: SupportedAction.ACTION_ADMIN_QIITA_DATA_UPDATED,
-    };
-    activityEvent.emit('update', res.locals.activity._id, parameters);
-    return res.json(ApiResponse.success());
-  };
-
-  /**
-   * Import all posts from esa
-   *
-   * @param {*} req
-   * @param {*} res
-   */
-  actions.api.importDataFromEsa = async (req, res) => {
-    const user = req.user;
-    let errors;
-
-    try {
-      errors = await importer.importDataFromEsa(user);
-      const parameters = {
-        action: SupportedAction.ACTION_ADMIN_ESA_DATA_IMPORTED,
-      };
-      activityEvent.emit('update', res.locals.activity._id, parameters);
-    } catch (err) {
-      errors = [err];
-    }
-
-    if (errors.length > 0) {
-      return res.json(ApiResponse.error(`<br> - ${errors.join('<br> - ')}`));
-    }
-    return res.json(ApiResponse.success());
-  };
-
-  /**
-   * Import all posts from qiita
-   *
-   * @param {*} req
-   * @param {*} res
-   */
-  actions.api.importDataFromQiita = async (req, res) => {
-    const user = req.user;
-    let errors;
-
-    try {
-      errors = await importer.importDataFromQiita(user);
-      const parameters = {
-        action: SupportedAction.ACTION_ADMIN_QIITA_DATA_IMPORTED,
-      };
-      activityEvent.emit('update', res.locals.activity._id, parameters);
-    } catch (err) {
-      errors = [err];
-    }
-
-    if (errors.length > 0) {
-      return res.json(ApiResponse.error(`<br> - ${errors.join('<br> - ')}`));
-    }
-    return res.json(ApiResponse.success());
-  };
-
-  /**
-   * Test connection to esa and response result with json
-   *
-   * @param {*} req
-   * @param {*} res
-   */
-  actions.api.testEsaAPI = async (req, res) => {
-    try {
-      await importer.testConnectionToEsa();
-      const parameters = {
-        action: SupportedAction.ACTION_ADMIN_CONNECTION_TEST_OF_ESA_DATA,
-      };
-      activityEvent.emit('update', res.locals.activity._id, parameters);
-      return res.json(ApiResponse.success());
-    } catch (err) {
-      return res.json(ApiResponse.error(err));
-    }
-  };
-
-  /**
-   * Test connection to qiita and response result with json
-   *
-   * @param {*} req
-   * @param {*} res
-   */
-  actions.api.testQiitaAPI = async (req, res) => {
-    try {
-      await importer.testConnectionToQiita();
-      const parameters = {
-        action: SupportedAction.ACTION_ADMIN_CONNECTION_TEST_OF_QIITA_DATA,
-      };
-      activityEvent.emit('update', res.locals.activity._id, parameters);
-      return res.json(ApiResponse.success());
-    } catch (err) {
-      return res.json(ApiResponse.error(err));
-    }
-  };
-
   actions.api.searchBuildIndex = async (req, res) => {
     const search = crowi.getSearcher();
     if (!search) {

+ 0 - 65
apps/app/src/server/routes/apiv3/import.ts

@@ -166,71 +166,6 @@ export default function route(crowi: Crowi): Router {
     },
   });
 
-  /**
-   * @swagger
-   *
-   *  /import:
-   *    get:
-   *      tags: [Import]
-   *      security:
-   *        - bearer: []
-   *        - accessTokenInQuery: []
-   *      summary: /import
-   *      description: Get import settings params
-   *      responses:
-   *        200:
-   *          description: import settings params
-   *          content:
-   *            application/json:
-   *              schema:
-   *                properties:
-   *                  importSettingsParams:
-   *                    type: object
-   *                    description: import settings params
-   *                    properties:
-   *                      esaTeamName:
-   *                        type: string
-   *                        description: the team name of esa.io
-   *                      esaAccessToken:
-   *                        type: string
-   *                        description: the access token of esa.io
-   *                      qiitaTeamName:
-   *                        type: string
-   *                        description: the team name of qiita.com
-   *                      qiitaAccessToken:
-   *                        type: string
-   *                        description: the access token of qiita.com
-   */
-  router.get(
-    '/',
-    accessTokenParser([SCOPE.READ.ADMIN.IMPORT_DATA], { acceptLegacy: true }),
-    loginRequired,
-    adminRequired,
-    async (req, res) => {
-      try {
-        const importSettingsParams = {
-          esaTeamName: await crowi.configManager.getConfig(
-            'importer:esa:team_name',
-          ),
-          esaAccessToken: await crowi.configManager.getConfig(
-            'importer:esa:access_token',
-          ),
-          qiitaTeamName: await crowi.configManager.getConfig(
-            'importer:qiita:team_name',
-          ),
-          qiitaAccessToken: await crowi.configManager.getConfig(
-            'importer:qiita:access_token',
-          ),
-        };
-        return res.apiv3({
-          importSettingsParams,
-        });
-      } catch (err) {
-        return res.apiv3Err(err, 500);
-      }
-    },
-  );
-
   /**
    * @swagger
    *

+ 0 - 52
apps/app/src/server/routes/index.js

@@ -182,58 +182,6 @@ module.exports = (crowi, app) => {
     loginPassport.testLdapCredentials,
   );
 
-  // importer management for admin
-  app.post(
-    '/_api/admin/settings/importerEsa',
-    accessTokenParser([SCOPE.WRITE.ADMIN.IMPORT_DATA]),
-    loginRequiredStrictly,
-    adminRequired,
-    addActivity,
-    admin.importer.api.validators.importer.esa(),
-    admin.api.importerSettingEsa,
-  );
-  app.post(
-    '/_api/admin/settings/importerQiita',
-    accessTokenParser([SCOPE.WRITE.ADMIN.IMPORT_DATA]),
-    loginRequiredStrictly,
-    adminRequired,
-    addActivity,
-    admin.importer.api.validators.importer.qiita(),
-    admin.api.importerSettingQiita,
-  );
-  app.post(
-    '/_api/admin/import/esa',
-    accessTokenParser([SCOPE.WRITE.ADMIN.IMPORT_DATA]),
-    loginRequiredStrictly,
-    adminRequired,
-    addActivity,
-    admin.api.importDataFromEsa,
-  );
-  app.post(
-    '/_api/admin/import/testEsaAPI',
-    accessTokenParser([SCOPE.WRITE.ADMIN.IMPORT_DATA]),
-    loginRequiredStrictly,
-    adminRequired,
-    addActivity,
-    admin.api.testEsaAPI,
-  );
-  app.post(
-    '/_api/admin/import/qiita',
-    accessTokenParser([SCOPE.WRITE.ADMIN.IMPORT_DATA]),
-    loginRequiredStrictly,
-    adminRequired,
-    addActivity,
-    admin.api.importDataFromQiita,
-  );
-  app.post(
-    '/_api/admin/import/testQiitaAPI',
-    accessTokenParser([SCOPE.WRITE.ADMIN.IMPORT_DATA]),
-    loginRequiredStrictly,
-    adminRequired,
-    addActivity,
-    admin.api.testQiitaAPI,
-  );
-
   // brand logo
   app.use('/attachment', attachment.getBrandLogoRouterFactory(crowi));
 

+ 0 - 20
apps/app/src/server/service/config-manager/config-definition.ts

@@ -288,12 +288,6 @@ export const CONFIG_KEYS = [
   'notification:owner-page:isEnabled',
   'notification:group-page:isEnabled',
 
-  // Importer Settings
-  'importer:esa:team_name',
-  'importer:esa:access_token',
-  'importer:qiita:team_name',
-  'importer:qiita:access_token',
-
   // External User Group Settings
   'external-user-group:ldap:groupMembershipAttributeType',
   'external-user-group:ldap:groupSearchBase',
@@ -1212,20 +1206,6 @@ export const CONFIG_DEFINITIONS = {
     defaultValue: false,
   }),
 
-  // Importer Settings
-  'importer:esa:team_name': defineConfig<string | undefined>({
-    defaultValue: undefined,
-  }),
-  'importer:esa:access_token': defineConfig<string | undefined>({
-    defaultValue: undefined,
-  }),
-  'importer:qiita:team_name': defineConfig<string | undefined>({
-    defaultValue: undefined,
-  }),
-  'importer:qiita:access_token': defineConfig<string | undefined>({
-    defaultValue: undefined,
-  }),
-
   // External User Group Settings
   'external-user-group:ldap:groupMembershipAttributeType': defineConfig<string>(
     {

+ 0 - 89
apps/app/src/server/service/rest-qiita-API.js

@@ -1,89 +0,0 @@
-function getAxios(team, token) {
-  // biome-ignore lint/style/noRestrictedImports: TODO: check effects of using custom axios
-  return require('axios').create({
-    baseURL: `https://${team}.qiita.com/api/v2`,
-    headers: {
-      'Content-Type': 'application/json',
-      'X-Requested-With': 'XMLHttpRequest',
-      authorization: `Bearer ${token}`,
-    },
-    responseType: 'json',
-  });
-}
-
-/**
- * the service class of restQiitaAPI
- * Qiita API v2 documant https://qiita.com/api/v2/docs
- */
-
-class RestQiitaAPIService {
-  /** @type {import('~/server/crowi').default} Crowi instance */
-  crowi;
-
-  /** @param {import('~/server/crowi').default} crowi Crowi instance */
-  constructor(crowi) {
-    this.crowi = crowi;
-    this.configManager = crowi.configManager;
-    this.team = this.configManager.getConfig('importer:qiita:team_name');
-    this.token = this.configManager.getConfig('importer:qiita:access_token');
-    this.axios = getAxios(this.team, this.token);
-  }
-
-  /**
-   * @memberof RestQiitaAPI
-   * @param {string} team
-   * @param {string} token
-   */
-  async reset() {
-    this.team = this.configManager.getConfig('importer:qiita:team_name');
-    this.token = this.configManager.getConfig('importer:qiita:access_token');
-    this.axios = getAxios(this.team, this.token);
-  }
-
-  /**
-   * get Qiita API
-   * @memberof RestQiitaAPI
-   * @param {string} path
-   */
-  async restAPI(path) {
-    return this.axios.get(path).then((res) => {
-      const data = res.data;
-      const total = res.headers['total-count'];
-
-      return { data, total };
-    });
-  }
-
-  /**
-   * get Qiita user
-   * @memberof RestQiitaAPI
-   */
-  async getQiitaUser() {
-    const res = await this.restAPI('/users');
-    const user = res.data;
-
-    if (user.length > 0) {
-      return user;
-    }
-  }
-
-  /**
-   * get Qiita pages
-   * @memberof RestQiitaAPI
-   * @param {string} pageNum
-   * @param {string} perPage
-   */
-  async getQiitaPages(pageNum, perPage) {
-    const res = await this.restAPI(
-      `/items?page=${pageNum}&per_page=${perPage}`,
-    );
-    const pages = res.data;
-    const total = res.total;
-
-    if (pages.length > 0) {
-      return { pages, total };
-    }
-  }
-}
-
-module.exports = RestQiitaAPIService;

+ 0 - 194
apps/app/src/server/util/importer.js

@@ -1,194 +0,0 @@
-import Esa from 'esa-node';
-
-import loggerFactory from '~/utils/logger';
-
-import { configManager } from '../service/config-manager';
-
-const logger = loggerFactory('growi:util:importer');
-
-/**
- * importer
- */
-
-/* eslint-disable no-use-before-define */
-
-/** @param {import('~/server/crowi').default} crowi Crowi instance */
-module.exports = (crowi) => {
-  const createGrowiPages = require('./createGrowiPagesFromImports')(crowi);
-
-  const importer = {};
-  let esaClient = () => {};
-
-  /**
-   * Initialize importer
-   */
-  importer.initializeEsaClient = () => {
-    const team = configManager.getConfig('importer:esa:team_name');
-    const accessToken = configManager.getConfig('importer:esa:access_token');
-    esaClient = new Esa(accessToken, team);
-    logger.debug('initialize esa importer');
-  };
-
-  /**
-   * Initialize importer
-   */
-  importer.initializeQiitaClient = () => {
-    crowi.restQiitaAPIService.reset();
-    logger.debug('initialize qiita importer');
-  };
-
-  /**
-   * Import page data from esa to GROWI
-   */
-  importer.importDataFromEsa = (user) => {
-    return new Promise((resolve, reject) => {
-      const firstPage = 1;
-      const errors = importPostsFromEsa(firstPage, user, []);
-
-      resolve(errors);
-    });
-  };
-
-  /**
-   * post page data from esa and create GROWI page
-   * @param {string} pageNum default value is '1'
-   */
-  const importPostsFromEsa = (pageNum, user, errors) => {
-    return new Promise((resolve, reject) => {
-      esaClient
-        .posts({ page: pageNum, per_page: 100 })
-        .then(async (res) => {
-          const nextPage = res.next_page;
-          const postsReceived = res.posts;
-
-          const data = convertEsaDataForGrowi(postsReceived, user);
-          const newErrors = await createGrowiPages(data);
-
-          if (nextPage) {
-            return resolve(
-              importPostsFromEsa(nextPage, user, errors.concat(newErrors)),
-            );
-          }
-
-          resolve(errors.concat(newErrors));
-        })
-        .catch((err) => {
-          reject(new Error(`error in page ${pageNum}: ${err}`));
-        });
-    });
-  };
-
-  /**
-   * Import page data from qiita to GROWI
-   */
-  importer.importDataFromQiita = async (user) => {
-    const firstPage = 1;
-    const errors = await importPostsFromQiita(firstPage, user, []);
-    return errors;
-  };
-
-  /**
-   * post page data from qiita and create GROWI page
-   * @param {string} pageNum default value is '1'
-   */
-  const importPostsFromQiita = async (pageNum, user, errors) => {
-    const perPage = '100';
-    const res = await crowi.restQiitaAPIService.getQiitaPages(pageNum, perPage);
-    const next = pageNum * perPage;
-    const postsReceived = res.pages;
-    const pageTotal = res.total;
-    const data = convertQiitaDataForGrowi(postsReceived, user);
-
-    const newErrors = await createGrowiPages(data);
-    if (next < pageTotal) {
-      return importPostsFromQiita(next, user, errors.concat(newErrors));
-    }
-
-    return errors.concat(newErrors);
-  };
-
-  /**
-   * Convert data into usable format for createGrowiPagesFromImports
-   */
-  const convertEsaDataForGrowi = (pages, user) => {
-    const basePage = '';
-    const data = pages.map((post) => {
-      const category = post.category;
-      const name = post.name;
-
-      let path = '';
-
-      if (category && name) {
-        path = `${category}/${name}`;
-      } else if (category) {
-        path = category;
-      } else if (name) {
-        path = name;
-      }
-
-      return {
-        path: `${basePage}/${path}`,
-        body: post.body_md,
-        user,
-      };
-    });
-
-    return data;
-  };
-
-  /**
-   * Convert data into usable format for createGrowiPagesFromImports
-   */
-  const convertQiitaDataForGrowi = (pages, user) => {
-    const basePage = '';
-    const data = pages.map((post) => {
-      const title = post.title;
-      const path = title;
-
-      return {
-        path: `${basePage}/${path}`,
-        body: post.body,
-        user,
-      };
-    });
-
-    return data;
-  };
-
-  /**
-   * Import page data from esa to GROWI
-   */
-  importer.testConnectionToEsa = async () => {
-    await getTeamNameFromEsa();
-  };
-
-  /**
-   * Import page data from qiita to GROWI
-   */
-  importer.testConnectionToQiita = async () => {
-    await crowi.restQiitaAPIService.getQiitaUser();
-  };
-
-  /**
-   * Get teams from esa (Promise wrapper)
-   */
-  const getTeamNameFromEsa = () => {
-    return new Promise((resolve, reject) => {
-      const team = configManager.getConfig('importer:esa:team_name');
-      esaClient
-        .team(team)
-        .then((res) => {
-          resolve(res);
-        })
-        .catch((err) => {
-          return reject(err);
-        });
-    });
-  };
-
-  // initialize when server starts
-  importer.initializeEsaClient();
-  importer.initializeQiitaClient();
-
-  return importer;
-};

+ 0 - 33
pnpm-lock.yaml

@@ -400,9 +400,6 @@ importers:
       ejs:
         specifier: ^3.1.10
         version: 3.1.10
-      esa-node:
-        specifier: ^0.2.2
-        version: 0.2.2
       escape-string-regexp:
         specifier: ^4.0.0
         version: 4.0.0
@@ -6606,10 +6603,6 @@ packages:
   axios-retry@3.9.1:
     resolution: {integrity: sha512-8PJDLJv7qTTMMwdnbMvrLYuvB47M81wRtxQmEdV5w4rgbTXTt+vtPkXwajOfOdSyv/wZICJOC+/UhXH4aQ/R+w==}
 
-  axios@0.18.1:
-    resolution: {integrity: sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==}
-    deprecated: Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410
-
   axios@0.21.4:
     resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==}
 
@@ -8619,9 +8612,6 @@ packages:
   es6-promise@3.3.1:
     resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==}
 
-  esa-node@0.2.2:
-    resolution: {integrity: sha512-QIwO62/WezCVKzKBY0chpPOreI//rqdeZyfPbg7bFLqaQKcVxYLoq84KhsXgjmfypOUtjUPXa2BE5cf3yqlnhQ==}
-
   esbuild@0.21.5:
     resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
     engines: {node: '>=12'}
@@ -9179,10 +9169,6 @@ packages:
       debug:
         optional: true
 
-  follow-redirects@1.5.10:
-    resolution: {integrity: sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==}
-    engines: {node: '>=4.0'}
-
   for-each@0.3.3:
     resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
 
@@ -22509,13 +22495,6 @@ snapshots:
       '@babel/runtime': 7.25.4
       is-retry-allowed: 2.2.0
 
-  axios@0.18.1:
-    dependencies:
-      follow-redirects: 1.5.10
-      is-buffer: 2.0.5
-    transitivePeerDependencies:
-      - supports-color
-
   axios@0.21.4:
     dependencies:
       follow-redirects: 1.15.9(debug@4.4.1)
@@ -24458,12 +24437,6 @@ snapshots:
 
   es6-promise@3.3.1: {}
 
-  esa-node@0.2.2:
-    dependencies:
-      axios: 0.18.1
-    transitivePeerDependencies:
-      - supports-color
-
   esbuild@0.21.5:
     optionalDependencies:
       '@esbuild/aix-ppc64': 0.21.5
@@ -25219,12 +25192,6 @@ snapshots:
     optionalDependencies:
       debug: 4.4.1(supports-color@5.5.0)
 
-  follow-redirects@1.5.10:
-    dependencies:
-      debug: 3.1.0
-    transitivePeerDependencies:
-      - supports-color
-
   for-each@0.3.3:
     dependencies:
       is-callable: 1.2.7