feat: view version of page source
This commit is contained in:
@@ -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}`)
|
||||
}
|
||||
|
9
server/db/migrations-sqlite/2.2.17.js
Normal file
9
server/db/migrations-sqlite/2.2.17.js
Normal 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 => { }
|
22
server/db/migrations/2.2.17.js
Normal file
22
server/db/migrations/2.2.17.js
Normal 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 => { }
|
@@ -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!
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
)
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user