importer.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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. let importer = {};
  11. let esaClient = {};
  12. /**
  13. * Initialize importer
  14. */
  15. importer.initialize = () => {
  16. esaClient = esa({
  17. team: config.crowi['importer:esa:team_name'],
  18. accessToken: config.crowi['importer:esa:access_token'],
  19. });
  20. logger.info('initialize esa importer');
  21. };
  22. /**
  23. * Import page data from esa to GROWI
  24. */
  25. importer.importDataFromEsa = user => {
  26. return new Promise((resolve, reject) => {
  27. const firstPage = 1;
  28. const errors = importPostsFromEsa(firstPage, user, []);
  29. resolve(errors);
  30. });
  31. };
  32. const importPostsFromEsa = (pageNum, user, errors) => {
  33. return new Promise((resolve, reject) => {
  34. esaClient.api.posts({page: pageNum, per_page: 100}, async(err, res) => {
  35. const nextPage = res.body.next_page;
  36. const postsReceived = res.body.posts;
  37. if (err) {
  38. reject(`error in page ${pageNum}: ${err}`);
  39. }
  40. const data = convertEsaDataForGrowi(postsReceived, user);
  41. const newErrors = await createGrowiPages(data);
  42. if (nextPage) {
  43. return resolve(importPostsFromEsa(nextPage, user, errors.concat(newErrors)));
  44. }
  45. resolve(errors.concat(newErrors));
  46. });
  47. });
  48. };
  49. /**
  50. * Convert data into usable format for createGrowiPagesFromImports
  51. */
  52. const convertEsaDataForGrowi = (pages, user) => {
  53. const basePage = '';
  54. const data = pages.map(post => {
  55. const category = post.category;
  56. const name = post.name;
  57. let path = '';
  58. if (category && name) {
  59. path = `${category}/${name}`;
  60. }
  61. else if (category) {
  62. path = category;
  63. }
  64. else if (name) {
  65. path = name;
  66. }
  67. return {
  68. path: `${basePage}/${path}`,
  69. body: post.body_md,
  70. user: user,
  71. };
  72. });
  73. return data;
  74. };
  75. /**
  76. * Import page data from esa to GROWI
  77. */
  78. importer.testConnectionToEsa = () => {
  79. return new Promise(async(resolve, reject) => {
  80. try {
  81. await getTeamNameFromEsa();
  82. resolve();
  83. }
  84. catch (err) {
  85. reject(err);
  86. }
  87. });
  88. };
  89. /**
  90. * Get teams from esa (Promise wrapper)
  91. */
  92. const getTeamNameFromEsa = () => {
  93. return new Promise((resolve, reject) => {
  94. esaClient.api.team((err, res) => {
  95. if (err) {
  96. return reject(err);
  97. }
  98. resolve(res);
  99. });
  100. });
  101. };
  102. // initialize when server starts
  103. importer.initialize();
  104. return importer;
  105. };