importer.js 4.9 KB

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