diff --git a/controllers/middlewares/nunjucksRenderer.js b/controllers/middlewares/nunjucksRenderer.js new file mode 100644 index 0000000..ecbbcf4 --- /dev/null +++ b/controllers/middlewares/nunjucksRenderer.js @@ -0,0 +1,44 @@ +const nunjucks = require('nunjucks') + +class NunjucksRenderer { + directory + environment + + constructor (directory = '', options = {}) { + if (typeof directory !== 'string') { + throw new TypeError('Root directory must be a string value') + } + + this.directory = directory + + this.environment = nunjucks.configure( + this.directory, + Object.assign(options, { + autoescape: true + }) + ) + } + + #middleware (req, res, next) { + // Inject render() method into Response on each requests + res.render = (path, params) => this.#render(res, path, params) + return next() + } + + #render (res, path, params) { + return new Promise((resolve, reject) => { + this.environment.render(`${path}.njk`, params, (err, html) => { + if (err) return reject(err) + resolve(html) + }) + }).then(html => { + return res.type('html').send(html) + }) + } + + get middleware () { + return this.#middleware.bind(this) + } +} + +module.exports = NunjucksRenderer diff --git a/lolisafe.js b/lolisafe.js index 4dc6222..7eb9a9e 100644 --- a/lolisafe.js +++ b/lolisafe.js @@ -9,13 +9,12 @@ process.on('unhandledRejection', error => { logger.error(error, { prefix: 'Unhandled Rejection (Promise): ' }) }) -// Require libraries +// Libraries const contentDisposition = require('content-disposition') const helmet = require('helmet') const HyperExpress = require('hyper-express') const LiveDirectory = require('live-directory') const NodeClam = require('clamscan') -const nunjucks = require('nunjucks') // const rateLimit = require('express-rate-limit') // FIXME: Find alternative const { accessSync, constants } = require('fs') @@ -31,7 +30,7 @@ for (const _file of configFiles) { } } -// Require config files +// Config files const config = require('./config') const versions = require('./src/versions') @@ -46,6 +45,11 @@ const paths = require('./controllers/pathsController') paths.initSync() const utils = require('./controllers/utilsController') +// Custom middlewares +const NunjucksRenderer = require('./controllers/middlewares/nunjucksRenderer') +// const ServeStatic = require('./controllers/middlewares/serveStatic') // TODO + +// Routes const album = require('./routes/album') const api = require('./routes/api') const file = require('./routes/file') @@ -92,6 +96,12 @@ if (config.accessControlAllowOrigin) { }) } +// NunjucksRenderer middleware +const nunjucksRendererInstance = new NunjucksRenderer('views', { + watch: isDevMode +}) +safe.use('/', nunjucksRendererInstance.middleware) + const initLiveDirectory = (options = {}) => { if (!options.ignore) { options.ignore = path => { @@ -102,31 +112,6 @@ const initLiveDirectory = (options = {}) => { return new LiveDirectory(options) } -// https://mozilla.github.io/nunjucks/api.html#configure -const nunjucksEnv = nunjucks.configure('views', { - autoescape: true, - watch: isDevMode - // noCache: isDevMode -}) - -const renderNunjucks = (res, path, params) => { - return new Promise((resolve, reject) => { - nunjucksEnv.render(`${path}.njk`, params, (err, html) => { - if (err) return reject(err) - resolve(html) - }) - }).then(html => { - return res.type('html').send(html) - }) -} - -// Bind a global middleware which will attach to our helper method into all incoming requests -safe.use((req, res, next) => { - // Inject the render method onto the response object on each requet - res.render = (path, params) => renderNunjucks(res, path, params) - next() -}) - // Configure rate limits (disabled during development) // FIXME: express-rate-limit does not work with hyper-express, find alternative /*