importer.js 4.7 KB

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