pages.js 4.6 KB

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