From 98fff29869e1eecef4736e5f1ac0f7af948d3a64 Mon Sep 17 00:00:00 2001 From: barisusakli Date: Wed, 5 Oct 2016 15:22:35 +0300 Subject: [PATCH] closes #5082 --- src/middleware/admin.js | 17 ++--- src/middleware/header.js | 55 ++++++++-------- src/middleware/render.js | 136 +++++++++++++++++++++------------------ 3 files changed, 105 insertions(+), 103 deletions(-) diff --git a/src/middleware/admin.js b/src/middleware/admin.js index 5e4399f226..139bb2b83f 100644 --- a/src/middleware/admin.js +++ b/src/middleware/admin.js @@ -32,20 +32,12 @@ module.exports = function(middleware) { middleware.admin.buildHeader = function(req, res, next) { res.locals.renderAdminHeader = true; - async.parallel({ - config: function(next) { - controllers.api.getConfig(req, res, next); - }, - footer: function(next) { - req.app.render('admin/footer', {}, next); - } - }, function(err, results) { + controllers.api.getConfig(req, res, function(err, config) { if (err) { return next(err); } - res.locals.config = results.config; - res.locals.adminFooter = results.footer; + res.locals.config = config; next(); }); }; @@ -122,4 +114,9 @@ module.exports = function(middleware) { }); }); }; + + + middleware.admin.renderFooter = function(req, res, data, next) { + req.app.render('admin/footer', data, next); + }; }; diff --git a/src/middleware/header.js b/src/middleware/header.js index 57c532f83e..be56abc44b 100644 --- a/src/middleware/header.js +++ b/src/middleware/header.js @@ -2,14 +2,12 @@ var async = require('async'); var nconf = require('nconf'); -var validator = require('validator'); var db = require('../database'); var user = require('../user'); var meta = require('../meta'); var plugins = require('../plugins'); var navigation = require('../navigation'); -var translator = require('../../public/src/modules/translator'); var controllers = { api: require('../controllers/api'), @@ -21,34 +19,25 @@ module.exports = function(middleware) { middleware.buildHeader = function(req, res, next) { res.locals.renderHeader = true; res.locals.isAPI = false; - - middleware.applyCSRF(req, res, function() { - async.parallel({ - config: function(next) { - controllers.api.getConfig(req, res, next); - }, - footer: function(next) { - req.app.render('footer', { - loggedIn: !!req.uid, - title: validator.escape(String(meta.config.title || meta.config.browserTitle || 'NodeBB')) - }, next); - }, - plugins: function(next) { - plugins.fireHook('filter:middleware.buildHeader', {req: req, locals: res.locals}, next); - } - }, function(err, results) { - if (err) { - return next(err); - } - + async.waterfall([ + function(next) { + middleware.applyCSRF(req, res, next); + }, + function(next) { + async.parallel({ + config: function(next) { + controllers.api.getConfig(req, res, next); + }, + plugins: function(next) { + plugins.fireHook('filter:middleware.buildHeader', {req: req, locals: res.locals}, next); + } + }, next); + }, + function(results, next) { res.locals.config = results.config; - - translator.translate(results.footer, results.config.defaultLang, function(parsedTemplate) { - res.locals.footer = parsedTemplate; - next(); - }); - }); - }); + next(); + } + ], next); }; middleware.renderHeader = function(req, res, data, callback) { @@ -166,6 +155,14 @@ module.exports = function(middleware) { }); }; + middleware.renderFooter = function(req, res, data, callback) { + plugins.fireHook('filter:middleware.renderFooter', {templateValues: data, req: req, res: res}, function(err, data) { + if (err) { + return callback(err); + } + req.app.render('footer', data.templateValues, callback); + }); + }; function modifyTitle(obj) { var title = controllers.helpers.buildTitle('[[pages:home]]'); diff --git a/src/middleware/render.js b/src/middleware/render.js index b25f1d63f0..545aff6e4b 100644 --- a/src/middleware/render.js +++ b/src/middleware/render.js @@ -1,5 +1,6 @@ 'use strict'; +var async = require('async'); var nconf = require('nconf'); var validator = require('validator'); @@ -18,7 +19,6 @@ module.exports = function(middleware) { if (err) { return next(err); } - self.send(str); }; @@ -27,78 +27,86 @@ module.exports = function(middleware) { fn = options; options = {}; } + if ('function' !== typeof fn) { + fn = defaultFn; + } - plugins.fireHook('filter:' + template + '.build', {req: req, res: res, templateData: options}, function(err, data) { - if (err) { - return next(err); - } - - options = data.templateData; - - options.loggedIn = !!req.uid; - options.relative_path = nconf.get('relative_path'); - options.template = {name: template}; - options.template[template] = true; - options.url = (req.baseUrl + req.path).replace(/^\/api/, ''); - options.bodyClass = buildBodyClass(req); - - res.locals.template = template; - options._locals = undefined; - - if (res.locals.isAPI) { - if (req.route && req.route.path === '/api/') { - options.title = '[[pages:home]]'; + var ajaxifyData; + async.waterfall([ + function(next) { + plugins.fireHook('filter:' + template + '.build', {req: req, res: res, templateData: options}, next); + }, + function(data, next) { + options = data.templateData; + + options.loggedIn = !!req.uid; + options.relative_path = nconf.get('relative_path'); + options.template = {name: template}; + options.template[template] = true; + options.url = (req.baseUrl + req.path).replace(/^\/api/, ''); + options.bodyClass = buildBodyClass(req); + + res.locals.template = template; + options._locals = undefined; + + if (res.locals.isAPI) { + if (req.route && req.route.path === '/api/') { + options.title = '[[pages:home]]'; + } + + return res.json(options); } - return res.json(options); + ajaxifyData = JSON.stringify(options).replace(/<\//g, '<\\/'); + + async.parallel({ + header: function(next) { + renderHeaderFooter('renderHeader', req, res, options, next); + }, + content: function(next) { + render.call(self, template, options, next); + }, + footer: function(next) { + renderHeaderFooter('renderFooter', req, res, options, next); + } + }, next); + }, + function(results, next) { + var str = results.header + + (res.locals.postHeader || '') + + results.content + + (res.locals.preFooter || '') + + results.footer; + + translate(str, req, res, next); + }, + function(translated, next) { + next(null, translated + ''); } - - if ('function' !== typeof fn) { - fn = defaultFn; - } - - var ajaxifyData = JSON.stringify(options); - ajaxifyData = ajaxifyData.replace(/<\//g, '<\\/'); - - render.call(self, template, options, function(err, str) { - if (err) { - return fn(err); - } - - str = (res.locals.postHeader ? res.locals.postHeader : '') + str + (res.locals.preFooter ? res.locals.preFooter : ''); - - if (res.locals.footer) { - str = str + res.locals.footer; - } else if (res.locals.adminFooter) { - str = str + res.locals.adminFooter; - } - - if (res.locals.renderHeader || res.locals.renderAdminHeader) { - var method = res.locals.renderHeader ? middleware.renderHeader : middleware.admin.renderHeader; - method(req, res, options, function(err, template) { - if (err) { - return fn(err); - } - str = template + str; - var language = res.locals.config ? res.locals.config.userLang || 'en_GB' : 'en_GB'; - language = req.query.lang ? validator.escape(String(req.query.lang)) : language; - translator.translate(str, language, function(translated) { - translated = translator.unescape(translated); - translated = translated + ''; - fn(err, translated); - }); - }); - } else { - str = str + ''; - fn(err, str); - } - }); - }); + ], fn); }; next(); }; + function renderHeaderFooter(method, req, res, options, next) { + if (res.locals.renderHeader) { + middleware[method](req, res, options, next); + } else if (res.locals.renderAdminHeader) { + middleware.admin[method](req, res, options, next); + } else { + next(null, ''); + } + } + + function translate(str, req, res, next) { + var language = res.locals.config ? res.locals.config.userLang || 'en_GB' : 'en_GB'; + language = req.query.lang ? validator.escape(String(req.query.lang)) : language; + translator.translate(str, language, function(translated) { + next(null, translator.unescape(translated)); + }); + } + function buildBodyClass(req) { var clean = req.path.replace(/^\/api/, '').replace(/^\/|\/$/g, ''); var parts = clean.split('/').slice(0, 3);