feat: view version of page source

This commit is contained in:
NGPixel
2020-02-29 18:57:54 -05:00
committed by Nicolas Giard
parent 2ac9131244
commit e50dc89519
10 changed files with 188 additions and 30 deletions

View File

@@ -226,6 +226,8 @@ router.get(['/p', '/p/*'], (req, res, next) => {
*/
router.get(['/s', '/s/*'], async (req, res, next) => {
const pageArgs = pageHelper.parsePath(req.path, { stripExt: true })
const versionId = (req.query.v) ? _.toSafeInteger(req.query.v) : 0
const page = await WIKI.models.pages.getPageFromDb({
path: pageArgs.path,
locale: pageArgs.locale,
@@ -242,14 +244,34 @@ router.get(['/s', '/s/*'], async (req, res, next) => {
_.set(res, 'locals.siteConfig.lang', pageArgs.locale)
_.set(res, 'locals.siteConfig.rtl', req.i18n.dir() === 'rtl')
if (!WIKI.auth.checkAccess(req.user, ['read:source'], pageArgs)) {
return res.render('unauthorized', { action: 'source' })
if (versionId > 0) {
if (!WIKI.auth.checkAccess(req.user, ['read:history'], pageArgs)) {
_.set(res.locals, 'pageMeta.title', 'Unauthorized')
return res.render('unauthorized', { action: 'sourceVersion' })
}
} else {
if (!WIKI.auth.checkAccess(req.user, ['read:source'], pageArgs)) {
_.set(res.locals, 'pageMeta.title', 'Unauthorized')
return res.render('unauthorized', { action: 'source' })
}
}
if (page) {
_.set(res.locals, 'pageMeta.title', page.title)
_.set(res.locals, 'pageMeta.description', page.description)
res.render('source', { page })
if (versionId > 0) {
const pageVersion = await WIKI.models.pageHistory.getVersion({ pageId: page.id, versionId })
_.set(res.locals, 'pageMeta.title', pageVersion.title)
_.set(res.locals, 'pageMeta.description', pageVersion.description)
res.render('source', {
page: {
...page,
...pageVersion
}
})
} else {
_.set(res.locals, 'pageMeta.title', page.title)
_.set(res.locals, 'pageMeta.description', page.description)
res.render('source', { page })
}
} else {
res.redirect(`/${pageArgs.path}`)
}

View File

@@ -0,0 +1,9 @@
exports.up = knex => {
return knex.schema
.alterTable('pageHistory', table => {
table.string('versionDate').notNullable().defaultTo('')
})
.raw(`UPDATE pageHistory AS h1 INNER JOIN pageHistory AS h2 ON h2.id = (SELECT prev.id FROM pageHistory AS prev WHERE prev.pageId = h1.pageId AND prev.id < h1.id ORDER BY prev.id DESC LIMIT 1) SET h1.versionDate = h2.createdAt`)
}
exports.down = knex => { }

View File

@@ -0,0 +1,22 @@
/* global WIKI */
exports.up = knex => {
let sqlVersionDate = ''
switch (WIKI.config.db.type) {
case 'postgres':
case 'mssql':
sqlVersionDate = 'UPDATE "pageHistory" h1 SET "versionDate" = COALESCE((SELECT prev."createdAt" FROM "pageHistory" prev WHERE prev."pageId" = h1."pageId" AND prev.id < h1.id ORDER BY prev.id DESC LIMIT 1), h1.createdAt)'
break
case 'mysql':
case 'mariadb':
sqlVersionDate = `UPDATE pageHistory AS h1 INNER JOIN pageHistory AS h2 ON h2.id = (SELECT prev.id FROM pageHistory AS prev WHERE prev.pageId = h1.pageId AND prev.id < h1.id ORDER BY prev.id DESC LIMIT 1) SET h1.versionDate = h2.createdAt`
break
}
return knex.schema
.alterTable('pageHistory', table => {
table.string('versionDate').notNullable().defaultTo('')
})
.raw(sqlVersionDate)
}
exports.down = knex => { }

View File

@@ -183,12 +183,12 @@ type PageTag {
type PageHistory {
versionId: Int!
versionDate: Date!
authorId: Int!
authorName: String!
actionType: String!
valueBefore: String
valueAfter: String
createdAt: Date!
}
type PageVersion {
@@ -198,6 +198,7 @@ type PageVersion {
content: String!
contentType: String!
createdAt: Date!
versionDate: Date!
description: String!
editor: String!
isPrivate: Boolean!

View File

@@ -100,7 +100,8 @@ module.exports = class PageHistory extends Model {
publishEndDate: opts.publishEndDate || '',
publishStartDate: opts.publishStartDate || '',
title: opts.title,
action: opts.action || 'updated'
action: opts.action || 'updated',
versionDate: opts.versionDate
})
}
@@ -120,6 +121,7 @@ module.exports = class PageHistory extends Model {
'pageHistory.action',
'pageHistory.authorId',
'pageHistory.pageId',
'pageHistory.versionDate',
{
versionId: 'pageHistory.id',
editor: 'pageHistory.editorKey',
@@ -146,7 +148,7 @@ module.exports = class PageHistory extends Model {
'pageHistory.path',
'pageHistory.authorId',
'pageHistory.action',
'pageHistory.createdAt',
'pageHistory.versionDate',
{
authorName: 'author.name'
}
@@ -155,7 +157,7 @@ module.exports = class PageHistory extends Model {
.where({
'pageHistory.pageId': pageId
})
.orderBy('pageHistory.createdAt', 'desc')
.orderBy('pageHistory.versionDate', 'desc')
.page(offsetPage, offsetSize)
let prevPh = null
@@ -168,7 +170,7 @@ module.exports = class PageHistory extends Model {
'pageHistory.path',
'pageHistory.authorId',
'pageHistory.action',
'pageHistory.createdAt',
'pageHistory.versionDate',
{
authorName: 'author.name'
}
@@ -177,7 +179,7 @@ module.exports = class PageHistory extends Model {
.where({
'pageHistory.pageId': pageId
})
.orderBy('pageHistory.createdAt', 'desc')
.orderBy('pageHistory.versionDate', 'desc')
.offset((offsetPage + 1) * offsetSize)
.limit(1)
.first()
@@ -204,7 +206,7 @@ module.exports = class PageHistory extends Model {
actionType,
valueBefore,
valueAfter,
createdAt: ph.createdAt
versionDate: ph.versionDate
})
prevPh = ph

View File

@@ -8,5 +8,13 @@ block body
:page-id=page.id
locale=page.localeCode
path=page.path
title=page.title
description=page.description
:tags=page.tags
created-at=page.createdAt
updated-at=page.updatedAt
author-name=page.authorName
:author-id=page.authorId
:is-published=page.isPublished.toString()
live-content=page.content
)

View File

@@ -8,4 +8,6 @@ block body
:page-id=page.id
locale=page.localeCode
path=page.path
:version-id=page.versionId
version-date=page.versionDate
)= page.content