importer.js 4.4 KB

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