diff --git a/fsd_config/form_jsons/elig-test.json b/fsd_config/form_jsons/elig-test.json new file mode 100644 index 0000000000..0e62387053 --- /dev/null +++ b/fsd_config/form_jsons/elig-test.json @@ -0,0 +1,166 @@ +{ + "metadata": {}, + "startPage": "/eligiblity-start", + "name": "Eligibility Test", + "pages": [ + { + "path": "/eligiblity-start", + "title": "Eligibility", + "components": [ + { + "name": "hsyuiX", + "options": {}, + "type": "Html", + "content": "

Tell us if you are eligible

", + "schema": {} + } + ], + "next": [ + { + "path": "/eligibility-1" + } + ], + "controller": "./pages/start.js" + }, + { + "path": "/eligibility-1", + "title": "Eligibility Part 1", + "components": [ + { + "name": "areyou", + "options": {}, + "type": "RadiosField", + "title": "Do you think you are eligible?", + "list": "eligiblity-list", + "schema": {} + } + ], + "next": [ + { + "path": "/summary-not-eligible", + "condition": "nonono" + }, + { + "path": "/summary", + "condition": "DtRJdr" + } + ], + "section": "eAEGhH" + }, + { + "path": "/summary-not-eligible", + "title": "You are NOT eligible", + "components": [ + { + "name": "sumsum", + "options": {}, + "type": "Para", + "content": "* Display answers *", + "schema": {} + } + ], + "next": [], + "section": "eAEGhH", + "controller": "./pages/summary.js" + }, + { + "path": "/summary", + "title": "You are eligible", + "components": [ + { + "name": "BsGzRm", + "options": {}, + "type": "Para", + "content": "* Display answers *", + "schema": {} + } + ], + "next": [], + "section": "eAEGhH", + "controller": "./pages/summary.js" + } + ], + "lists": [ + { + "title": "Do you think you are eligible?", + "name": "eligiblity-list", + "type": "string", + "items": [ + { + "text": "Yes, I think I am", + "value": "Yes, I think I am" + }, + { + "text": "Nope", + "value": "Nope" + } + ] + } + ], + "sections": [ + { + "name": "eAEGhH", + "title": "Eligibility" + } + ], + "conditions": [ + { + "displayName": "eligible-no", + "name": "nonono", + "value": { + "name": "eligible-no", + "conditions": [ + { + "field": { + "name": "areyou", + "type": "RadiosField", + "display": "Do you think you are eligible?" + }, + "operator": "is", + "value": { + "type": "Value", + "value": "Nope", + "display": "Nope" + } + } + ] + } + }, + { + "displayName": "eligible-yes", + "name": "DtRJdr", + "value": { + "name": "eligible-yes", + "conditions": [ + { + "field": { + "name": "areyou", + "type": "RadiosField", + "display": "Do you think you are eligible?" + }, + "operator": "is", + "value": { + "type": "Value", + "value": "Yes, I think I am", + "display": "Yes, I think I am" + } + } + ] + } + } + ], + "fees": [], + "outputs": [ + { + "name": "update-form", + "title": "Update form in application store", + "type": "savePerPage", + "outputConfiguration": { + "savePerPageUrl": "https://webhook.site/3f3bfa5a-43b3-4b94-81ca-6fa478623f70" + } + } + ], + "version": 2, + "skipSummary": false, + "markAsComplete": false +} diff --git a/fsd_config/form_jsons/hsra/hsra-r1-eligibility.json b/fsd_config/form_jsons/hsra/hsra-r1-eligibility.json new file mode 100644 index 0000000000..35c8a742d6 --- /dev/null +++ b/fsd_config/form_jsons/hsra/hsra-r1-eligibility.json @@ -0,0 +1,147 @@ +{ + "metadata": {}, + "startPage": "/eligiblity-start", + "name": "Eligibility Test", + "pages": [ + { + "path": "/eligiblity-start", + "title": "Eligibility", + "components": [ + { + "name": "hsyuiX", + "options": {}, + "type": "Html", + "content": "

Tell us if you are eligible

", + "schema": {} + } + ], + "next": [ + { + "path": "/eligibility-1" + } + ], + "controller": "./pages/start.js" + }, + { + "path": "/eligibility-1", + "title": "Eligibility Part 1", + "components": [ + { + "name": "areyou", + "options": {}, + "type": "RadiosField", + "title": "Do you think you are eligible?", + "list": "eligiblity-list", + "schema": {} + } + ], + "next": [ + { + "path": "/summary" + } + ], + "section": "eAEGhH", + "controller": "EligibilityPageController" + }, + + { + "path": "/summary", + "title": "Check your answers", + "components": [ + { + "name": "BsGzRm", + "options": {}, + "type": "Para", + "content": "* Display answers *", + "schema": {} + } + ], + "next": [], + "section": "eAEGhH", + "controller": "./pages/summary.js" + } + ], + "lists": [ + { + "title": "Do you think you are eligible?", + "name": "eligiblity-list", + "type": "string", + "items": [ + { + "text": "Yes, I think I am", + "value": "Yes, I think I am" + }, + { + "text": "Nope", + "value": "Nope" + } + ] + } + ], + "sections": [ + { + "name": "eAEGhH", + "title": "Eligibility" + } + ], + "conditions": [ + { + "displayName": "eligible-no", + "name": "nonono", + "value": { + "name": "eligible-no", + "conditions": [ + { + "field": { + "name": "areyou", + "type": "RadiosField", + "display": "Do you think you are eligible?" + }, + "operator": "is", + "value": { + "type": "Value", + "value": "Nope", + "display": "Nope" + } + } + ] + } + }, + { + "displayName": "eligible-yes", + "name": "DtRJdr", + "value": { + "name": "eligible-yes", + "conditions": [ + { + "field": { + "name": "areyou", + "type": "RadiosField", + "display": "Do you think you are eligible?" + }, + "operator": "is", + "value": { + "type": "Value", + "value": "Yes, I think I am", + "display": "Yes, I think I am" + } + } + ] + } + } + ], + "fees": [], + "outputs": [ + { + "name": "update-form", + "title": "Update form in application store", + "type": "savePerPage", + "outputConfiguration": { + "savePerPageUrl": "True" + } + } + ], + "version": 2, + "skipSummary": false, + "markAsComplete": false +} diff --git a/runner/src/server/plugins/engine/pageControllers/EligibilityPageController.ts b/runner/src/server/plugins/engine/pageControllers/EligibilityPageController.ts new file mode 100644 index 0000000000..a02b9a4336 --- /dev/null +++ b/runner/src/server/plugins/engine/pageControllers/EligibilityPageController.ts @@ -0,0 +1,59 @@ +import { PageController } from "./PageController"; +import { HapiRequest, HapiResponseToolkit } from "server/types"; +import config from "server/config"; +import { SaveViewModel } from "../models"; + +export class EligibilityPageController extends PageController { + makePostRouteHandler() { + return async (request: HapiRequest, h: HapiResponseToolkit) => { + const response = await this.handlePostRequest(request, h); + if (response?.source?.context?.errors) { + return response; + } + const { cacheService, statusService } = request.services([]); + const savedState = await cacheService.getState(request); + //This is required to ensure we don't navigate to an incorrect page based on stale state values + let relevantState = this.getConditionEvaluationContext( + this.model, + savedState + ); + + // Start page check so forms do not save when hitting the "Contine" button on the first page + const startPage = this.model.def.startPage; + const isStartPage = this.path === startPage; + + if (config.savePerPage && !isStartPage) { + // Set flag for continous saves on each question? + const saveViewModel = new SaveViewModel( + this.title, + this.model, + relevantState, + request + ); + + await cacheService.mergeState(request, { + outputs: saveViewModel.outputs, + userCompletedSummary: true, + }); + await cacheService.mergeState(request, { + webhookData: saveViewModel.validatedWebhookData, + }); + + const response = await statusService.savePerPageRequest(request); + const isEligible = response.metadata.is_eligible; + if (isEligible) { + return this.proceed(request, h, relevantState); + } + + let redirectUrl = response.metadata.not_eligible_redirect_url; + + if (request.query.form_session_identifier) { + redirectUrl += `?form_session_identifier=${request.query.form_session_identifier}`; + } + + return h.redirect(redirectUrl); + } + return this.proceed(request, h, relevantState); + }; + } +} diff --git a/runner/src/server/plugins/engine/pageControllers/helpers.ts b/runner/src/server/plugins/engine/pageControllers/helpers.ts index 74b48293fb..65f45ccb52 100644 --- a/runner/src/server/plugins/engine/pageControllers/helpers.ts +++ b/runner/src/server/plugins/engine/pageControllers/helpers.ts @@ -6,6 +6,7 @@ import { PageController } from "./PageController"; import { StartDatePageController } from "./StartDatePageController"; import { StartPageController } from "./StartPageController"; import { SummaryPageController } from "./SummaryPageController"; +import { EligibilityPageController } from "./EligibilityPageController"; import { PageControllerBase } from "./PageControllerBase"; import { RepeatingFieldPageController } from "./RepeatingFieldPageController"; import { Page } from "@xgovformbuilder/model"; @@ -19,6 +20,7 @@ const PageControllers = { SummaryPageController, PageControllerBase, RepeatingFieldPageController, + EligibilityPageController, }; export const controllerNameFromPath = (filePath: string) => { diff --git a/runner/src/server/services/statusService.ts b/runner/src/server/services/statusService.ts index a9b12df849..ce84255472 100644 --- a/runner/src/server/services/statusService.ts +++ b/runner/src/server/services/statusService.ts @@ -139,6 +139,7 @@ export class StatusService { `savePerPageWebhook response: ${response}` ); } + return response; } catch (e) { this.logger.console.error( `Failed to save per page. savePerPageUrl: ${savePerPageWebhook?.outputData.url}` diff --git a/runner/src/server/services/webhookService.ts b/runner/src/server/services/webhookService.ts index f49943a110..2242207c99 100644 --- a/runner/src/server/services/webhookService.ts +++ b/runner/src/server/services/webhookService.ts @@ -43,16 +43,20 @@ export class WebhookService { } try { - const { reference } = JSON.parse(payload); + let { result } = JSON.parse(payload); + if (typeof result === "undefined") { + result = JSON.parse(payload.toString()); + } + this.logger.info( ["WebhookService", "postRequest"], `Webhook request to ${url} submitted OK` ); this.logger.debug( - ["WebhookService", "postRequest", `REF: ${reference}`], - JSON.stringify(payload) + ["WebhookService", "postRequest", `REF: ${result}`], + JSON.stringify(result) ); - return reference; + return result; } catch (error) { this.logger.error(["WebhookService", "postRequest"], error); return "UNKNOWN";