importer.js 4.5 KB

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