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