importer.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  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 qiitaTeam = config.crowi['importer:qiita:team_name'];
  11. const qiitaToken = config.crowi['importer:qiita:access_token'];
  12. const restQiitaAPI = require('./restQiitaAPI')(qiitaTeam, qiitaToken);
  13. let importer = {};
  14. let esaClient = {};
  15. /**
  16. * Initialize importer
  17. */
  18. importer.initialize = () => {
  19. esaClient = esa({
  20. team: config.crowi['importer:esa:team_name'],
  21. accessToken: config.crowi['importer:esa:access_token'],
  22. });
  23. logger.info('initialize esa 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. const importPostsFromEsa = (pageNum, user, errors) => {
  36. return new Promise((resolve, reject) => {
  37. esaClient.api.posts({page: pageNum, per_page: 100}, async(err, res) => {
  38. const nextPage = res.body.next_page;
  39. const postsReceived = res.body.posts;
  40. if (err) {
  41. reject(`error in page ${pageNum}: ${err}`);
  42. }
  43. const data = convertEsaDataForGrowi(postsReceived, user);
  44. const newErrors = await createGrowiPages(data);
  45. if (nextPage) {
  46. return resolve(importPostsFromEsa(nextPage, user, errors.concat(newErrors)));
  47. }
  48. resolve(errors.concat(newErrors));
  49. });
  50. });
  51. };
  52. /**
  53. * Import page data from qiita to GROWI
  54. */
  55. importer.importDataFromQiita = user => {
  56. return new Promise((resolve, reject) => {
  57. const firstPage = 1;
  58. const errors = importPostsFromQiita(firstPage, user, []);
  59. resolve(errors);
  60. });
  61. };
  62. const importPostsFromQiita = (pageNum, user, errors) => {
  63. return new Promise((resolve, reject) => {
  64. restQiitaAPI.getQiitaPages()
  65. .then(function(res) {
  66. const postsReceived = res;
  67. const data = convertEsaDataForGrowi(postsReceived, user);
  68. createGrowiPages(data)
  69. .then(function(newErrors) {
  70. errors.concat(newErrors);
  71. });
  72. // if (nextPage) {
  73. // return resolve(importPostsFromQiita(nextPage, user, errors.concat(newErrors)));
  74. // }
  75. resolve(errors);
  76. }).catch(function(err) {
  77. reject(err);
  78. });
  79. });
  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 category = post.category;
  114. const name = post.name;
  115. let path = '';
  116. if (category && name) {
  117. path = `${category}/${name}`;
  118. }
  119. else if (category) {
  120. path = category;
  121. }
  122. else if (name) {
  123. path = name;
  124. }
  125. return {
  126. path: `${basePage}/${path}`,
  127. body: post.body_md,
  128. user: user,
  129. };
  130. });
  131. return data;
  132. };
  133. /**
  134. * Import page data from esa to GROWI
  135. */
  136. importer.testConnectionToEsa = () => {
  137. return new Promise(async(resolve, reject) => {
  138. try {
  139. await getTeamNameFromEsa();
  140. resolve();
  141. }
  142. catch (err) {
  143. reject(err);
  144. }
  145. });
  146. };
  147. /**
  148. * Import page data from qiita to GROWI
  149. */
  150. importer.testConnectionToQiita = () => {
  151. return new Promise(async(resolve, reject) => {
  152. try {
  153. await restQiitaAPI.getQiitaUser();
  154. resolve();
  155. }
  156. catch (err) {
  157. reject(err);
  158. }
  159. });
  160. };
  161. /**
  162. * Get teams from esa (Promise wrapper)
  163. */
  164. const getTeamNameFromEsa = () => {
  165. return new Promise((resolve, reject) => {
  166. esaClient.api.team((err, res) => {
  167. if (err) {
  168. return reject(err);
  169. }
  170. resolve(res);
  171. });
  172. });
  173. };
  174. // initialize when server starts
  175. importer.initialize();
  176. return importer;
  177. };