You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

249 lines
5.3 KiB

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