importer.js 4.5 KB

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