hackmd.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. const logger = require('@alias/logger')('growi:routes:hackmd');
  2. const path = require('path');
  3. const swig = require('swig-templates');
  4. const axios = require('axios');
  5. const ApiResponse = require('../util/apiResponse');
  6. module.exports = function(crowi, app) {
  7. const Page = crowi.models.Page;
  8. // load GROWI agent script for HackMD
  9. const manifest = require(path.join(crowi.publicDir, 'manifest.json'));
  10. const agentScriptPath = path.join(crowi.publicDir, manifest['js/agent-for-hackmd.js']);
  11. // generate swig template
  12. const agentScriptContentTpl = swig.compileFile(agentScriptPath);
  13. /**
  14. * loadAgent action
  15. * This should be access from HackMD and send agent script
  16. *
  17. * @param {object} req
  18. * @param {object} res
  19. */
  20. const loadAgent = function(req, res) {
  21. const origin = `${req.protocol}://${req.get('host')}`;
  22. const styleFilePath = origin + manifest['styles/style-hackmd.css'];
  23. // generate definitions to replace
  24. const definitions = {
  25. origin,
  26. styleFilePath,
  27. };
  28. // inject
  29. const script = agentScriptContentTpl(definitions);
  30. res.set('Content-Type', 'application/javascript');
  31. res.send(script);
  32. };
  33. /**
  34. * Create page on HackMD and start to integrate
  35. * @param {object} req
  36. * @param {object} res
  37. */
  38. const integrate = async function(req, res) {
  39. // validate process.env.HACKMD_URI
  40. const hackMdUri = process.env.HACKMD_URI;
  41. if (hackMdUri == null) {
  42. return res.json(ApiResponse.error('HackMD for GROWI has not been setup'));
  43. }
  44. // validate pageId
  45. const pageId = req.body.pageId;
  46. if (pageId == null) {
  47. return res.json(ApiResponse.error('pageId required'));
  48. }
  49. // validate page
  50. const page = await Page.findOne({ _id: pageId });
  51. if (page == null) {
  52. return res.json(ApiResponse.error(`Page('${pageId}') does not exist`));
  53. }
  54. if (page.pageIdOnHackmd != null) {
  55. return res.json(ApiResponse.error(`'pageIdOnHackmd' of the page '${page.path}' is not empty`));
  56. }
  57. // access to HackMD and create page
  58. const response = await axios.get(`${hackMdUri}/new`);
  59. logger.debug('HackMD responds', response);
  60. // extract page id on HackMD
  61. const pagePathOnHackmd = response.request.path; // e.g. '/NC7bSRraT1CQO1TO7wjCPw'
  62. const pageIdOnHackmd = pagePathOnHackmd.substr(1); // strip the head '/'
  63. // persist
  64. try {
  65. await Page.registerHackmdPage(page, pageIdOnHackmd);
  66. const data = {
  67. pageIdOnHackmd,
  68. };
  69. return res.json(ApiResponse.success(data));
  70. }
  71. catch (err) {
  72. return res.json(ApiResponse.error(err));
  73. }
  74. };
  75. return {
  76. loadAgent,
  77. integrate,
  78. };
  79. };