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