importer.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. import Esa from 'esa-node';
  2. import loggerFactory from '~/utils/logger';
  3. const logger = loggerFactory('growi:util:importer');
  4. /**
  5. * importer
  6. */
  7. /* eslint-disable no-use-before-define */
  8. module.exports = (crowi) => {
  9. const createGrowiPages = require('./createGrowiPagesFromImports')(crowi);
  10. const restQiitaAPIService = crowi.getRestQiitaAPIService();
  11. const configManager = crowi.configManager;
  12. const importer = {};
  13. let esaClient = () => {};
  14. /**
  15. * Initialize importer
  16. */
  17. importer.initializeEsaClient = () => {
  18. const team = configManager.getConfig('crowi', 'importer:esa:team_name');
  19. const accessToken = configManager.getConfig('crowi', 'importer:esa:access_token');
  20. esaClient = new Esa(accessToken, team);
  21. logger.debug('initialize esa importer');
  22. };
  23. /**
  24. * Initialize importer
  25. */
  26. importer.initializeQiitaClient = () => {
  27. restQiitaAPIService.reset();
  28. logger.debug('initialize qiita importer');
  29. };
  30. /**
  31. * Import page data from esa to GROWI
  32. */
  33. importer.importDataFromEsa = (user) => {
  34. return new Promise((resolve, reject) => {
  35. const firstPage = 1;
  36. const errors = importPostsFromEsa(firstPage, user, []);
  37. resolve(errors);
  38. });
  39. };
  40. /**
  41. * post page data from esa and create GROWI page
  42. * @param {string} pageNum default value is '1'
  43. */
  44. const importPostsFromEsa = (pageNum, user, errors) => {
  45. return new Promise((resolve, reject) => {
  46. esaClient.posts({ page: pageNum, per_page: 100 }).then(async(res) => {
  47. const nextPage = res.next_page;
  48. const postsReceived = res.posts;
  49. const data = convertEsaDataForGrowi(postsReceived, user);
  50. const newErrors = await createGrowiPages(data);
  51. if (nextPage) {
  52. return resolve(importPostsFromEsa(nextPage, user, errors.concat(newErrors)));
  53. }
  54. resolve(errors.concat(newErrors));
  55. }).catch((err) => {
  56. reject(new Error(`error in page ${pageNum}: ${err}`));
  57. });
  58. });
  59. };
  60. /**
  61. * Import page data from qiita to GROWI
  62. */
  63. importer.importDataFromQiita = async(user) => {
  64. const firstPage = 1;
  65. const errors = await importPostsFromQiita(firstPage, user, []);
  66. return errors;
  67. };
  68. /**
  69. * post page data from qiita and create GROWI page
  70. * @param {string} pageNum default value is '1'
  71. */
  72. const importPostsFromQiita = async(pageNum, user, errors) => {
  73. const perPage = '100';
  74. const res = await restQiitaAPIService.getQiitaPages(pageNum, perPage);
  75. const next = pageNum * perPage;
  76. const postsReceived = res.pages;
  77. const pageTotal = res.total;
  78. const data = convertQiitaDataForGrowi(postsReceived, user);
  79. const newErrors = await createGrowiPages(data);
  80. if (next < pageTotal) {
  81. return importPostsFromQiita(next, user, errors.concat(newErrors));
  82. }
  83. return errors.concat(newErrors);
  84. };
  85. /**
  86. * Convert data into usable format for createGrowiPagesFromImports
  87. */
  88. const convertEsaDataForGrowi = (pages, user) => {
  89. const basePage = '';
  90. const data = pages.map((post) => {
  91. const category = post.category;
  92. const name = post.name;
  93. let path = '';
  94. if (category && name) {
  95. path = `${category}/${name}`;
  96. }
  97. else if (category) {
  98. path = category;
  99. }
  100. else if (name) {
  101. path = name;
  102. }
  103. return {
  104. path: `${basePage}/${path}`,
  105. body: post.body_md,
  106. user,
  107. };
  108. });
  109. return data;
  110. };
  111. /**
  112. * Convert data into usable format for createGrowiPagesFromImports
  113. */
  114. const convertQiitaDataForGrowi = (pages, user) => {
  115. const basePage = '';
  116. const data = pages.map((post) => {
  117. const title = post.title;
  118. const path = title;
  119. return {
  120. path: `${basePage}/${path}`,
  121. body: post.body,
  122. user,
  123. };
  124. });
  125. return data;
  126. };
  127. /**
  128. * Import page data from esa to GROWI
  129. */
  130. importer.testConnectionToEsa = async() => {
  131. await getTeamNameFromEsa();
  132. };
  133. /**
  134. * Import page data from qiita to GROWI
  135. */
  136. importer.testConnectionToQiita = async() => {
  137. await restQiitaAPIService.getQiitaUser();
  138. };
  139. /**
  140. * Get teams from esa (Promise wrapper)
  141. */
  142. const getTeamNameFromEsa = () => {
  143. return new Promise((resolve, reject) => {
  144. const team = configManager.getConfig('crowi', 'importer:esa:team_name');
  145. esaClient.team(team).then((res) => {
  146. resolve(res);
  147. }).catch((err) => {
  148. return reject(err);
  149. });
  150. });
  151. };
  152. // initialize when server starts
  153. importer.initializeEsaClient();
  154. importer.initializeQiitaClient();
  155. return importer;
  156. };