wikijs-fork/server/controllers/pages.js

292 lines
6.3 KiB
JavaScript
Raw Normal View History

2017-02-09 01:52:37 +00:00
'use strict'
2016-08-17 03:56:08 +00:00
2017-07-06 04:10:41 +00:00
/* global entries, git, lang, winston */
2017-02-09 01:52:37 +00:00
const express = require('express')
const router = express.Router()
const _ = require('lodash')
2016-08-17 03:56:08 +00:00
2017-04-28 22:22:03 +00:00
const entryHelper = require('../helpers/entry')
2016-08-29 05:21:35 +00:00
// ==========================================
// EDIT MODE
// ==========================================
/**
* Edit document in Markdown
*/
router.get('/edit/*', (req, res, next) => {
2017-02-09 01:52:37 +00:00
if (!res.locals.rights.write) {
return res.render('error-forbidden')
}
2017-04-28 22:22:03 +00:00
let safePath = entryHelper.parsePath(_.replace(req.path, '/edit', ''))
2017-02-09 01:52:37 +00:00
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 {
2017-05-03 01:00:58 +00:00
throw new Error(lang.t('errors:invalidpath'))
2017-02-09 01:52:37 +00:00
}
return true
}).catch((err) => {
res.render('error', {
message: err.message,
error: {}
})
})
})
2016-08-29 05:21:35 +00:00
router.put('/edit/*', (req, res, next) => {
2017-02-09 01:52:37 +00:00
if (!res.locals.rights.write) {
return res.json({
ok: false,
2017-05-03 01:00:58 +00:00
error: lang.t('errors:forbidden')
2017-02-09 01:52:37 +00:00
})
}
2017-04-28 22:22:03 +00:00
let safePath = entryHelper.parsePath(_.replace(req.path, '/edit', ''))
2017-02-09 01:52:37 +00:00
entries.update(safePath, req.body.markdown, req.user).then(() => {
2017-02-09 01:52:37 +00:00
return res.json({
ok: true
}) || true
}).catch((err) => {
res.json({
ok: false,
error: err.message
})
})
})
2016-08-29 05:21:35 +00:00
// ==========================================
// CREATE MODE
// ==========================================
router.get('/create/*', (req, res, next) => {
2017-02-09 01:52:37 +00:00
if (!res.locals.rights.write) {
return res.render('error-forbidden')
}
2017-04-09 15:48:37 +00:00
if (_.some(['create', 'edit', 'account', 'source', 'history', 'mk', 'all'], (e) => { return _.startsWith(req.path, '/create/' + e) })) {
2017-02-09 01:52:37 +00:00
return res.render('error', {
2017-05-03 01:00:58 +00:00
message: lang.t('errors:reservedname'),
2017-02-09 01:52:37 +00:00
error: {}
})
}
2017-04-28 22:22:03 +00:00
let safePath = entryHelper.parsePath(_.replace(req.path, '/create', ''))
2017-02-09 01:52:37 +00:00
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)
2017-05-03 01:00:58 +00:00
throw new Error(lang.t('errors:starterfailed'))
2017-02-09 01:52:37 +00:00
})
} else {
2017-05-03 01:00:58 +00:00
throw new Error(lang.t('errors:alreadyexists'))
2017-02-09 01:52:37 +00:00
}
}).catch((err) => {
res.render('error', {
message: err.message,
error: {}
})
})
})
router.put('/create/*', (req, res, next) => {
2017-02-09 01:52:37 +00:00
if (!res.locals.rights.write) {
return res.json({
ok: false,
2017-05-03 01:00:58 +00:00
error: lang.t('errors:forbidden')
2017-02-09 01:52:37 +00:00
})
}
2017-04-28 22:22:03 +00:00
let safePath = entryHelper.parsePath(_.replace(req.path, '/create', ''))
2017-02-09 01:52:37 +00:00
entries.create(safePath, req.body.markdown, req.user).then(() => {
2017-02-09 01:52:37 +00:00
return res.json({
ok: true
}) || true
}).catch((err) => {
return res.json({
ok: false,
error: err.message
})
})
})
2017-04-09 15:48:37 +00:00
// ==========================================
// LIST ALL PAGES
// ==========================================
/**
2017-04-18 02:44:04 +00:00
* View tree view of all pages
2017-04-09 15:48:37 +00:00
*/
router.use((req, res, next) => {
if (_.endsWith(req.url, '/all')) {
res.render('pages/all')
} else {
next()
}
2017-04-09 15:48:37 +00:00
})
2016-08-29 05:21:35 +00:00
// ==========================================
// VIEW MODE
// ==========================================
/**
* View source of a document
*/
router.get('/source/*', (req, res, next) => {
2017-04-28 22:22:03 +00:00
let safePath = entryHelper.parsePath(_.replace(req.path, '/source', ''))
2017-02-09 01:52:37 +00:00
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 {
2017-05-03 01:00:58 +00:00
throw new Error(lang.t('errors:invalidpath'))
2017-02-09 01:52:37 +00:00
}
return true
}).catch((err) => {
res.render('error', {
message: err.message,
error: {}
})
})
})
/**
* View history of a document
*/
router.get('/hist/*', (req, res, next) => {
let safePath = entryHelper.parsePath(_.replace(req.path, '/hist', ''))
entries.getHistory(safePath).then((pageData) => {
if (pageData) {
res.render('pages/history', { pageData })
} else {
2017-05-03 01:00:58 +00:00
throw new Error(lang.t('errors:invalidpath'))
}
return true
}).catch((err) => {
res.render('error', {
message: err.message,
error: {}
})
})
})
2017-07-06 04:10:41 +00:00
/**
* View history of a document
*/
router.post('/hist', (req, res, next) => {
let commit = req.body.commit
let safePath = entryHelper.parsePath(req.body.path)
if (!/^[a-f0-9]{40}$/.test(commit)) {
return res.status(400).json({ ok: false, error: 'Invalid commit' })
}
git.getHistoryDiff(safePath, commit).then((diff) => {
res.json({ ok: true, diff })
return true
}).catch((err) => {
res.status(500).json({ ok: false, error: err.message })
})
})
2016-08-17 03:56:08 +00:00
/**
2016-08-29 05:21:35 +00:00
* View document
2016-08-17 03:56:08 +00:00
*/
router.get('/*', (req, res, next) => {
2017-04-28 22:22:03 +00:00
let safePath = entryHelper.parsePath(req.path)
2017-02-09 01:52:37 +00:00
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
2017-02-09 01:52:37 +00:00
}).catch((err) => {
res.render('error', {
message: err.message,
error: {}
})
})
})
2016-08-17 03:56:08 +00:00
2016-09-09 23:22:18 +00:00
/**
* Move document
*/
router.put('/*', (req, res, next) => {
2017-02-09 01:52:37 +00:00
if (!res.locals.rights.write) {
return res.json({
ok: false,
2017-05-03 01:00:58 +00:00
error: lang.t('errors:forbidden')
2017-02-09 01:52:37 +00:00
})
}
2017-04-28 22:22:03 +00:00
let safePath = entryHelper.parsePath(req.path)
2017-02-09 01:52:37 +00:00
if (_.isEmpty(req.body.move)) {
return res.json({
ok: false,
2017-05-03 01:00:58 +00:00
error: lang.t('errors:invalidaction')
2017-02-09 01:52:37 +00:00
})
}
2017-04-28 22:22:03 +00:00
let safeNewPath = entryHelper.parsePath(req.body.move)
2017-02-09 01:52:37 +00:00
entries.move(safePath, safeNewPath, req.user).then(() => {
2017-02-09 01:52:37 +00:00
res.json({
ok: true
})
}).catch((err) => {
res.json({
ok: false,
error: err.message
})
})
})
module.exports = router