importer.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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. * Get teams from esa (Promise wrapper)
  17. */
  18. const getTeamsFromEsa = () => {
  19. return new Promise((resolve, reject) => {
  20. esaClient.api.team((err, res) => {
  21. if (err) {
  22. debug(err);
  23. reject(err);
  24. }
  25. resolve(res);
  26. });
  27. });
  28. };
  29. /**
  30. * Get posts from esa (Promise wrapper)
  31. */
  32. const getDataFromEsa = () => {
  33. return new Promise((resolve, reject) => {
  34. esaClient.api.posts((err, res) => {
  35. if (err) {
  36. debug(err);
  37. reject(err);
  38. }
  39. resolve(res);
  40. });
  41. });
  42. };
  43. /**
  44. * Create posts from imported data
  45. */
  46. const createGrowiPages = (pages, user) => {
  47. return new Promise((resolve, reject) => {
  48. const basePage = '/';
  49. const ignoreNotFound = true;
  50. pages.forEach(post => {
  51. const pagePath = basePage + [post.category, post.name].filter(v => v).join('/');
  52. Page.findPage(pagePath, user, null, ignoreNotFound)
  53. .then(data => {
  54. if (data !== null) {
  55. return reject('Page exists');
  56. }
  57. if (!Page.isCreatableName(pagePath)) {
  58. return reject(`Page name '${pagePath}' is not allowed in Growi`);
  59. }
  60. return Page.create(pagePath, post.body_md, user, { grant: Page.GRANT_PUBLIC, grantUserGroupId: null });
  61. })
  62. .then(createdPage => {
  63. if (!createdPage) {
  64. return reject('Page exists');
  65. }
  66. debug('Crete page: ' + createdPage);
  67. return resolve();
  68. })
  69. .catch(err => {
  70. debug(err);
  71. return reject(err);
  72. });
  73. });
  74. });
  75. };
  76. /**
  77. * Initialize importer
  78. */
  79. importer.initialize = () => {
  80. esaClient = esa({
  81. team: config.crowi['importer:esa:team_name'],
  82. accessToken: config.crowi['importer:esa:access_token'],
  83. });
  84. debug('esa client is initialized');
  85. };
  86. /**
  87. * Import page data from esa to GROWI
  88. */
  89. importer.importPagesFromEsa = user => {
  90. return new Promise(async(resolve, reject) => {
  91. const data = await getDataFromEsa();
  92. try {
  93. await createGrowiPages(data.body.posts, user);
  94. return resolve();
  95. }
  96. catch (err) {
  97. debug(err);
  98. return reject(err);
  99. }
  100. });
  101. };
  102. /**
  103. * Import page data from esa to GROWI
  104. */
  105. importer.testConnectionToEsa = () => {
  106. return new Promise((resolve, reject) => {
  107. getTeamsFromEsa()
  108. .then(res => {
  109. return resolve();
  110. })
  111. .catch(err => {
  112. debug(err);
  113. return reject(err);
  114. });
  115. });
  116. };
  117. importer.initialize();
  118. return importer;
  119. };