From 40cac0c6c83645eedf65560551d1c325f695e266 Mon Sep 17 00:00:00 2001 From: Onja Date: Tue, 10 Oct 2023 19:47:53 +0300 Subject: [PATCH] Add TemplateService class to handle rendering templates and layouts --- src/services/template.js | 80 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 src/services/template.js diff --git a/src/services/template.js b/src/services/template.js new file mode 100644 index 0000000..e4c63dd --- /dev/null +++ b/src/services/template.js @@ -0,0 +1,80 @@ +const fs = require('fs'); +const path = require('path'); + +const hbs = require('handlebars'); + +const { basedir } = require('../config/constants'); +const emitter = require('./eventEmitter'); + + +class TemplateService { + + + /** + * + * @param string url + * @return string + */ + getTemplatePath(name) { + // check if template exists before returning it + const templatePath = path.join(basedir, 'src/views/', `${name}.hbs`); + + if (fs.existsSync(templatePath)) { + return templatePath; + } + + return null; + } + + /** + * + * @param string name + * @param object data + * @param object params + * @return string + */ + render(name, data = {}, params = {}) { + const templatePath = this.getTemplatePath(name); + + emitter.emit('template.render', { name, templatePath, data, params }); + + if (!templatePath) { + return ''; + } + + const template = fs.readFileSync(templatePath, 'utf-8'); + + const compiledTemplate = hbs.compile(template, params); + + return compiledTemplate(data); + } + + /** + * + * @param string name + * @param object data + * @param object params + * @return string + */ + renderPage(name, data = {}, layout = 'main', params = {}) { + // Get the page template + const pageTemplate = this.render(`pages/${name}`, data, params); + + if ( !pageTemplate ) { + return ''; + } + + + // Get the layout template + const layoutTemplate = this.render(`layout/${layout}`, {...data, ...{ body: pageTemplate }}, params); + + if ( !layoutTemplate ) { + return ''; + } + + return layoutTemplate; + } + +} + +module.exports = TemplateService; \ No newline at end of file