importer.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  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.initializeEsaClient = () => {
  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. * Initialize importer
  25. */
  26. importer.initializeQiitaClient = () => {
  27. restQiitaAPIService.reset();
  28. logger.info('initialize qiita importer');
  29. };
  30. /**
  31. * Import page data from esa to GROWI
  32. */
  33. importer.importDataFromEsa = user => {
  34. return new Promise((resolve, reject) => {
  35. const firstPage = 1;
  36. const errors = importPostsFromEsa(firstPage, user, []);
  37. resolve(errors);
  38. });
  39. };
  40. /**
  41. * post page data from esa and create GROWI page
  42. * @param {string} pageNum default value is '1'
  43. */
  44. const importPostsFromEsa = (pageNum, user, errors) => {
  45. return new Promise((resolve, reject) => {
  46. esaClient.api.posts({page: pageNum, per_page: 100}, async(err, res) => {
  47. const nextPage = res.body.next_page;
  48. const postsReceived = res.body.posts;
  49. if (err) {
  50. reject(`error in page ${pageNum}: ${err}`);
  51. }
  52. const data = convertEsaDataForGrowi(postsReceived, user);
  53. const newErrors = await createGrowiPages(data);
  54. if (nextPage) {
  55. return resolve(importPostsFromEsa(nextPage, user, errors.concat(newErrors)));
  56. }
  57. resolve(errors.concat(newErrors));
  58. });
  59. });
  60. };
  61. /**
  62. * Import page data from qiita to GROWI
  63. */
  64. importer.importDataFromQiita = async(user) => {
  65. const firstPage = 1;
  66. const errors = await importPostsFromQiita(firstPage, user, []);
  67. return errors;
  68. };
  69. /**
  70. * post page data from qiita and create GROWI page
  71. * @param {string} pageNum default value is '1'
  72. */
  73. const importPostsFromQiita = async(pageNum, user, errors) => {
  74. const per_page = '100';
  75. const res = await restQiitaAPIService.getQiitaPages(pageNum, per_page);
  76. const next = pageNum * per_page;
  77. const postsReceived = res.pages;
  78. const pageTotal = res.total;
  79. const data = convertQiitaDataForGrowi(postsReceived, user);
  80. const newErrors = await createGrowiPages(data);
  81. if (next < pageTotal) {
  82. return importPostsFromQiita(next, user, errors.concat(newErrors));
  83. }
  84. return errors.concat(newErrors);
  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 = async() => {
  132. await getTeamNameFromEsa();
  133. };
  134. /**
  135. * Import page data from qiita to GROWI
  136. */
  137. importer.testConnectionToQiita = async() => {
  138. await restQiitaAPIService.getQiitaUser();
  139. };
  140. /**
  141. * Get teams from esa (Promise wrapper)
  142. */
  143. const getTeamNameFromEsa = () => {
  144. return new Promise((resolve, reject) => {
  145. esaClient.api.team((err, res) => {
  146. if (err) {
  147. return reject(err);
  148. }
  149. resolve(res);
  150. });
  151. });
  152. };
  153. // initialize when server starts
  154. importer.initializeEsaClient();
  155. importer.initializeQiitaClient();
  156. return importer;
  157. };