importer.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /**
  2. * importer
  3. */
  4. module.exports = crowi => {
  5. 'use strict';
  6. const debug = require('debug')('growi:lib:importer');
  7. const request = require('request');
  8. const esa = require('esa-nodejs');
  9. const Page = crowi.model('Page');
  10. const User = crowi.model('User');
  11. const pageRouter = require('../routes/page')(crowi);
  12. const config = crowi.getConfig();
  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. debug('esa client is initialized');
  24. };
  25. /**
  26. * Import page data from esa to GROWI
  27. */
  28. importer.importPagesFromEsa = user => {
  29. return new Promise(async(resolve, reject) => {
  30. const data = await getAllDataFromEsa();
  31. try {
  32. await createGrowiPages(data.body.posts, user);
  33. resolve();
  34. }
  35. catch (err) {
  36. debug(err);
  37. reject(err);
  38. }
  39. });
  40. };
  41. /**
  42. * Get posts from esa (Promise wrapper)
  43. */
  44. const getAllDataFromEsa = () => {
  45. return new Promise((resolve, reject) => {
  46. esaClient.api.posts((err, res) => {
  47. if (err) {
  48. debug(err);
  49. return reject(err);
  50. }
  51. resolve(res);
  52. });
  53. });
  54. };
  55. /**
  56. * Create posts from imported data
  57. */
  58. const createGrowiPages = (pages, user) => {
  59. const basePage = '/';
  60. let createdPages = [];
  61. let rejectedPages = [];
  62. let errors = [];
  63. return new Promise((resolve, reject) => {
  64. const promises = pages.map(page => {
  65. return new Promise(async(resolve, reject) => {
  66. const pagePath = basePage + [page.category, page.name].filter(v => v).join('/');
  67. const isCreatableName = await Page.isCreatableName(pagePath);
  68. const isPageNameTaken = await Page.findPage(pagePath, user, null, true);
  69. if (isCreatableName && !isPageNameTaken) {
  70. await Page.create(pagePath, page.body_md, user, { grant: Page.GRANT_PUBLIC, grantUserGroupId: null });
  71. createdPages.push(page);
  72. }
  73. else {
  74. rejectedPages.push(page);
  75. if (!isCreatableName) {
  76. errors.push(new Error(`${pagePath} is not a creatable name in Growi`));
  77. }
  78. if (isPageNameTaken) {
  79. errors.push(new Error(`${pagePath} already exists in Growi`));
  80. }
  81. }
  82. resolve();
  83. });
  84. });
  85. Promise.all(promises)
  86. .then(() => {
  87. resolve({
  88. createdPages,
  89. rejectedPages,
  90. errors,
  91. });
  92. });
  93. });
  94. };
  95. /**
  96. * Import page data from esa to GROWI
  97. */
  98. importer.testConnectionToEsa = () => {
  99. return new Promise(async(resolve, reject) => {
  100. try {
  101. await getTeamNameFromEsa();
  102. resolve();
  103. }
  104. catch (err) {
  105. debug(err);
  106. reject(err);
  107. }
  108. });
  109. };
  110. /**
  111. * Get teams from esa (Promise wrapper)
  112. */
  113. const getTeamNameFromEsa = () => {
  114. return new Promise((resolve, reject) => {
  115. esaClient.api.team((err, res) => {
  116. if (err) {
  117. debug(err);
  118. return reject(err);
  119. }
  120. resolve(res);
  121. });
  122. });
  123. };
  124. importer.initialize();
  125. return importer;
  126. };