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.

232 lines
4.9 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'], (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. // VIEW MODE
  117. // ==========================================
  118. /**
  119. * View source of a document
  120. */
  121. router.get('/source/*', (req, res, next) => {
  122. let safePath = entries.parsePath(_.replace(req.path, '/source', ''))
  123. entries.fetchOriginal(safePath, {
  124. parseMarkdown: false,
  125. parseMeta: true,
  126. parseTree: false,
  127. includeMarkdown: true,
  128. includeParentInfo: false,
  129. cache: false
  130. }).then((pageData) => {
  131. if (pageData) {
  132. res.render('pages/source', { pageData })
  133. } else {
  134. throw new Error('Invalid page path.')
  135. }
  136. return true
  137. }).catch((err) => {
  138. res.render('error', {
  139. message: err.message,
  140. error: {}
  141. })
  142. })
  143. })
  144. /**
  145. * View document
  146. */
  147. router.get('/*', (req, res, next) => {
  148. let safePath = entries.parsePath(req.path)
  149. entries.fetch(safePath).then((pageData) => {
  150. if (pageData) {
  151. res.render('pages/view', { pageData })
  152. } else {
  153. res.render('error-notexist', {
  154. newpath: safePath
  155. })
  156. }
  157. return true
  158. }).error((err) => {
  159. if (safePath === 'home') {
  160. res.render('pages/welcome')
  161. } else {
  162. res.render('error-notexist', {
  163. message: err.message,
  164. newpath: safePath
  165. })
  166. }
  167. return true
  168. }).catch((err) => {
  169. res.render('error', {
  170. message: err.message,
  171. error: {}
  172. })
  173. })
  174. })
  175. /**
  176. * Move document
  177. */
  178. router.put('/*', (req, res, next) => {
  179. if (!res.locals.rights.write) {
  180. return res.json({
  181. ok: false,
  182. error: 'Forbidden'
  183. })
  184. }
  185. let safePath = entries.parsePath(req.path)
  186. if (_.isEmpty(req.body.move)) {
  187. return res.json({
  188. ok: false,
  189. error: 'Invalid document action call.'
  190. })
  191. }
  192. let safeNewPath = entries.parsePath(req.body.move)
  193. entries.move(safePath, safeNewPath).then(() => {
  194. res.json({
  195. ok: true
  196. })
  197. }).catch((err) => {
  198. res.json({
  199. ok: false,
  200. error: err.message
  201. })
  202. })
  203. })
  204. module.exports = router