UNPKG

@gov-cy/govcy-express-services

Version:

An Express-based system that dynamically renders services using @gov-cy/govcy-frontend-renderer and posts data to a submission API.

107 lines (94 loc) 4.88 kB
import * as govcyResources from "../resources/govcyResources.mjs"; import * as dataLayer from "../utils/govcyDataLayer.mjs"; import { logger } from "../utils/govcyLogger.mjs"; import {preparePrintFriendlyData , generateReviewSummary } from "../utils/govcySubmitData.mjs"; import { whatsIsMyEnvironment } from '../utils/govcyEnvVariables.mjs'; /** * Middleware to handle the review page for the service. * This middleware processes the review page, populates form data, and shows validation errors. */ export function govcyReviewPageHandler() { return (req, res, next) => { try { const { siteId } = req.params; // Create a deep copy of the service to avoid modifying the original let serviceCopy = req.serviceData; // Deep copy renderer pageData from let pageData = JSON.parse(JSON.stringify(govcyResources.staticResources.rendererPageData)); // Handle isTesting pageData.site.isTesting = (whatsIsMyEnvironment() === "staging"); // Base page template structure let pageTemplate = { sections: [ { name: "beforeMain", elements: [govcyResources.staticResources.elements.backLink] } ] }; // Construct page title const pageH1 = { element: "textElement", params: { type: "h1", text: govcyResources.staticResources.text.checkYourAnswersTitle } }; // Construct submit button const submitButton = { element: "form", params: { action: govcyResources.constructPageUrl(siteId, "review"), method: "POST", elements: [ { element: "button", params: { type: "submit", variant: "success", text: govcyResources.staticResources.text.submit } }, govcyResources.csrfTokenInput(req.csrfToken()) ] } } // Generate the summary list using the utility function let printFriendlyData = preparePrintFriendlyData(req, siteId, serviceCopy); let summaryList = generateReviewSummary(printFriendlyData,req, siteId); //--------- Handle Validation Errors --------- // Check if validation errors exist in the session const validationErrors = dataLayer.getSiteSubmissionErrors(req.session, siteId); let mainElements = []; if (validationErrors ) { for (const error in validationErrors.errors) { validationErrors.errorSummary.push({ link: govcyResources.constructPageUrl(siteId, validationErrors.errors[error].pageUrl, "review"), //`/${siteId}/${error.pageUrl}`, text: validationErrors.errors[error].message }); } mainElements.push(govcyResources.errorSummary(validationErrors.errorSummary)); } //--------- End Handle Validation Errors --------- // Add elements to the main section, the H1, summary list, the submit button and the JS mainElements.push(pageH1, summaryList, submitButton, govcyResources.staticResources.elements["govcyFormsJs"]); // Append generated summary list to the page template pageTemplate.sections.push({ name: "main", elements: mainElements }); //if user is logged in add he user bane section in the page template if (dataLayer.getUser(req.session)) { pageTemplate.sections.push(govcyResources.userNameSection(dataLayer.getUser(req.session).name)); // Add user name section } //prepare pageData pageData.site = serviceCopy.site; pageData.pageData.title = govcyResources.staticResources.text.checkYourAnswersTitle; // Attach processed page data to the request req.processedPage = { pageData: pageData, pageTemplate: pageTemplate }; logger.debug("Processed review page data:", req.processedPage, req); next(); } catch (error) { return next(error); // Pass error to govcyHttpErrorHandler } }; }