feat: NunjucksRenderer custom middleware class

This commit is contained in:
Bobby Wibowo 2022-07-12 06:24:04 +07:00
parent 7733967624
commit af754d7d71
No known key found for this signature in database
GPG Key ID: 51C3A1E1E22D26CF
2 changed files with 57 additions and 28 deletions

View File

@ -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

View File

@ -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
/*