view.js

/**
The view module retrieves a view template, and substitutes parameter before sending the view to the client. 

@module view
*/

const logger = require('./utils/logger')

const languageTemplates = require('./utils/languageTemplates')

module.exports = async (req, res) => {

  logger(req.url, 'view-req-url')

  const params = {}

  Object.keys(req.params)
    .filter(key => typeof req.params[key] === 'string')
    .forEach(key => params[key] = req.params[key])

  params.template ??= 'default_view'

  params.dir ??= process.env.DIR

  params.login ??= (process.env.PRIVATE || process.env.PUBLIC) && 'true'

  params.title ??= process.env.TITLE

  params.msg = req.params.msg && await languageTemplates({
    template: req.params.msg,
    language: req.params.language
  })

  params.language ??= req.params.user?.language || 'en'

  const template = await languageTemplates(params)

  if (!template) {
    res.status(400).send(`Template undefined`)
    return;
  }

  const view = template.replace(/{{2}([A-Za-z][A-Za-z0-9]*)}{2}/g, matched => {

    // regex matches {{ or }}
    return params[matched.replace(/(^{{)|(}}$)/g, '')] || ''
  });

  res.send(view);
}