Source: controllers/pageController.js

import hmpoFormWizard from 'hmpo-form-wizard'
import { logPageView, types } from '../utils/logging.js'
import logger from '../utils/logger.js'
import { datasetSlugToReadableName } from '../utils/datasetSlugToReadableName.js'
const { Controller } = hmpoFormWizard

/**
 * If we arrived at the page via deep from another page, we'll use that page as the back link.
 *
 * @param {string} url current page URL
 * @param {Object} deepLinkInfo - deep link info from the session
 * @param {string=} deepLinkInfo.referrer - optional referrer URL
 * @param {string} deepLinkInfo.dataset - dataset name
 * @returns {string|undefined} back link URL
 */
function wizardBackLink (currentUrl, deepLinkInfo) {
  if (deepLinkInfo && 'referrer' in deepLinkInfo) {
    const { referrer, dataset } = deepLinkInfo
    if (dataset === 'tree' && currentUrl === '/check/geometry-type') {
      return referrer
    }
    if (dataset !== 'tree' && currentUrl === '/check/upload-method') {
      return referrer
    }
  }

  return undefined
}

/**
 * This class extends the Controller class from the hmpo-form-wizard library.
 * For more information, please refer to the documentation:
 * https://github.com/HMPO/hmpo-form-wizard
 * Specifically, the controller lifecycle is outlined in this PDF:
 * https://github.com/UKHomeOffice/passports-form-wizard/wiki/HMPO%20Forms%20Flow.pdf
 */
class PageController extends Controller {
  sessionKey = 'deep-link-session-key'

  get (req, res, next) {
    logPageView(this.options.route, req.sessionID, req.ip)
    super.get(req, res, next)
  }

  locals (req, res, next) {
    try {
      let backLink
      const deepLinkInfo = req?.sessionModel?.get(this.sessionKey)
      if (deepLinkInfo) {
        req.form.options.deepLink = deepLinkInfo
        req.form.options.dataset = deepLinkInfo.dataset
        req.form.options.datasetName = deepLinkInfo.datasetName
        req.form.options.lpa = deepLinkInfo.lpa || deepLinkInfo.orgName
        req.form.options.orgId = deepLinkInfo.orgId
        backLink = wizardBackLink(req.originalUrl, deepLinkInfo)
      }

      if (backLink) {
        req.form.options.backLinkText = `Back to ${deepLinkInfo.datasetName} overview`
      }

      backLink = backLink ?? this.options.backLink
      if (backLink) {
        req.form.options.lastPage = backLink
      }
    } catch (e) {
      logger.warn('PageController.locals(): error setting back link', {
        type: types.App,
        errorMessage: e.message
      })
    }

    const dataset = req?.sessionModel?.get('dataset')
    try {
      req.form.options.datasetName = datasetSlugToReadableName(dataset)
    } catch (e) {
      logger.warn(`Failed to get readable dataset name from slug: ${dataset}`)
    }

    const errors = req?.sessionModel?.get('errors')
    if (errors) {
      req.form.options.errors = errors
    }

    super.locals(req, res, next)
  }
}

export default PageController