From 2890d9ccf0e413ff79ee4f30e53668f1d31d6331 Mon Sep 17 00:00:00 2001 From: Nick Date: Tue, 25 Jun 2019 22:48:23 -0400 Subject: [PATCH] fix: handle duplicate page entries without render content --- server/controllers/common.js | 54 +++++++++++++++++++----------------- server/jobs/render-page.js | 6 ++++ server/models/pages.js | 11 +++++++- 3 files changed, 45 insertions(+), 26 deletions(-) diff --git a/server/controllers/common.js b/server/controllers/common.js index e92e8ce9..82086fa6 100644 --- a/server/controllers/common.js +++ b/server/controllers/common.js @@ -160,35 +160,39 @@ router.get('/*', async (req, res, next) => { return res.status(403).render('unauthorized', { action: 'view' }) } - const page = await WIKI.models.pages.getPage({ - path: pageArgs.path, - locale: pageArgs.locale, - userId: req.user.id, - isPrivate: false - }) + try { + const page = await WIKI.models.pages.getPage({ + path: pageArgs.path, + locale: pageArgs.locale, + userId: req.user.id, + isPrivate: false + }) - _.set(res, 'locals.siteConfig.lang', pageArgs.locale) + _.set(res, 'locals.siteConfig.lang', pageArgs.locale) - if (page) { - _.set(res.locals, 'pageMeta.title', page.title) - _.set(res.locals, 'pageMeta.description', page.description) - const sidebar = await WIKI.models.navigation.getTree({ cache: true }) - const injectCode = { - css: WIKI.config.theming.injectCSS, - head: WIKI.config.theming.injectHead, - body: WIKI.config.theming.injectBody - } - res.render('page', { page, sidebar, injectCode }) - } else if (pageArgs.path === 'home') { - _.set(res.locals, 'pageMeta.title', 'Welcome') - res.render('welcome') - } else { - _.set(res.locals, 'pageMeta.title', 'Page Not Found') - if (WIKI.auth.checkAccess(req.user, ['write:pages'], pageArgs)) { - res.status(404).render('new', { pagePath: req.path }) + if (page) { + _.set(res.locals, 'pageMeta.title', page.title) + _.set(res.locals, 'pageMeta.description', page.description) + const sidebar = await WIKI.models.navigation.getTree({ cache: true }) + const injectCode = { + css: WIKI.config.theming.injectCSS, + head: WIKI.config.theming.injectHead, + body: WIKI.config.theming.injectBody + } + res.render('page', { page, sidebar, injectCode }) + } else if (pageArgs.path === 'home') { + _.set(res.locals, 'pageMeta.title', 'Welcome') + res.render('welcome') } else { - res.status(404).render('notfound', { action: 'view' }) + _.set(res.locals, 'pageMeta.title', 'Page Not Found') + if (WIKI.auth.checkAccess(req.user, ['write:pages'], pageArgs)) { + res.status(404).render('new', { pagePath: req.path }) + } else { + res.status(404).render('notfound', { action: 'view' }) + } } + } catch (err) { + next(err) } } else { if (!WIKI.auth.checkAccess(req.user, ['read:assets'], pageArgs)) { diff --git a/server/jobs/render-page.js b/server/jobs/render-page.js index 83751c2a..d21508d4 100644 --- a/server/jobs/render-page.js +++ b/server/jobs/render-page.js @@ -18,6 +18,12 @@ module.exports = async (pageId) => { const pipeline = await WIKI.models.renderers.getRenderingPipeline(page.contentType) let output = page.content + + if (_.isEmpty(page.content)) { + await WIKI.models.knex.destroy() + WIKI.logger.warn(`Failed to render page ID ${pageId} because content was empty: [ FAILED ]`) + } + for (let core of pipeline) { const renderer = require(`../modules/rendering/${_.kebabCase(core.key)}/renderer.js`) output = await renderer.render.call({ diff --git a/server/models/pages.js b/server/models/pages.js index a4b60e0a..f1ce213a 100644 --- a/server/models/pages.js +++ b/server/models/pages.js @@ -306,11 +306,20 @@ module.exports = class Page extends Model { } static async getPage(opts) { + // -> Get from cache first let page = await WIKI.models.pages.getPageFromCache(opts) if (!page) { + // -> Get from DB page = await WIKI.models.pages.getPageFromDb(opts) if (page) { - await WIKI.models.pages.savePageToCache(page) + if (page.render) { + // -> Save render to cache + await WIKI.models.pages.savePageToCache(page) + } else { + // -> No render? Possible duplicate issue + /* TODO: Detect duplicate and delete */ + throw new Error('Error while fetching page. Duplicate entry detected. Reload the page to try again.') + } } } return page