From cf2f1e956a723e5446ad4bf016e7b8bd9b747b96 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Fri, 21 Aug 2020 15:29:40 -0400 Subject: [PATCH] refactor: changed way middleware was exported --- src/middleware/admin.js | 10 +- src/middleware/header.js | 372 +++++++++++++++++++-------------------- src/middleware/index.js | 6 +- 3 files changed, 196 insertions(+), 192 deletions(-) diff --git a/src/middleware/admin.js b/src/middleware/admin.js index 3b2a68a4555b..fe06bf053c87 100644 --- a/src/middleware/admin.js +++ b/src/middleware/admin.js @@ -18,13 +18,15 @@ var controllers = { helpers: require('../controllers/helpers'), }; -module.exports.buildHeader = helpers.try(async function (req, res, next) { +const middleware = module.exports; + +middleware.buildHeader = helpers.try(async function (req, res, next) { res.locals.renderAdminHeader = true; res.locals.config = await controllers.api.loadConfig(req); next(); }); -module.exports.renderHeader = async (req, res, data) => { +middleware.renderHeader = async (req, res, data) => { var custom_header = { plugins: [], authentication: [], @@ -96,11 +98,11 @@ async function getLatestVersion() { return null; } -module.exports.renderFooter = async function (req, res, data) { +middleware.renderFooter = async function (req, res, data) { return await req.app.renderAsync('admin/footer', data); }; -module.exports.checkPrivileges = async (req, res, next) => { +middleware.checkPrivileges = async (req, res, next) => { // Kick out guests, obviously if (!req.uid) { return controllers.helpers.notAllowed(req, res); diff --git a/src/middleware/header.js b/src/middleware/header.js index 5a62881461c1..f79d4684961b 100644 --- a/src/middleware/header.js +++ b/src/middleware/header.js @@ -24,211 +24,211 @@ var controllers = { helpers: require('../controllers/helpers'), }; -module.exports = function (middleware) { - middleware.buildHeader = helpers.try(async function buildHeader(req, res, next) { - res.locals.renderHeader = true; - res.locals.isAPI = false; - const [config] = await Promise.all([ - controllers.api.loadConfig(req), - plugins.fireHook('filter:middleware.buildHeader', { req: req, locals: res.locals }), - ]); - res.locals.config = config; - next(); - }); +const middleware = module.exports; + +middleware.buildHeader = helpers.try(async function buildHeader(req, res, next) { + res.locals.renderHeader = true; + res.locals.isAPI = false; + const [config] = await Promise.all([ + controllers.api.loadConfig(req), + plugins.fireHook('filter:middleware.buildHeader', { req: req, locals: res.locals }), + ]); + res.locals.config = config; + next(); +}); + +middleware.buildHeaderAsync = util.promisify(middleware.buildHeader); + +async function generateHeader(req, res, data) { + var registrationType = meta.config.registrationType || 'normal'; + res.locals.config = res.locals.config || {}; + var templateValues = { + title: meta.config.title || '', + 'title:url': meta.config['title:url'] || '', + description: meta.config.description || '', + 'cache-buster': meta.config['cache-buster'] || '', + 'brand:logo': meta.config['brand:logo'] || '', + 'brand:logo:url': meta.config['brand:logo:url'] || '', + 'brand:logo:alt': meta.config['brand:logo:alt'] || '', + 'brand:logo:display': meta.config['brand:logo'] ? '' : 'hide', + allowRegistration: registrationType === 'normal', + searchEnabled: plugins.hasListeners('filter:search.query'), + config: res.locals.config, + relative_path: nconf.get('relative_path'), + bodyClass: data.bodyClass, + }; - middleware.buildHeaderAsync = util.promisify(middleware.buildHeader); - - async function generateHeader(req, res, data) { - var registrationType = meta.config.registrationType || 'normal'; - res.locals.config = res.locals.config || {}; - var templateValues = { - title: meta.config.title || '', - 'title:url': meta.config['title:url'] || '', - description: meta.config.description || '', - 'cache-buster': meta.config['cache-buster'] || '', - 'brand:logo': meta.config['brand:logo'] || '', - 'brand:logo:url': meta.config['brand:logo:url'] || '', - 'brand:logo:alt': meta.config['brand:logo:alt'] || '', - 'brand:logo:display': meta.config['brand:logo'] ? '' : 'hide', - allowRegistration: registrationType === 'normal', - searchEnabled: plugins.hasListeners('filter:search.query'), - config: res.locals.config, - relative_path: nconf.get('relative_path'), - bodyClass: data.bodyClass, - }; - - templateValues.configJSON = jsesc(JSON.stringify(res.locals.config), { isScriptContext: true }); - - const results = await utils.promiseParallel({ - isAdmin: user.isAdministrator(req.uid), - isGlobalMod: user.isGlobalModerator(req.uid), - isModerator: user.isModeratorOfAnyCategory(req.uid), - privileges: privileges.global.get(req.uid), - user: user.getUserData(req.uid), - isEmailConfirmSent: (!meta.config.requireEmailConfirmation || req.uid <= 0) ? false : await db.get('uid:' + req.uid + ':confirm:email:sent'), - languageDirection: translator.translate('[[language:dir]]', res.locals.config.userLang), - browserTitle: translator.translate(controllers.helpers.buildTitle(translator.unescape(data.title))), - navigation: navigation.get(req.uid), - banned: user.bans.isBanned(req.uid), - banReason: user.bans.getReason(req.uid), - - unreadData: topics.getUnreadData({ uid: req.uid }), - unreadChatCount: messaging.getUnreadCount(req.uid), - unreadNotificationCount: user.notifications.getUnreadCount(req.uid), - }); + templateValues.configJSON = jsesc(JSON.stringify(res.locals.config), { isScriptContext: true }); + + const results = await utils.promiseParallel({ + isAdmin: user.isAdministrator(req.uid), + isGlobalMod: user.isGlobalModerator(req.uid), + isModerator: user.isModeratorOfAnyCategory(req.uid), + privileges: privileges.global.get(req.uid), + user: user.getUserData(req.uid), + isEmailConfirmSent: (!meta.config.requireEmailConfirmation || req.uid <= 0) ? false : await db.get('uid:' + req.uid + ':confirm:email:sent'), + languageDirection: translator.translate('[[language:dir]]', res.locals.config.userLang), + browserTitle: translator.translate(controllers.helpers.buildTitle(translator.unescape(data.title))), + navigation: navigation.get(req.uid), + banned: user.bans.isBanned(req.uid), + banReason: user.bans.getReason(req.uid), + + unreadData: topics.getUnreadData({ uid: req.uid }), + unreadChatCount: messaging.getUnreadCount(req.uid), + unreadNotificationCount: user.notifications.getUnreadCount(req.uid), + }); - if (results.banned) { - req.logout(); - return res.redirect('/'); - } + if (results.banned) { + req.logout(); + return res.redirect('/'); + } - const unreadData = { - '': {}, - new: {}, - watched: {}, - unreplied: {}, - }; - - results.user.unreadData = unreadData; - results.user.isAdmin = results.isAdmin; - results.user.isGlobalMod = results.isGlobalMod; - results.user.isMod = !!results.isModerator; - results.user.privileges = results.privileges; - results.user[results.user.status] = true; - - results.user.email = String(results.user.email); - results.user['email:confirmed'] = results.user['email:confirmed'] === 1; - results.user.isEmailConfirmSent = !!results.isEmailConfirmSent; - - templateValues.bootswatchSkin = (parseInt(meta.config.disableCustomUserSkins, 10) !== 1 ? res.locals.config.bootswatchSkin : '') || meta.config.bootswatchSkin || ''; - templateValues.config.bootswatchSkin = templateValues.bootswatchSkin || 'noskin'; // TODO remove in v1.12.0+ - - const unreadCounts = results.unreadData.counts; - const unreadCount = { - topic: unreadCounts[''] || 0, - newTopic: unreadCounts.new || 0, - watchedTopic: unreadCounts.watched || 0, - unrepliedTopic: unreadCounts.unreplied || 0, - chat: results.unreadChatCount || 0, - notification: results.unreadNotificationCount || 0, - }; - - Object.keys(unreadCount).forEach(function (key) { - if (unreadCount[key] > 99) { - unreadCount[key] = '99+'; - } - }); + const unreadData = { + '': {}, + new: {}, + watched: {}, + unreplied: {}, + }; - const tidsByFilter = results.unreadData.tidsByFilter; - results.navigation = results.navigation.map(function (item) { - function modifyNavItem(item, route, filter, content) { - if (item && validator.unescape(item.originalRoute) === route) { - unreadData[filter] = _.zipObject(tidsByFilter[filter], tidsByFilter[filter].map(() => true)); - item.content = content; - if (unreadCounts[filter] > 0) { - item.iconClass += ' unread-count'; - } - } - } - modifyNavItem(item, '/unread', '', unreadCount.topic); - modifyNavItem(item, '/unread?filter=new', 'new', unreadCount.newTopic); - modifyNavItem(item, '/unread?filter=watched', 'watched', unreadCount.watchedTopic); - modifyNavItem(item, '/unread?filter=unreplied', 'unreplied', unreadCount.unrepliedTopic); - return item; - }); + results.user.unreadData = unreadData; + results.user.isAdmin = results.isAdmin; + results.user.isGlobalMod = results.isGlobalMod; + results.user.isMod = !!results.isModerator; + results.user.privileges = results.privileges; + results.user[results.user.status] = true; + + results.user.email = String(results.user.email); + results.user['email:confirmed'] = results.user['email:confirmed'] === 1; + results.user.isEmailConfirmSent = !!results.isEmailConfirmSent; + + templateValues.bootswatchSkin = (parseInt(meta.config.disableCustomUserSkins, 10) !== 1 ? res.locals.config.bootswatchSkin : '') || meta.config.bootswatchSkin || ''; + templateValues.config.bootswatchSkin = templateValues.bootswatchSkin || 'noskin'; // TODO remove in v1.12.0+ + + const unreadCounts = results.unreadData.counts; + const unreadCount = { + topic: unreadCounts[''] || 0, + newTopic: unreadCounts.new || 0, + watchedTopic: unreadCounts.watched || 0, + unrepliedTopic: unreadCounts.unreplied || 0, + chat: results.unreadChatCount || 0, + notification: results.unreadNotificationCount || 0, + }; - templateValues.browserTitle = results.browserTitle; - templateValues.navigation = results.navigation; - templateValues.unreadCount = unreadCount; - templateValues.isAdmin = results.user.isAdmin; - templateValues.isGlobalMod = results.user.isGlobalMod; - templateValues.showModMenu = results.user.isAdmin || results.user.isGlobalMod || results.user.isMod; - templateValues.canChat = results.canChat && meta.config.disableChat !== 1; - templateValues.user = results.user; - templateValues.userJSON = jsesc(JSON.stringify(results.user), { isScriptContext: true }); - templateValues.useCustomCSS = meta.config.useCustomCSS && meta.config.customCSS; - templateValues.customCSS = templateValues.useCustomCSS ? (meta.config.renderedCustomCSS || '') : ''; - templateValues.useCustomHTML = meta.config.useCustomHTML; - templateValues.customHTML = templateValues.useCustomHTML ? meta.config.customHTML : ''; - templateValues.maintenanceHeader = meta.config.maintenanceMode && !results.isAdmin; - templateValues.defaultLang = meta.config.defaultLang || 'en-GB'; - templateValues.userLang = res.locals.config.userLang; - templateValues.languageDirection = results.languageDirection; - - templateValues.template = { name: res.locals.template }; - templateValues.template[res.locals.template] = true; - - if (data.hasOwnProperty('_header')) { - templateValues.metaTags = data._header.tags.meta; - templateValues.linkTags = data._header.tags.link; + Object.keys(unreadCount).forEach(function (key) { + if (unreadCount[key] > 99) { + unreadCount[key] = '99+'; } + }); - if (req.route && req.route.path === '/') { - modifyTitle(templateValues); + const tidsByFilter = results.unreadData.tidsByFilter; + results.navigation = results.navigation.map(function (item) { + function modifyNavItem(item, route, filter, content) { + if (item && validator.unescape(item.originalRoute) === route) { + unreadData[filter] = _.zipObject(tidsByFilter[filter], tidsByFilter[filter].map(() => true)); + item.content = content; + if (unreadCounts[filter] > 0) { + item.iconClass += ' unread-count'; + } + } } + modifyNavItem(item, '/unread', '', unreadCount.topic); + modifyNavItem(item, '/unread?filter=new', 'new', unreadCount.newTopic); + modifyNavItem(item, '/unread?filter=watched', 'watched', unreadCount.watchedTopic); + modifyNavItem(item, '/unread?filter=unreplied', 'unreplied', unreadCount.unrepliedTopic); + return item; + }); - const hookReturn = await plugins.fireHook('filter:middleware.renderHeader', { - req: req, - res: res, - templateValues: templateValues, - data: data, - }); + templateValues.browserTitle = results.browserTitle; + templateValues.navigation = results.navigation; + templateValues.unreadCount = unreadCount; + templateValues.isAdmin = results.user.isAdmin; + templateValues.isGlobalMod = results.user.isGlobalMod; + templateValues.showModMenu = results.user.isAdmin || results.user.isGlobalMod || results.user.isMod; + templateValues.canChat = results.canChat && meta.config.disableChat !== 1; + templateValues.user = results.user; + templateValues.userJSON = jsesc(JSON.stringify(results.user), { isScriptContext: true }); + templateValues.useCustomCSS = meta.config.useCustomCSS && meta.config.customCSS; + templateValues.customCSS = templateValues.useCustomCSS ? (meta.config.renderedCustomCSS || '') : ''; + templateValues.useCustomHTML = meta.config.useCustomHTML; + templateValues.customHTML = templateValues.useCustomHTML ? meta.config.customHTML : ''; + templateValues.maintenanceHeader = meta.config.maintenanceMode && !results.isAdmin; + templateValues.defaultLang = meta.config.defaultLang || 'en-GB'; + templateValues.userLang = res.locals.config.userLang; + templateValues.languageDirection = results.languageDirection; + + templateValues.template = { name: res.locals.template }; + templateValues.template[res.locals.template] = true; + + if (data.hasOwnProperty('_header')) { + templateValues.metaTags = data._header.tags.meta; + templateValues.linkTags = data._header.tags.link; + } - return hookReturn.templateValues; + if (req.route && req.route.path === '/') { + modifyTitle(templateValues); } - middleware.renderHeader = async function renderHeader(req, res, data) { - return await req.app.renderAsync('header', await generateHeader(req, res, data)); - }; + const hookReturn = await plugins.fireHook('filter:middleware.renderHeader', { + req: req, + res: res, + templateValues: templateValues, + data: data, + }); - middleware.renderFooter = async function renderFooter(req, res, templateValues) { - const data = await plugins.fireHook('filter:middleware.renderFooter', { - req: req, - res: res, - templateValues: templateValues, - }); + return hookReturn.templateValues; +} - const results = await utils.promiseParallel({ - scripts: plugins.fireHook('filter:scripts.get', []), - timeagoLocale: (async () => { - const languageCodes = await languages.listCodes(); - const userLang = res.locals.config.userLang; - const timeagoCode = utils.userLangToTimeagoCode(userLang); +middleware.renderHeader = async function renderHeader(req, res, data) { + return await req.app.renderAsync('header', await generateHeader(req, res, data)); +}; - if (languageCodes.includes(userLang) && languages.timeagoCodes.includes(timeagoCode)) { - const pathToLocaleFile = '/vendor/jquery/timeago/locales/jquery.timeago.' + timeagoCode + '.js'; - return res.locals.config.assetBaseUrl + pathToLocaleFile; - } - return false; - })(), - }); +middleware.renderFooter = async function renderFooter(req, res, templateValues) { + const data = await plugins.fireHook('filter:middleware.renderFooter', { + req: req, + res: res, + templateValues: templateValues, + }); - if (results.timeagoLocale) { - results.scripts.push(results.timeagoLocale); - } - data.templateValues.scripts = results.scripts.map(function (script) { - return { src: script }; - }); + const results = await utils.promiseParallel({ + scripts: plugins.fireHook('filter:scripts.get', []), + timeagoLocale: (async () => { + const languageCodes = await languages.listCodes(); + const userLang = res.locals.config.userLang; + const timeagoCode = utils.userLangToTimeagoCode(userLang); - data.templateValues.useCustomJS = meta.config.useCustomJS; - data.templateValues.customJS = data.templateValues.useCustomJS ? meta.config.customJS : ''; - data.templateValues.isSpider = req.uid === -1; + if (languageCodes.includes(userLang) && languages.timeagoCodes.includes(timeagoCode)) { + const pathToLocaleFile = '/vendor/jquery/timeago/locales/jquery.timeago.' + timeagoCode + '.js'; + return res.locals.config.assetBaseUrl + pathToLocaleFile; + } + return false; + })(), + }); - return await req.app.renderAsync('footer', data.templateValues); - }; + if (results.timeagoLocale) { + results.scripts.push(results.timeagoLocale); + } + data.templateValues.scripts = results.scripts.map(function (script) { + return { src: script }; + }); - function modifyTitle(obj) { - var title = controllers.helpers.buildTitle(meta.config.homePageTitle || '[[pages:home]]'); - obj.browserTitle = title; + data.templateValues.useCustomJS = meta.config.useCustomJS; + data.templateValues.customJS = data.templateValues.useCustomJS ? meta.config.customJS : ''; + data.templateValues.isSpider = req.uid === -1; - if (obj.metaTags) { - obj.metaTags.forEach(function (tag, i) { - if (tag.property === 'og:title') { - obj.metaTags[i].content = title; - } - }); - } + return await req.app.renderAsync('footer', data.templateValues); +}; - return title; +function modifyTitle(obj) { + var title = controllers.helpers.buildTitle(meta.config.homePageTitle || '[[pages:home]]'); + obj.browserTitle = title; + + if (obj.metaTags) { + obj.metaTags.forEach(function (tag, i) { + if (tag.property === 'og:title') { + obj.metaTags[i].content = title; + } + }); } -}; + + return title; +} diff --git a/src/middleware/index.js b/src/middleware/index.js index 04767c649348..bfc981ec0c36 100644 --- a/src/middleware/index.js +++ b/src/middleware/index.js @@ -51,8 +51,10 @@ middleware.applyCSRF = function (req, res, next) { middleware.ensureLoggedIn = ensureLoggedIn.ensureLoggedIn(nconf.get('relative_path') + '/login'); -middleware.admin = require('./admin'); -require('./header')(middleware); +Object.assign(middleware, { + admin: require('./admin'), + ...require('./header'), +}); require('./render')(middleware); require('./maintenance')(middleware); require('./user')(middleware);