importer.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  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. 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 = user => {
  60. return new Promise((resolve, reject) => {
  61. const firstPage = 1;
  62. const errors = importPostsFromQiita(firstPage, user, []);
  63. resolve(errors);
  64. });
  65. };
  66. const importPostsFromQiita = (pageNum, user, errors) => {
  67. return new Promise((resolve, reject) => {
  68. qiitaClient.getQiitaPages(pageNum)
  69. .then(function(res) {
  70. const next = pageNum * 100 + 1;
  71. const postsReceived = res[0];
  72. const pageTotal = res[1];
  73. const data = convertQiitaDataForGrowi(postsReceived, user);
  74. createGrowiPages(data)
  75. .then(function(newErrors) {
  76. if (next <= pageTotal) {
  77. return resolve(importPostsFromQiita(next, user, errors.concat(newErrors)));
  78. }
  79. resolve(errors.concat(newErrors));
  80. });
  81. }).catch(function(err) {
  82. reject(err);
  83. });
  84. });
  85. };
  86. /**
  87. * Convert data into usable format for createGrowiPagesFromImports
  88. */
  89. const convertEsaDataForGrowi = (pages, user) => {
  90. const basePage = '';
  91. const data = pages.map(post => {
  92. const category = post.category;
  93. const name = post.name;
  94. let path = '';
  95. if (category && name) {
  96. path = `${category}/${name}`;
  97. }
  98. else if (category) {
  99. path = category;
  100. }
  101. else if (name) {
  102. path = name;
  103. }
  104. return {
  105. path: `${basePage}/${path}`,
  106. body: post.body_md,
  107. user: user,
  108. };
  109. });
  110. return data;
  111. };
  112. /**
  113. * Convert data into usable format for createGrowiPagesFromImports
  114. */
  115. const convertQiitaDataForGrowi = (pages, user) => {
  116. const basePage = '';
  117. const data = pages.map(post => {
  118. const title = post.title;
  119. let path = title;
  120. return {
  121. path: `${basePage}/${path}`,
  122. body: post.body,
  123. user: user,
  124. };
  125. });
  126. return data;
  127. };
  128. /**
  129. * Import page data from esa to GROWI
  130. */
  131. importer.testConnectionToEsa = () => {
  132. return new Promise(async(resolve, reject) => {
  133. try {
  134. await getTeamNameFromEsa();
  135. resolve();
  136. }
  137. catch (err) {
  138. reject(err);
  139. }
  140. });
  141. };
  142. /**
  143. * Import page data from qiita to GROWI
  144. */
  145. importer.testConnectionToQiita = () => {
  146. return new Promise(async(resolve, reject) => {
  147. try {
  148. await qiitaClient.getQiitaUser();
  149. resolve();
  150. }
  151. catch (err) {
  152. reject(err);
  153. }
  154. });
  155. };
  156. /**
  157. * Get teams from esa (Promise wrapper)
  158. */
  159. const getTeamNameFromEsa = () => {
  160. return new Promise((resolve, reject) => {
  161. esaClient.api.team((err, res) => {
  162. if (err) {
  163. return reject(err);
  164. }
  165. resolve(res);
  166. });
  167. });
  168. };
  169. // initialize when server starts
  170. importer.initialize();
  171. return importer;
  172. };