importer.js 4.3 KB

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