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