| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 | 'use strict'const express = require('express')const router = express.Router()const _ = require('lodash')// ==========================================// EDIT MODE// ==========================================/** * Edit document in Markdown */router.get('/edit/*', (req, res, next) => {  if (!res.locals.rights.write) {    return res.render('error-forbidden')  }  let safePath = entries.parsePath(_.replace(req.path, '/edit', ''))  entries.fetchOriginal(safePath, {    parseMarkdown: false,    parseMeta: true,    parseTree: false,    includeMarkdown: true,    includeParentInfo: false,    cache: false  }).then((pageData) => {    if (pageData) {      res.render('pages/edit', { pageData })    } else {      throw new Error('Invalid page path.')    }    return true  }).catch((err) => {    res.render('error', {      message: err.message,      error: {}    })  })})router.put('/edit/*', (req, res, next) => {  if (!res.locals.rights.write) {    return res.json({      ok: false,      error: 'Forbidden'    })  }  let safePath = entries.parsePath(_.replace(req.path, '/edit', ''))  entries.update(safePath, req.body.markdown).then(() => {    return res.json({      ok: true    }) || true  }).catch((err) => {    res.json({      ok: false,      error: err.message    })  })})// ==========================================// CREATE MODE// ==========================================router.get('/create/*', (req, res, next) => {  if (!res.locals.rights.write) {    return res.render('error-forbidden')  }  if (_.some(['create', 'edit', 'account', 'source', 'history', 'mk', 'all'], (e) => { return _.startsWith(req.path, '/create/' + e) })) {    return res.render('error', {      message: 'You cannot create a document with this name as it is reserved by the system.',      error: {}    })  }  let safePath = entries.parsePath(_.replace(req.path, '/create', ''))  entries.exists(safePath).then((docExists) => {    if (!docExists) {      return entries.getStarter(safePath).then((contents) => {        let pageData = {          markdown: contents,          meta: {            title: _.startCase(safePath),            path: safePath          }        }        res.render('pages/create', { pageData })        return true      }).catch((err) => {        winston.warn(err)        throw new Error('Could not load starter content!')      })    } else {      throw new Error('This entry already exists!')    }  }).catch((err) => {    res.render('error', {      message: err.message,      error: {}    })  })})router.put('/create/*', (req, res, next) => {  if (!res.locals.rights.write) {    return res.json({      ok: false,      error: 'Forbidden'    })  }  let safePath = entries.parsePath(_.replace(req.path, '/create', ''))  entries.create(safePath, req.body.markdown).then(() => {    return res.json({      ok: true    }) || true  }).catch((err) => {    return res.json({      ok: false,      error: err.message    })  })})// ==========================================// LIST ALL PAGES// ==========================================/** * View list view of all pages */router.get('/all', (req, res, next) => {  entries.getFromTree('/').then((pageData) => {    res.render('pages/all', { pageData })    return true  }).catch((err) => {    res.render('error', {      message: err.message,      error: {}    })  })})// ==========================================// VIEW MODE// ==========================================/** * View source of a document */router.get('/source/*', (req, res, next) => {  let safePath = entries.parsePath(_.replace(req.path, '/source', ''))  entries.fetchOriginal(safePath, {    parseMarkdown: false,    parseMeta: true,    parseTree: false,    includeMarkdown: true,    includeParentInfo: false,    cache: false  }).then((pageData) => {    if (pageData) {      res.render('pages/source', { pageData })    } else {      throw new Error('Invalid page path.')    }    return true  }).catch((err) => {    res.render('error', {      message: err.message,      error: {}    })  })})/** * View document */router.get('/*', (req, res, next) => {  let safePath = entries.parsePath(req.path)  entries.fetch(safePath).then((pageData) => {    if (pageData) {      res.render('pages/view', { pageData })    } else {      res.render('error-notexist', {        newpath: safePath      })    }    return true  }).error((err) => {    if (safePath === 'home') {      res.render('pages/welcome')    } else {      res.render('error-notexist', {        message: err.message,        newpath: safePath      })    }    return true  }).catch((err) => {    res.render('error', {      message: err.message,      error: {}    })  })})/** * Move document */router.put('/*', (req, res, next) => {  if (!res.locals.rights.write) {    return res.json({      ok: false,      error: 'Forbidden'    })  }  let safePath = entries.parsePath(req.path)  if (_.isEmpty(req.body.move)) {    return res.json({      ok: false,      error: 'Invalid document action call.'    })  }  let safeNewPath = entries.parsePath(req.body.move)  entries.move(safePath, safeNewPath).then(() => {    res.json({      ok: true    })  }).catch((err) => {    res.json({      ok: false,      error: err.message    })  })})module.exports = router
 |