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.

247 lines
5.2 KiB

  1. 'use strict'
  2. const express = require('express')
  3. const router = express.Router()
  4. const _ = 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', 'all'], (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. winston.warn(err)
  84. throw new Error('Could not load starter content!')
  85. })
  86. } else {
  87. throw new Error('This entry already exists!')
  88. }
  89. }).catch((err) => {
  90. res.render('error', {
  91. message: err.message,
  92. error: {}
  93. })
  94. })
  95. })
  96. router.put('/create/*', (req, res, next) => {
  97. if (!res.locals.rights.write) {
  98. return res.json({
  99. ok: false,
  100. error: 'Forbidden'
  101. })
  102. }
  103. let safePath = entries.parsePath(_.replace(req.path, '/create', ''))
  104. entries.create(safePath, req.body.markdown).then(() => {
  105. return res.json({
  106. ok: true
  107. }) || true
  108. }).catch((err) => {
  109. return res.json({
  110. ok: false,
  111. error: err.message
  112. })
  113. })
  114. })
  115. // ==========================================
  116. // LIST ALL PAGES
  117. // ==========================================
  118. /**
  119. * View tree view of all pages
  120. */
  121. router.use((req, res, next) => {
  122. if (_.endsWith(req.url, '/all')) {
  123. res.render('pages/all')
  124. } else {
  125. next()
  126. }
  127. })
  128. // ==========================================
  129. // VIEW MODE
  130. // ==========================================
  131. /**
  132. * View source of a document
  133. */
  134. router.get('/source/*', (req, res, next) => {
  135. let safePath = entries.parsePath(_.replace(req.path, '/source', ''))
  136. entries.fetchOriginal(safePath, {
  137. parseMarkdown: false,
  138. parseMeta: true,
  139. parseTree: false,
  140. includeMarkdown: true,
  141. includeParentInfo: false,
  142. cache: false
  143. }).then((pageData) => {
  144. if (pageData) {
  145. res.render('pages/source', { pageData })
  146. } else {
  147. throw new Error('Invalid page path.')
  148. }
  149. return true
  150. }).catch((err) => {
  151. res.render('error', {
  152. message: err.message,
  153. error: {}
  154. })
  155. })
  156. })
  157. /**
  158. * View document
  159. */
  160. router.get('/*', (req, res, next) => {
  161. let safePath = entries.parsePath(req.path)
  162. entries.fetch(safePath).then((pageData) => {
  163. if (pageData) {
  164. res.render('pages/view', { pageData })
  165. } else {
  166. res.render('error-notexist', {
  167. newpath: safePath
  168. })
  169. }
  170. return true
  171. }).error((err) => {
  172. if (safePath === 'home') {
  173. res.render('pages/welcome')
  174. } else {
  175. res.render('error-notexist', {
  176. message: err.message,
  177. newpath: safePath
  178. })
  179. }
  180. return true
  181. }).catch((err) => {
  182. res.render('error', {
  183. message: err.message,
  184. error: {}
  185. })
  186. })
  187. })
  188. /**
  189. * Move document
  190. */
  191. router.put('/*', (req, res, next) => {
  192. if (!res.locals.rights.write) {
  193. return res.json({
  194. ok: false,
  195. error: 'Forbidden'
  196. })
  197. }
  198. let safePath = entries.parsePath(req.path)
  199. if (_.isEmpty(req.body.move)) {
  200. return res.json({
  201. ok: false,
  202. error: 'Invalid document action call.'
  203. })
  204. }
  205. let safeNewPath = entries.parsePath(req.body.move)
  206. entries.move(safePath, safeNewPath).then(() => {
  207. res.json({
  208. ok: true
  209. })
  210. }).catch((err) => {
  211. res.json({
  212. ok: false,
  213. error: err.message
  214. })
  215. })
  216. })
  217. module.exports = router