pages.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. "use strict";
  2. var express = require('express');
  3. var router = express.Router();
  4. var _ = require('lodash');
  5. // ==========================================
  6. // EDIT MODE
  7. // ==========================================
  8. /**
  9. * Edit document in Markdown
  10. */
  11. router.get('/edit/*', (req, res, next) => {
  12. let safePath = entries.parsePath(_.replace(req.path, '/edit', ''));
  13. entries.fetchOriginal(safePath, {
  14. parseMarkdown: false,
  15. parseMeta: true,
  16. parseTree: false,
  17. includeMarkdown: true,
  18. includeParentInfo: false,
  19. cache: false
  20. }).then((pageData) => {
  21. if(pageData) {
  22. res.render('pages/edit', { pageData });
  23. } else {
  24. throw new Error('Invalid page path.');
  25. }
  26. return true;
  27. }).catch((err) => {
  28. res.render('error', {
  29. message: err.message,
  30. error: {}
  31. });
  32. });
  33. });
  34. router.put('/edit/*', (req, res, next) => {
  35. let safePath = entries.parsePath(_.replace(req.path, '/edit', ''));
  36. entries.update(safePath, req.body.markdown).then(() => {
  37. res.json({
  38. ok: true
  39. });
  40. }).catch((err) => {
  41. res.json({
  42. ok: false,
  43. error: err.message
  44. });
  45. });
  46. });
  47. // ==========================================
  48. // CREATE MODE
  49. // ==========================================
  50. router.get('/create/*', (req, res, next) => {
  51. if(_.some(['create','edit','account','source','history','mk'], (e) => { return _.startsWith(req.path, '/create/' + e); })) {
  52. return res.render('error', {
  53. message: 'You cannot create a document with this name as it is reserved by the system.',
  54. error: {}
  55. });
  56. }
  57. let safePath = entries.parsePath(_.replace(req.path, '/create', ''));
  58. entries.exists(safePath).then((docExists) => {
  59. if(!docExists) {
  60. return entries.getStarter(safePath).then((contents) => {
  61. let pageData = {
  62. markdown: contents,
  63. meta: {
  64. title: _.startCase(safePath),
  65. path: safePath
  66. }
  67. };
  68. res.render('pages/create', { pageData });
  69. return true;
  70. }).catch((err) => {
  71. throw new Error('Could not load starter content!');
  72. });
  73. } else {
  74. throw new Error('This entry already exists!');
  75. }
  76. }).catch((err) => {
  77. res.render('error', {
  78. message: err.message,
  79. error: {}
  80. });
  81. });
  82. });
  83. router.put('/create/*', (req, res, next) => {
  84. let safePath = entries.parsePath(_.replace(req.path, '/create', ''));
  85. entries.create(safePath, req.body.markdown).then(() => {
  86. res.json({
  87. ok: true
  88. });
  89. }).catch((err) => {
  90. res.json({
  91. ok: false,
  92. error: err.message
  93. });
  94. });
  95. });
  96. // ==========================================
  97. // VIEW MODE
  98. // ==========================================
  99. /**
  100. * View source of a document
  101. */
  102. router.get('/source/*', (req, res, next) => {
  103. let safePath = entries.parsePath(_.replace(req.path, '/source', ''));
  104. entries.fetchOriginal(safePath, {
  105. parseMarkdown: false,
  106. parseMeta: true,
  107. parseTree: false,
  108. includeMarkdown: true,
  109. includeParentInfo: false,
  110. cache: false
  111. }).then((pageData) => {
  112. if(pageData) {
  113. res.render('pages/source', { pageData });
  114. } else {
  115. throw new Error('Invalid page path.');
  116. }
  117. return true;
  118. }).catch((err) => {
  119. res.render('error', {
  120. message: err.message,
  121. error: {}
  122. });
  123. });
  124. });
  125. /**
  126. * View document
  127. */
  128. router.get('/*', (req, res, next) => {
  129. let safePath = entries.parsePath(req.path);
  130. entries.fetch(safePath).then((pageData) => {
  131. if(pageData) {
  132. res.render('pages/view', { pageData });
  133. } else {
  134. res.render('error-notexist', {
  135. newpath: safePath
  136. });
  137. }
  138. return true;
  139. }).error((err) => {
  140. if(safePath === 'home') {
  141. res.render('pages/welcome');
  142. } else {
  143. res.render('error-notexist', {
  144. message: err.message,
  145. newpath: safePath
  146. });
  147. }
  148. }).catch((err) => {
  149. res.render('error', {
  150. message: err.message,
  151. error: {}
  152. });
  153. });
  154. });
  155. /**
  156. * Move document
  157. */
  158. router.put('/*', (req, res, next) => {
  159. let safePath = entries.parsePath(req.path);
  160. if(_.isEmpty(req.body.move)) {
  161. return res.json({
  162. ok: false,
  163. error: 'Invalid document action call.'
  164. });
  165. }
  166. let safeNewPath = entries.parsePath(req.body.move);
  167. entries.move(safePath, safeNewPath).then(() => {
  168. res.json({
  169. ok: true
  170. });
  171. }).catch((err) => {
  172. res.json({
  173. ok: false,
  174. error: err.message
  175. });
  176. });
  177. });
  178. module.exports = router;