@defra/forms-engine-plugin 3.0.9 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.public/stylesheets/application.min.css +3 -3
- package/.public/stylesheets/application.min.css.map +1 -1
- package/.server/client/stylesheets/application.scss +14 -0
- package/.server/config/index.d.ts +1 -0
- package/.server/config/index.js +7 -0
- package/.server/config/index.js.map +1 -1
- package/.server/index.js +6 -2
- package/.server/index.js.map +1 -1
- package/.server/server/constants.d.ts +2 -0
- package/.server/server/constants.js +2 -0
- package/.server/server/constants.js.map +1 -1
- package/.server/server/forms/components.json +7 -0
- package/.server/server/forms/register-as-a-unicorn-breeder.yaml +18 -2
- package/.server/server/plugins/engine/components/UkAddressField.d.ts +15 -9
- package/.server/server/plugins/engine/components/UkAddressField.js +67 -6
- package/.server/server/plugins/engine/components/UkAddressField.js.map +1 -1
- package/.server/server/plugins/engine/configureEnginePlugin.d.ts +1 -1
- package/.server/server/plugins/engine/configureEnginePlugin.js +6 -3
- package/.server/server/plugins/engine/configureEnginePlugin.js.map +1 -1
- package/.server/server/plugins/engine/models/FormModel.d.ts +2 -0
- package/.server/server/plugins/engine/models/FormModel.js +3 -1
- package/.server/server/plugins/engine/models/FormModel.js.map +1 -1
- package/.server/server/plugins/engine/options.js +2 -1
- package/.server/server/plugins/engine/options.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.d.ts +1 -0
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.js +46 -3
- package/.server/server/plugins/engine/pageControllers/QuestionPageController.js.map +1 -1
- package/.server/server/plugins/engine/plugin.js +15 -2
- package/.server/server/plugins/engine/plugin.js.map +1 -1
- package/.server/server/plugins/engine/routes/index.d.ts +2 -2
- package/.server/server/plugins/engine/routes/index.js +49 -9
- package/.server/server/plugins/engine/routes/index.js.map +1 -1
- package/.server/server/plugins/engine/routes/questions.d.ts +4 -4
- package/.server/server/plugins/engine/routes/questions.js +10 -10
- package/.server/server/plugins/engine/routes/questions.js.map +1 -1
- package/.server/server/plugins/engine/routes/repeaters/item-delete.d.ts +2 -1
- package/.server/server/plugins/engine/routes/repeaters/item-delete.js +31 -27
- package/.server/server/plugins/engine/routes/repeaters/item-delete.js.map +1 -1
- package/.server/server/plugins/engine/routes/repeaters/summary.d.ts +2 -1
- package/.server/server/plugins/engine/routes/repeaters/summary.js +31 -27
- package/.server/server/plugins/engine/routes/repeaters/summary.js.map +1 -1
- package/.server/server/plugins/engine/types.d.ts +21 -3
- package/.server/server/plugins/engine/types.js.map +1 -1
- package/.server/server/plugins/engine/validationHelpers.d.ts +15 -0
- package/.server/server/plugins/engine/validationHelpers.js +29 -0
- package/.server/server/plugins/engine/validationHelpers.js.map +1 -0
- package/.server/server/plugins/engine/views/components/ukaddressfield.html +50 -6
- package/.server/server/plugins/engine/vision.js +3 -1
- package/.server/server/plugins/engine/vision.js.map +1 -1
- package/.server/server/plugins/postcode-lookup/index.d.ts +8 -0
- package/.server/server/plugins/postcode-lookup/index.js +21 -0
- package/.server/server/plugins/postcode-lookup/index.js.map +1 -0
- package/.server/server/plugins/postcode-lookup/models/index.d.ts +255 -0
- package/.server/server/plugins/postcode-lookup/models/index.js +517 -0
- package/.server/server/plugins/postcode-lookup/models/index.js.map +1 -0
- package/.server/server/plugins/postcode-lookup/routes/index.d.ts +19 -0
- package/.server/server/plugins/postcode-lookup/routes/index.js +267 -0
- package/.server/server/plugins/postcode-lookup/routes/index.js.map +1 -0
- package/.server/server/plugins/postcode-lookup/service.d.ts +26 -0
- package/.server/server/plugins/postcode-lookup/service.js +148 -0
- package/.server/server/plugins/postcode-lookup/service.js.map +1 -0
- package/.server/server/plugins/postcode-lookup/service.test.js +144 -0
- package/.server/server/plugins/postcode-lookup/service.test.js.map +1 -0
- package/.server/server/plugins/postcode-lookup/test/__stubs__/postcode.d.ts +282 -0
- package/.server/server/plugins/postcode-lookup/test/__stubs__/postcode.js +370 -0
- package/.server/server/plugins/postcode-lookup/test/__stubs__/postcode.js.map +1 -0
- package/.server/server/plugins/postcode-lookup/test/__stubs__/query.d.ts +131 -0
- package/.server/server/plugins/postcode-lookup/test/__stubs__/query.js +195 -0
- package/.server/server/plugins/postcode-lookup/test/__stubs__/query.js.map +1 -0
- package/.server/server/plugins/postcode-lookup/test/__stubs__/uprn.d.ts +51 -0
- package/.server/server/plugins/postcode-lookup/test/__stubs__/uprn.js +52 -0
- package/.server/server/plugins/postcode-lookup/test/__stubs__/uprn.js.map +1 -0
- package/.server/server/plugins/postcode-lookup/types.d.ts +204 -0
- package/.server/server/plugins/postcode-lookup/types.js +144 -0
- package/.server/server/plugins/postcode-lookup/types.js.map +1 -0
- package/.server/server/plugins/postcode-lookup/views/postcode-lookup-details.html +83 -0
- package/.server/server/routes/types.d.ts +7 -2
- package/.server/server/routes/types.js +6 -0
- package/.server/server/routes/types.js.map +1 -1
- package/.server/server/schemas/index.js +1 -1
- package/.server/server/schemas/index.js.map +1 -1
- package/.server/server/types.d.ts +1 -0
- package/.server/server/types.js.map +1 -1
- package/package.json +2 -2
- package/src/client/stylesheets/application.scss +14 -0
- package/src/config/index.ts +9 -1
- package/src/index.ts +5 -4
- package/src/server/constants.js +2 -0
- package/src/server/forms/components.json +7 -0
- package/src/server/forms/register-as-a-unicorn-breeder.yaml +18 -2
- package/src/server/plugins/engine/components/UkAddressField.test.ts +50 -27
- package/src/server/plugins/engine/components/UkAddressField.ts +91 -8
- package/src/server/plugins/engine/configureEnginePlugin.ts +5 -3
- package/src/server/plugins/engine/helpers.test.ts +2 -1
- package/src/server/plugins/engine/models/FormModel.ts +10 -2
- package/src/server/plugins/engine/options.js +2 -1
- package/src/server/plugins/engine/pageControllers/PageController.test.ts +2 -1
- package/src/server/plugins/engine/pageControllers/QuestionPageController.test.ts +9 -4
- package/src/server/plugins/engine/pageControllers/QuestionPageController.ts +69 -1
- package/src/server/plugins/engine/pageControllers/SummaryPageController.test.ts +2 -1
- package/src/server/plugins/engine/plugin.ts +22 -4
- package/src/server/plugins/engine/routes/index.test.ts +317 -0
- package/src/server/plugins/engine/routes/index.ts +81 -8
- package/src/server/plugins/engine/routes/questions.test.ts +126 -15
- package/src/server/plugins/engine/routes/questions.ts +71 -57
- package/src/server/plugins/engine/routes/repeaters/item-delete.test.ts +83 -0
- package/src/server/plugins/engine/routes/repeaters/item-delete.ts +39 -33
- package/src/server/plugins/engine/routes/repeaters/summary.test.ts +75 -0
- package/src/server/plugins/engine/routes/repeaters/summary.ts +28 -22
- package/src/server/plugins/engine/types.ts +27 -8
- package/src/server/plugins/engine/validationHelpers.ts +48 -0
- package/src/server/plugins/engine/views/components/ukaddressfield.html +50 -6
- package/src/server/plugins/engine/vision.ts +6 -0
- package/src/server/plugins/postcode-lookup/index.js +21 -0
- package/src/server/plugins/postcode-lookup/models/index.js +549 -0
- package/src/server/plugins/postcode-lookup/routes/index.js +258 -0
- package/src/server/plugins/postcode-lookup/service.js +188 -0
- package/src/server/plugins/postcode-lookup/service.test.js +177 -0
- package/src/server/plugins/postcode-lookup/test/__stubs__/postcode.js +382 -0
- package/src/server/plugins/postcode-lookup/test/__stubs__/query.js +200 -0
- package/src/server/plugins/postcode-lookup/test/__stubs__/uprn.js +53 -0
- package/src/server/plugins/postcode-lookup/types.js +143 -0
- package/src/server/plugins/postcode-lookup/views/postcode-lookup-details.html +83 -0
- package/src/server/postcode-lookup.test.ts +64 -0
- package/src/server/routes/types.ts +11 -2
- package/src/server/schemas/index.ts +5 -7
- package/src/server/types.ts +1 -0
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import Boom from '@hapi/boom';
|
|
2
2
|
import { isEqual } from 'date-fns';
|
|
3
|
-
import { PREVIEW_PATH_PREFIX } from "../../../constants.js";
|
|
3
|
+
import { EXTERNAL_STATE_APPENDAGE, EXTERNAL_STATE_PAYLOAD, PREVIEW_PATH_PREFIX } from "../../../constants.js";
|
|
4
|
+
import { FormComponent, isFormState } from "../components/FormComponent.js";
|
|
4
5
|
import { checkEmailAddressForLiveFormSubmission, checkFormStatus, findPage, getCacheService, getPage, getStartPath, proceed } from "../helpers.js";
|
|
5
6
|
import { FormModel } from "../models/index.js";
|
|
6
7
|
import { generateUniqueReference } from "../referenceNumbers.js";
|
|
7
8
|
import * as defaultServices from "../services/index.js";
|
|
8
|
-
export async function redirectOrMakeHandler(request, h, makeHandler) {
|
|
9
|
+
export async function redirectOrMakeHandler(request, h, onRequest, makeHandler) {
|
|
9
10
|
const {
|
|
10
11
|
app,
|
|
11
12
|
params
|
|
@@ -29,11 +30,20 @@ export async function redirectOrMakeHandler(request, h, makeHandler) {
|
|
|
29
30
|
$$__referenceNumber: referenceNumber
|
|
30
31
|
});
|
|
31
32
|
}
|
|
33
|
+
state = await importExternalComponentState(request, page, state);
|
|
32
34
|
const flash = cacheService.getFlash(request);
|
|
33
35
|
const context = model.getFormContext(request, state, flash?.errors);
|
|
34
36
|
const relevantPath = page.getRelevantPath(request, context);
|
|
35
37
|
const summaryPath = page.getSummaryPath();
|
|
36
38
|
|
|
39
|
+
// Call the onRequest callback if it has been supplied
|
|
40
|
+
if (onRequest) {
|
|
41
|
+
const result = await onRequest(request, h, context);
|
|
42
|
+
if (result !== h.continue) {
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
37
47
|
// Return handler for relevant pages or preview URL direct access
|
|
38
48
|
if (relevantPath.startsWith(page.path) || context.isForceAccess) {
|
|
39
49
|
return makeHandler(page, context);
|
|
@@ -48,13 +58,47 @@ export async function redirectOrMakeHandler(request, h, makeHandler) {
|
|
|
48
58
|
}
|
|
49
59
|
return proceed(request, h, page.getHref(relevantPath));
|
|
50
60
|
}
|
|
61
|
+
async function importExternalComponentState(request, page, state) {
|
|
62
|
+
const externalComponentData = request.yar.flash(EXTERNAL_STATE_APPENDAGE);
|
|
63
|
+
if (Array.isArray(externalComponentData)) {
|
|
64
|
+
return state;
|
|
65
|
+
}
|
|
66
|
+
const typedStateAppendage = externalComponentData;
|
|
67
|
+
const componentName = typedStateAppendage.component;
|
|
68
|
+
const stateAppendage = typedStateAppendage.data;
|
|
69
|
+
const component = request.app.model?.componentMap.get(componentName);
|
|
70
|
+
if (!component) {
|
|
71
|
+
throw new Error(`Component ${componentName} not found in form`);
|
|
72
|
+
}
|
|
73
|
+
if (!(component instanceof FormComponent)) {
|
|
74
|
+
throw new TypeError(`Component ${componentName} is not a FormComponent and does not support isState`);
|
|
75
|
+
}
|
|
76
|
+
const isStateValid = component.isState(stateAppendage);
|
|
77
|
+
if (!isStateValid) {
|
|
78
|
+
throw new Error(`State for component ${componentName} is invalid`);
|
|
79
|
+
}
|
|
80
|
+
const componentState = isFormState(stateAppendage) ? Object.fromEntries(Object.entries(stateAppendage).map(([key, value]) => [`${componentName}__${key}`, value])) : {
|
|
81
|
+
[componentName]: stateAppendage
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
// Save the external component state immediately
|
|
85
|
+
const updatedState = await page.mergeState(request, state, componentState);
|
|
86
|
+
|
|
87
|
+
// Merge the stashed payload into the local state
|
|
88
|
+
const payload = request.yar.flash(EXTERNAL_STATE_PAYLOAD);
|
|
89
|
+
const stashedPayload = Array.isArray(payload) ? {} : payload;
|
|
90
|
+
return {
|
|
91
|
+
...stashedPayload,
|
|
92
|
+
...updatedState
|
|
93
|
+
};
|
|
94
|
+
}
|
|
51
95
|
export function makeLoadFormPreHandler(server, options) {
|
|
52
96
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- hapi types are wrong
|
|
53
97
|
const prefix = server.realm.modifiers.route.prefix ?? '';
|
|
54
98
|
const {
|
|
55
99
|
services = defaultServices,
|
|
56
100
|
controllers,
|
|
57
|
-
|
|
101
|
+
ordnanceSurveyApiKey
|
|
58
102
|
} = options;
|
|
59
103
|
const {
|
|
60
104
|
formsService
|
|
@@ -116,7 +160,8 @@ export function makeLoadFormPreHandler(server, options) {
|
|
|
116
160
|
// Construct the form model
|
|
117
161
|
const model = new FormModel(definition, {
|
|
118
162
|
basePath,
|
|
119
|
-
versionNumber
|
|
163
|
+
versionNumber,
|
|
164
|
+
ordnanceSurveyApiKey
|
|
120
165
|
}, services, controllers);
|
|
121
166
|
|
|
122
167
|
// Create new item and add it to the item cache
|
|
@@ -127,11 +172,6 @@ export function makeLoadFormPreHandler(server, options) {
|
|
|
127
172
|
server.app.models.set(key, item);
|
|
128
173
|
}
|
|
129
174
|
|
|
130
|
-
// Call the onRequest callback if it has been supplied
|
|
131
|
-
if (onRequest) {
|
|
132
|
-
onRequest(request, params, item.model.def, metadata);
|
|
133
|
-
}
|
|
134
|
-
|
|
135
175
|
// Assign the model to the request data
|
|
136
176
|
// for use in the downstream handler
|
|
137
177
|
request.app.model = item.model;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["Boom","isEqual","PREVIEW_PATH_PREFIX","checkEmailAddressForLiveFormSubmission","checkFormStatus","findPage","getCacheService","getPage","getStartPath","proceed","FormModel","generateUniqueReference","defaultServices","redirectOrMakeHandler","request","h","makeHandler","app","params","model","notFound","path","cacheService","server","page","state","getState","$$__referenceNumber","prefix","def","metadata","referenceNumberPrefix","badImplementation","referenceNumber","mergeState","flash","getFlash","context","getFormContext","errors","relevantPath","getRelevantPath","summaryPath","getSummaryPath","startsWith","isForceAccess","redirectTo","next","length","query","returnUrl","getHref","makeLoadFormPreHandler","options","realm","modifiers","route","services","controllers","onRequest","formsService","handler","continue","slug","isPreview","formState","getFormMetadata","id","key","item","models","get","updatedAt","logger","info","definition","getFormDefinition","emailAddress","notificationEmail","outputEmail","basePath","substring","versionNumber","versions","set","dispatchHandler","servicePath"],"sources":["../../../../../src/server/plugins/engine/routes/index.ts"],"sourcesContent":["import Boom from '@hapi/boom'\nimport {\n type ResponseObject,\n type ResponseToolkit,\n type Server\n} from '@hapi/hapi'\nimport { isEqual } from 'date-fns'\n\nimport { PREVIEW_PATH_PREFIX } from '~/src/server/constants.js'\nimport {\n checkEmailAddressForLiveFormSubmission,\n checkFormStatus,\n findPage,\n getCacheService,\n getPage,\n getStartPath,\n proceed\n} from '~/src/server/plugins/engine/helpers.js'\nimport { FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'\nimport { generateUniqueReference } from '~/src/server/plugins/engine/referenceNumbers.js'\nimport * as defaultServices from '~/src/server/plugins/engine/services/index.js'\nimport {\n type AnyFormRequest,\n type FormContext,\n type PluginOptions\n} from '~/src/server/plugins/engine/types.js'\nimport {\n type FormRequest,\n type FormResponseToolkit\n} from '~/src/server/routes/types.js'\n\nexport async function redirectOrMakeHandler(\n request: AnyFormRequest,\n h: FormResponseToolkit,\n makeHandler: (\n page: PageControllerClass,\n context: FormContext\n ) => ResponseObject | Promise<ResponseObject>\n) {\n const { app, params } = request\n const { model } = app\n\n if (!model) {\n throw Boom.notFound(`No model found for /${params.path}`)\n }\n\n const cacheService = getCacheService(request.server)\n const page = getPage(model, request)\n let state = await page.getState(request)\n\n if (!state.$$__referenceNumber) {\n const prefix = model.def.metadata?.referenceNumberPrefix ?? ''\n\n if (typeof prefix !== 'string') {\n throw Boom.badImplementation(\n 'Reference number prefix must be a string or undefined'\n )\n }\n\n const referenceNumber = generateUniqueReference(prefix)\n state = await page.mergeState(request, state, {\n $$__referenceNumber: referenceNumber\n })\n }\n\n const flash = cacheService.getFlash(request)\n const context = model.getFormContext(request, state, flash?.errors)\n const relevantPath = page.getRelevantPath(request, context)\n const summaryPath = page.getSummaryPath()\n\n // Return handler for relevant pages or preview URL direct access\n if (relevantPath.startsWith(page.path) || context.isForceAccess) {\n return makeHandler(page, context)\n }\n\n // Redirect back to last relevant page\n const redirectTo = findPage(model, relevantPath)\n\n // Set the return URL unless an exit page\n if (redirectTo?.next.length) {\n request.query.returnUrl = page.getHref(summaryPath)\n }\n\n return proceed(request, h, page.getHref(relevantPath))\n}\n\nexport function makeLoadFormPreHandler(server: Server, options: PluginOptions) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- hapi types are wrong\n const prefix = server.realm.modifiers.route.prefix ?? ''\n\n const { services = defaultServices, controllers, onRequest } = options\n\n const { formsService } = services\n\n async function handler(request: AnyFormRequest, h: ResponseToolkit) {\n if (server.app.model) {\n request.app.model = server.app.model\n\n return h.continue\n }\n\n const { params } = request\n const { slug } = params\n const { isPreview, state: formState } = checkFormStatus(params)\n\n // Get the form metadata using the `slug` param\n const metadata = await formsService.getFormMetadata(slug)\n\n const { id, [formState]: state } = metadata\n\n // Check the metadata supports the requested state\n if (!state) {\n throw Boom.notFound(`No '${formState}' state for form metadata ${id}`)\n }\n\n // Cache the models based on id, state and whether\n // it's a preview or not. There could be up to 3 models\n // cached for a single form:\n // \"{id}_live_false\" (live/live)\n // \"{id}_live_true\" (live/preview)\n // \"{id}_draft_true\" (draft/preview)\n const key = `${id}_${formState}_${isPreview}`\n let item = server.app.models.get(key)\n\n if (!item || !isEqual(item.updatedAt, state.updatedAt)) {\n server.logger.info(`Getting form definition ${id} (${slug}) ${formState}`)\n\n // Get the form definition using the `id` from the metadata\n const definition = await formsService.getFormDefinition(id, formState)\n\n if (!definition) {\n throw Boom.notFound(\n `No definition found for form metadata ${id} (${slug}) ${formState}`\n )\n }\n\n const emailAddress = metadata.notificationEmail ?? definition.outputEmail\n\n checkEmailAddressForLiveFormSubmission(emailAddress, isPreview)\n\n // Build the form model\n server.logger.info(\n `Building model for form definition ${id} (${slug}) ${formState}`\n )\n\n // Set up the basePath for the model\n const basePath = (\n isPreview\n ? `${prefix}${PREVIEW_PATH_PREFIX}/${formState}/${slug}`\n : `${prefix}/${slug}`\n ).substring(1)\n\n const versionNumber = metadata.versions?.[0]?.versionNumber\n\n // Construct the form model\n const model = new FormModel(\n definition,\n { basePath, versionNumber },\n services,\n controllers\n )\n\n // Create new item and add it to the item cache\n item = { model, updatedAt: state.updatedAt }\n server.app.models.set(key, item)\n }\n\n // Call the onRequest callback if it has been supplied\n if (onRequest) {\n onRequest(request, params, item.model.def, metadata)\n }\n\n // Assign the model to the request data\n // for use in the downstream handler\n request.app.model = item.model\n\n return h.continue\n }\n\n return handler\n}\n\nexport function dispatchHandler(request: FormRequest, h: FormResponseToolkit) {\n const { model } = request.app\n\n const servicePath = model ? `/${model.basePath}` : ''\n return proceed(request, h, `${servicePath}${getStartPath(model)}`)\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["Boom","isEqual","EXTERNAL_STATE_APPENDAGE","EXTERNAL_STATE_PAYLOAD","PREVIEW_PATH_PREFIX","FormComponent","isFormState","checkEmailAddressForLiveFormSubmission","checkFormStatus","findPage","getCacheService","getPage","getStartPath","proceed","FormModel","generateUniqueReference","defaultServices","redirectOrMakeHandler","request","h","onRequest","makeHandler","app","params","model","notFound","path","cacheService","server","page","state","getState","$$__referenceNumber","prefix","def","metadata","referenceNumberPrefix","badImplementation","referenceNumber","mergeState","importExternalComponentState","flash","getFlash","context","getFormContext","errors","relevantPath","getRelevantPath","summaryPath","getSummaryPath","result","continue","startsWith","isForceAccess","redirectTo","next","length","query","returnUrl","getHref","externalComponentData","yar","Array","isArray","typedStateAppendage","componentName","component","stateAppendage","data","componentMap","get","Error","TypeError","isStateValid","isState","componentState","Object","fromEntries","entries","map","key","value","updatedState","payload","stashedPayload","makeLoadFormPreHandler","options","realm","modifiers","route","services","controllers","ordnanceSurveyApiKey","formsService","handler","slug","isPreview","formState","getFormMetadata","id","item","models","updatedAt","logger","info","definition","getFormDefinition","emailAddress","notificationEmail","outputEmail","basePath","substring","versionNumber","versions","set","dispatchHandler","servicePath"],"sources":["../../../../../src/server/plugins/engine/routes/index.ts"],"sourcesContent":["import Boom from '@hapi/boom'\nimport {\n type ResponseObject,\n type ResponseToolkit,\n type Server\n} from '@hapi/hapi'\nimport { isEqual } from 'date-fns'\n\nimport {\n EXTERNAL_STATE_APPENDAGE,\n EXTERNAL_STATE_PAYLOAD,\n PREVIEW_PATH_PREFIX\n} from '~/src/server/constants.js'\nimport {\n FormComponent,\n isFormState\n} from '~/src/server/plugins/engine/components/FormComponent.js'\nimport {\n checkEmailAddressForLiveFormSubmission,\n checkFormStatus,\n findPage,\n getCacheService,\n getPage,\n getStartPath,\n proceed\n} from '~/src/server/plugins/engine/helpers.js'\nimport { FormModel } from '~/src/server/plugins/engine/models/index.js'\nimport { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'\nimport { generateUniqueReference } from '~/src/server/plugins/engine/referenceNumbers.js'\nimport * as defaultServices from '~/src/server/plugins/engine/services/index.js'\nimport {\n type AnyFormRequest,\n type ExternalStateAppendage,\n type FormContext,\n type FormPayload,\n type FormSubmissionState,\n type OnRequestCallback,\n type PluginOptions\n} from '~/src/server/plugins/engine/types.js'\nimport {\n type FormRequest,\n type FormResponseToolkit\n} from '~/src/server/routes/types.js'\n\nexport async function redirectOrMakeHandler(\n request: AnyFormRequest,\n h: FormResponseToolkit,\n onRequest: OnRequestCallback | undefined,\n makeHandler: (\n page: PageControllerClass,\n context: FormContext\n ) => ResponseObject | Promise<ResponseObject>\n) {\n const { app, params } = request\n const { model } = app\n\n if (!model) {\n throw Boom.notFound(`No model found for /${params.path}`)\n }\n\n const cacheService = getCacheService(request.server)\n const page = getPage(model, request)\n let state = await page.getState(request)\n\n if (!state.$$__referenceNumber) {\n const prefix = model.def.metadata?.referenceNumberPrefix ?? ''\n\n if (typeof prefix !== 'string') {\n throw Boom.badImplementation(\n 'Reference number prefix must be a string or undefined'\n )\n }\n\n const referenceNumber = generateUniqueReference(prefix)\n state = await page.mergeState(request, state, {\n $$__referenceNumber: referenceNumber\n })\n }\n\n state = await importExternalComponentState(request, page, state)\n\n const flash = cacheService.getFlash(request)\n const context = model.getFormContext(request, state, flash?.errors)\n const relevantPath = page.getRelevantPath(request, context)\n const summaryPath = page.getSummaryPath()\n\n // Call the onRequest callback if it has been supplied\n if (onRequest) {\n const result = await onRequest(request, h, context)\n if (result !== h.continue) {\n return result\n }\n }\n\n // Return handler for relevant pages or preview URL direct access\n if (relevantPath.startsWith(page.path) || context.isForceAccess) {\n return makeHandler(page, context)\n }\n\n // Redirect back to last relevant page\n const redirectTo = findPage(model, relevantPath)\n\n // Set the return URL unless an exit page\n if (redirectTo?.next.length) {\n request.query.returnUrl = page.getHref(summaryPath)\n }\n\n return proceed(request, h, page.getHref(relevantPath))\n}\n\nasync function importExternalComponentState(\n request: AnyFormRequest,\n page: PageControllerClass,\n state: FormSubmissionState\n): Promise<FormSubmissionState> {\n const externalComponentData = request.yar.flash(EXTERNAL_STATE_APPENDAGE)\n\n if (Array.isArray(externalComponentData)) {\n return state\n }\n\n const typedStateAppendage = externalComponentData as ExternalStateAppendage\n const componentName = typedStateAppendage.component\n const stateAppendage = typedStateAppendage.data\n const component = request.app.model?.componentMap.get(componentName)\n\n if (!component) {\n throw new Error(`Component ${componentName} not found in form`)\n }\n\n if (!(component instanceof FormComponent)) {\n throw new TypeError(\n `Component ${componentName} is not a FormComponent and does not support isState`\n )\n }\n\n const isStateValid = component.isState(stateAppendage)\n\n if (!isStateValid) {\n throw new Error(`State for component ${componentName} is invalid`)\n }\n\n const componentState = isFormState(stateAppendage)\n ? Object.fromEntries(\n Object.entries(stateAppendage).map(([key, value]) => [\n `${componentName}__${key}`,\n value\n ])\n )\n : { [componentName]: stateAppendage }\n\n // Save the external component state immediately\n const updatedState = await page.mergeState(request, state, componentState)\n\n // Merge the stashed payload into the local state\n const payload = request.yar.flash(EXTERNAL_STATE_PAYLOAD)\n const stashedPayload = Array.isArray(payload) ? {} : (payload as FormPayload)\n\n return { ...stashedPayload, ...updatedState }\n}\n\nexport function makeLoadFormPreHandler(server: Server, options: PluginOptions) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- hapi types are wrong\n const prefix = server.realm.modifiers.route.prefix ?? ''\n\n const {\n services = defaultServices,\n controllers,\n ordnanceSurveyApiKey\n } = options\n\n const { formsService } = services\n\n async function handler(request: AnyFormRequest, h: ResponseToolkit) {\n if (server.app.model) {\n request.app.model = server.app.model\n\n return h.continue\n }\n\n const { params } = request\n const { slug } = params\n const { isPreview, state: formState } = checkFormStatus(params)\n\n // Get the form metadata using the `slug` param\n const metadata = await formsService.getFormMetadata(slug)\n\n const { id, [formState]: state } = metadata\n\n // Check the metadata supports the requested state\n if (!state) {\n throw Boom.notFound(`No '${formState}' state for form metadata ${id}`)\n }\n\n // Cache the models based on id, state and whether\n // it's a preview or not. There could be up to 3 models\n // cached for a single form:\n // \"{id}_live_false\" (live/live)\n // \"{id}_live_true\" (live/preview)\n // \"{id}_draft_true\" (draft/preview)\n const key = `${id}_${formState}_${isPreview}`\n let item = server.app.models.get(key)\n\n if (!item || !isEqual(item.updatedAt, state.updatedAt)) {\n server.logger.info(`Getting form definition ${id} (${slug}) ${formState}`)\n\n // Get the form definition using the `id` from the metadata\n const definition = await formsService.getFormDefinition(id, formState)\n\n if (!definition) {\n throw Boom.notFound(\n `No definition found for form metadata ${id} (${slug}) ${formState}`\n )\n }\n\n const emailAddress = metadata.notificationEmail ?? definition.outputEmail\n\n checkEmailAddressForLiveFormSubmission(emailAddress, isPreview)\n\n // Build the form model\n server.logger.info(\n `Building model for form definition ${id} (${slug}) ${formState}`\n )\n\n // Set up the basePath for the model\n const basePath = (\n isPreview\n ? `${prefix}${PREVIEW_PATH_PREFIX}/${formState}/${slug}`\n : `${prefix}/${slug}`\n ).substring(1)\n\n const versionNumber = metadata.versions?.[0]?.versionNumber\n\n // Construct the form model\n const model = new FormModel(\n definition,\n { basePath, versionNumber, ordnanceSurveyApiKey },\n services,\n controllers\n )\n\n // Create new item and add it to the item cache\n item = { model, updatedAt: state.updatedAt }\n server.app.models.set(key, item)\n }\n\n // Assign the model to the request data\n // for use in the downstream handler\n request.app.model = item.model\n\n return h.continue\n }\n\n return handler\n}\n\nexport function dispatchHandler(request: FormRequest, h: FormResponseToolkit) {\n const { model } = request.app\n\n const servicePath = model ? `/${model.basePath}` : ''\n return proceed(request, h, `${servicePath}${getStartPath(model)}`)\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type ResponseObject, type RouteOptions, type ServerRoute } from '@hapi/hapi';
|
|
2
|
-
import { type PreparePageEventRequestOptions } from '~/src/server/plugins/engine/types.js';
|
|
2
|
+
import { type OnRequestCallback, type PreparePageEventRequestOptions } from '~/src/server/plugins/engine/types.js';
|
|
3
3
|
import { type FormRequest, type FormRequestPayload, type FormRequestPayloadRefs, type FormRequestRefs, type FormResponseToolkit } from '~/src/server/routes/types.js';
|
|
4
|
-
export declare function makeGetHandler(preparePageEventRequestOptions?: PreparePageEventRequestOptions): (request: FormRequest, h: FormResponseToolkit) => ResponseObject | Promise<ResponseObject>;
|
|
5
|
-
export declare function makePostHandler(preparePageEventRequestOptions?: PreparePageEventRequestOptions): (request: FormRequestPayload, h: FormResponseToolkit) => Promise<ResponseObject>;
|
|
6
|
-
export declare function getRoutes(getRouteOptions: RouteOptions<FormRequestRefs>, postRouteOptions: RouteOptions<FormRequestPayloadRefs>, preparePageEventRequestOptions?: PreparePageEventRequestOptions): (ServerRoute<FormRequestRefs> | ServerRoute<FormRequestPayloadRefs>)[];
|
|
4
|
+
export declare function makeGetHandler(preparePageEventRequestOptions?: PreparePageEventRequestOptions, onRequest?: OnRequestCallback): (request: FormRequest, h: FormResponseToolkit) => ResponseObject | Promise<symbol | ResponseObject>;
|
|
5
|
+
export declare function makePostHandler(preparePageEventRequestOptions?: PreparePageEventRequestOptions, onRequest?: OnRequestCallback): (request: FormRequestPayload, h: FormResponseToolkit) => Promise<symbol | ResponseObject>;
|
|
6
|
+
export declare function getRoutes(getRouteOptions: RouteOptions<FormRequestRefs>, postRouteOptions: RouteOptions<FormRequestPayloadRefs>, preparePageEventRequestOptions?: PreparePageEventRequestOptions, onRequest?: OnRequestCallback): (ServerRoute<FormRequestRefs> | ServerRoute<FormRequestPayloadRefs>)[];
|
|
@@ -34,7 +34,7 @@ async function handleHttpEvent(request, page, context, event, model, preparePage
|
|
|
34
34
|
} = await httpService.postJson(url, opts);
|
|
35
35
|
Object.assign(context.data, response);
|
|
36
36
|
}
|
|
37
|
-
export function makeGetHandler(preparePageEventRequestOptions) {
|
|
37
|
+
export function makeGetHandler(preparePageEventRequestOptions, onRequest) {
|
|
38
38
|
return function getHandler(request, h) {
|
|
39
39
|
const {
|
|
40
40
|
params
|
|
@@ -42,7 +42,7 @@ export function makeGetHandler(preparePageEventRequestOptions) {
|
|
|
42
42
|
if (normalisePath(params.path) === '') {
|
|
43
43
|
return dispatchHandler(request, h);
|
|
44
44
|
}
|
|
45
|
-
return redirectOrMakeHandler(request, h, async (page, context) => {
|
|
45
|
+
return redirectOrMakeHandler(request, h, onRequest, async (page, context) => {
|
|
46
46
|
// Check for a page onLoad HTTP event and if one exists,
|
|
47
47
|
// call it and assign the response to the context data
|
|
48
48
|
const {
|
|
@@ -61,12 +61,12 @@ export function makeGetHandler(preparePageEventRequestOptions) {
|
|
|
61
61
|
});
|
|
62
62
|
};
|
|
63
63
|
}
|
|
64
|
-
export function makePostHandler(preparePageEventRequestOptions) {
|
|
64
|
+
export function makePostHandler(preparePageEventRequestOptions, onRequest) {
|
|
65
65
|
return function postHandler(request, h) {
|
|
66
66
|
const {
|
|
67
67
|
query
|
|
68
68
|
} = request;
|
|
69
|
-
return redirectOrMakeHandler(request, h, async (page, context) => {
|
|
69
|
+
return redirectOrMakeHandler(request, h, onRequest, async (page, context) => {
|
|
70
70
|
const {
|
|
71
71
|
pageDef
|
|
72
72
|
} = page;
|
|
@@ -101,11 +101,11 @@ function isSuccessful(response) {
|
|
|
101
101
|
} = response;
|
|
102
102
|
return !Boom.isBoom(response) && statusCode >= 200 && statusCode < 400;
|
|
103
103
|
}
|
|
104
|
-
export function getRoutes(getRouteOptions, postRouteOptions, preparePageEventRequestOptions) {
|
|
104
|
+
export function getRoutes(getRouteOptions, postRouteOptions, preparePageEventRequestOptions, onRequest) {
|
|
105
105
|
return [{
|
|
106
106
|
method: 'get',
|
|
107
107
|
path: '/{slug}',
|
|
108
|
-
handler: makeGetHandler(preparePageEventRequestOptions),
|
|
108
|
+
handler: makeGetHandler(preparePageEventRequestOptions, onRequest),
|
|
109
109
|
options: {
|
|
110
110
|
...getRouteOptions,
|
|
111
111
|
validate: {
|
|
@@ -130,7 +130,7 @@ export function getRoutes(getRouteOptions, postRouteOptions, preparePageEventReq
|
|
|
130
130
|
}, {
|
|
131
131
|
method: 'get',
|
|
132
132
|
path: '/{slug}/{path}/{itemId?}',
|
|
133
|
-
handler: makeGetHandler(preparePageEventRequestOptions),
|
|
133
|
+
handler: makeGetHandler(preparePageEventRequestOptions, onRequest),
|
|
134
134
|
options: {
|
|
135
135
|
...getRouteOptions,
|
|
136
136
|
validate: {
|
|
@@ -144,7 +144,7 @@ export function getRoutes(getRouteOptions, postRouteOptions, preparePageEventReq
|
|
|
144
144
|
}, {
|
|
145
145
|
method: 'get',
|
|
146
146
|
path: '/preview/{state}/{slug}/{path}/{itemId?}',
|
|
147
|
-
handler: makeGetHandler(preparePageEventRequestOptions),
|
|
147
|
+
handler: makeGetHandler(preparePageEventRequestOptions, onRequest),
|
|
148
148
|
options: {
|
|
149
149
|
...getRouteOptions,
|
|
150
150
|
validate: {
|
|
@@ -159,7 +159,7 @@ export function getRoutes(getRouteOptions, postRouteOptions, preparePageEventReq
|
|
|
159
159
|
}, {
|
|
160
160
|
method: 'post',
|
|
161
161
|
path: '/{slug}/{path}/{itemId?}',
|
|
162
|
-
handler: makePostHandler(preparePageEventRequestOptions),
|
|
162
|
+
handler: makePostHandler(preparePageEventRequestOptions, onRequest),
|
|
163
163
|
options: {
|
|
164
164
|
...postRouteOptions,
|
|
165
165
|
validate: {
|
|
@@ -177,7 +177,7 @@ export function getRoutes(getRouteOptions, postRouteOptions, preparePageEventReq
|
|
|
177
177
|
}, {
|
|
178
178
|
method: 'post',
|
|
179
179
|
path: '/preview/{state}/{slug}/{path}/{itemId?}',
|
|
180
|
-
handler: makePostHandler(preparePageEventRequestOptions),
|
|
180
|
+
handler: makePostHandler(preparePageEventRequestOptions, onRequest),
|
|
181
181
|
options: {
|
|
182
182
|
...postRouteOptions,
|
|
183
183
|
validate: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"questions.js","names":["hasFormComponents","slugSchema","Boom","Joi","normalisePath","proceed","redirectPath","SummaryViewModel","format","getFormSubmissionData","dispatchHandler","redirectOrMakeHandler","actionSchema","crumbSchema","itemIdSchema","pathSchema","stateSchema","httpService","handleHttpEvent","request","page","context","event","model","preparePageEventRequestOptions","options","url","viewModel","items","details","payload","undefined","opts","response","postJson","Object","assign","data","makeGetHandler","getHandler","h","params","path","events","app","notFound","onLoad","type","makeGetRouteHandler","makePostHandler","postHandler","query","pageDef","isForceAccess","href","makePostRouteHandler","onSave","isSuccessful","statusCode","isBoom","getRoutes","getRouteOptions","postRouteOptions","method","handler","validate","object","keys","slug","state","itemId","optional","crumb","action","unknown","required"],"sources":["../../../../../src/server/plugins/engine/routes/questions.ts"],"sourcesContent":["import { hasFormComponents, slugSchema, type Event } from '@defra/forms-model'\nimport Boom from '@hapi/boom'\nimport {\n type ResponseObject,\n type RouteOptions,\n type ServerRoute\n} from '@hapi/hapi'\nimport Joi from 'joi'\n\nimport {\n normalisePath,\n proceed,\n redirectPath\n} from '~/src/server/plugins/engine/helpers.js'\nimport {\n SummaryViewModel,\n type FormModel\n} from '~/src/server/plugins/engine/models/index.js'\nimport { format } from '~/src/server/plugins/engine/outputFormatters/machine/v1.js'\nimport { getFormSubmissionData } from '~/src/server/plugins/engine/pageControllers/SummaryPageController.js'\nimport { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'\nimport {\n dispatchHandler,\n redirectOrMakeHandler\n} from '~/src/server/plugins/engine/routes/index.js'\nimport {\n type AnyFormRequest,\n type FormContext,\n type PreparePageEventRequestOptions\n} from '~/src/server/plugins/engine/types.js'\nimport {\n type FormRequest,\n type FormRequestPayload,\n type FormRequestPayloadRefs,\n type FormRequestRefs,\n type FormResponseToolkit\n} from '~/src/server/routes/types.js'\nimport {\n actionSchema,\n crumbSchema,\n itemIdSchema,\n pathSchema,\n stateSchema\n} from '~/src/server/schemas/index.js'\nimport * as httpService from '~/src/server/services/httpService.js'\n\nasync function handleHttpEvent(\n request: AnyFormRequest,\n page: PageControllerClass,\n context: FormContext,\n event: Event,\n model: FormModel,\n preparePageEventRequestOptions?: PreparePageEventRequestOptions\n) {\n const { options } = event\n const { url } = options\n\n // TODO: Update structured data POST payload with when helper\n // is updated to removing the dependency on `SummaryViewModel` etc.\n const viewModel = new SummaryViewModel(request, page, context)\n const items = getFormSubmissionData(viewModel.context, viewModel.details)\n\n // @ts-expect-error - function signature will be refactored in the next iteration of the formatter\n const payload = format(context, items, model, undefined, undefined)\n const opts = { payload }\n\n if (preparePageEventRequestOptions) {\n preparePageEventRequestOptions(opts, event, page, context)\n }\n\n const { payload: response } = await httpService.postJson(url, opts)\n\n Object.assign(context.data, response)\n}\n\nexport function makeGetHandler(\n preparePageEventRequestOptions?: PreparePageEventRequestOptions\n) {\n return function getHandler(request: FormRequest, h: FormResponseToolkit) {\n const { params } = request\n\n if (normalisePath(params.path) === '') {\n return dispatchHandler(request, h)\n }\n\n return redirectOrMakeHandler(request, h, async (page, context) => {\n // Check for a page onLoad HTTP event and if one exists,\n // call it and assign the response to the context data\n const { events } = page\n const { model } = request.app\n\n if (!model) {\n throw Boom.notFound(`No model found for /${params.path}`)\n }\n\n if (events?.onLoad && events.onLoad.type === 'http') {\n await handleHttpEvent(\n request,\n page,\n context,\n events.onLoad,\n model,\n preparePageEventRequestOptions\n )\n }\n\n return page.makeGetRouteHandler()(request, context, h)\n })\n }\n}\n\nexport function makePostHandler(\n preparePageEventRequestOptions?: PreparePageEventRequestOptions\n) {\n return function postHandler(\n request: FormRequestPayload,\n h: FormResponseToolkit\n ) {\n const { query } = request\n\n return redirectOrMakeHandler(request, h, async (page, context) => {\n const { pageDef } = page\n const { isForceAccess } = context\n const { model } = request.app\n const { events } = page\n\n // Redirect to GET for preview URL direct access\n if (isForceAccess && !hasFormComponents(pageDef)) {\n return proceed(request, h, redirectPath(page.href, query))\n }\n\n if (!model) {\n throw Boom.notFound(`No model found for /${request.params.path}`)\n }\n\n const response = await page.makePostRouteHandler()(request, context, h)\n\n if (\n events?.onSave &&\n events.onSave.type === 'http' &&\n isSuccessful(response)\n ) {\n await handleHttpEvent(\n request,\n page,\n context,\n events.onSave,\n model,\n preparePageEventRequestOptions\n )\n }\n\n return response\n })\n }\n}\n\nfunction isSuccessful(response: ResponseObject): boolean {\n const { statusCode } = response\n\n return !Boom.isBoom(response) && statusCode >= 200 && statusCode < 400\n}\n\nexport function getRoutes(\n getRouteOptions: RouteOptions<FormRequestRefs>,\n postRouteOptions: RouteOptions<FormRequestPayloadRefs>,\n preparePageEventRequestOptions?: PreparePageEventRequestOptions\n): (ServerRoute<FormRequestRefs> | ServerRoute<FormRequestPayloadRefs>)[] {\n return [\n {\n method: 'get',\n path: '/{slug}',\n handler: makeGetHandler(preparePageEventRequestOptions),\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema\n })\n }\n }\n },\n {\n method: 'get',\n path: '/preview/{state}/{slug}',\n handler: dispatchHandler,\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema\n })\n }\n }\n },\n {\n method: 'get',\n path: '/{slug}/{path}/{itemId?}',\n handler: makeGetHandler(preparePageEventRequestOptions),\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema.optional()\n })\n }\n }\n },\n {\n method: 'get',\n path: '/preview/{state}/{slug}/{path}/{itemId?}',\n handler: makeGetHandler(preparePageEventRequestOptions),\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema.optional()\n })\n }\n }\n },\n {\n method: 'post',\n path: '/{slug}/{path}/{itemId?}',\n handler: makePostHandler(preparePageEventRequestOptions),\n options: {\n ...postRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema.optional()\n }),\n payload: Joi.object()\n .keys({\n crumb: crumbSchema,\n action: actionSchema\n })\n .unknown(true)\n .required()\n }\n }\n },\n {\n method: 'post',\n path: '/preview/{state}/{slug}/{path}/{itemId?}',\n handler: makePostHandler(preparePageEventRequestOptions),\n options: {\n ...postRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema.optional()\n }),\n payload: Joi.object()\n .keys({\n crumb: crumbSchema,\n action: actionSchema\n })\n .unknown(true)\n .required()\n }\n }\n }\n ]\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"questions.js","names":["hasFormComponents","slugSchema","Boom","Joi","normalisePath","proceed","redirectPath","SummaryViewModel","format","getFormSubmissionData","dispatchHandler","redirectOrMakeHandler","actionSchema","crumbSchema","itemIdSchema","pathSchema","stateSchema","httpService","handleHttpEvent","request","page","context","event","model","preparePageEventRequestOptions","options","url","viewModel","items","details","payload","undefined","opts","response","postJson","Object","assign","data","makeGetHandler","onRequest","getHandler","h","params","path","events","app","notFound","onLoad","type","makeGetRouteHandler","makePostHandler","postHandler","query","pageDef","isForceAccess","href","makePostRouteHandler","onSave","isSuccessful","statusCode","isBoom","getRoutes","getRouteOptions","postRouteOptions","method","handler","validate","object","keys","slug","state","itemId","optional","crumb","action","unknown","required"],"sources":["../../../../../src/server/plugins/engine/routes/questions.ts"],"sourcesContent":["import { hasFormComponents, slugSchema, type Event } from '@defra/forms-model'\nimport Boom from '@hapi/boom'\nimport {\n type ResponseObject,\n type RouteOptions,\n type ServerRoute\n} from '@hapi/hapi'\nimport Joi from 'joi'\n\nimport {\n normalisePath,\n proceed,\n redirectPath\n} from '~/src/server/plugins/engine/helpers.js'\nimport {\n SummaryViewModel,\n type FormModel\n} from '~/src/server/plugins/engine/models/index.js'\nimport { format } from '~/src/server/plugins/engine/outputFormatters/machine/v1.js'\nimport { getFormSubmissionData } from '~/src/server/plugins/engine/pageControllers/SummaryPageController.js'\nimport { type PageControllerClass } from '~/src/server/plugins/engine/pageControllers/helpers/pages.js'\nimport {\n dispatchHandler,\n redirectOrMakeHandler\n} from '~/src/server/plugins/engine/routes/index.js'\nimport {\n type AnyFormRequest,\n type FormContext,\n type OnRequestCallback,\n type PreparePageEventRequestOptions\n} from '~/src/server/plugins/engine/types.js'\nimport {\n type FormRequest,\n type FormRequestPayload,\n type FormRequestPayloadRefs,\n type FormRequestRefs,\n type FormResponseToolkit\n} from '~/src/server/routes/types.js'\nimport {\n actionSchema,\n crumbSchema,\n itemIdSchema,\n pathSchema,\n stateSchema\n} from '~/src/server/schemas/index.js'\nimport * as httpService from '~/src/server/services/httpService.js'\n\nasync function handleHttpEvent(\n request: AnyFormRequest,\n page: PageControllerClass,\n context: FormContext,\n event: Event,\n model: FormModel,\n preparePageEventRequestOptions?: PreparePageEventRequestOptions\n) {\n const { options } = event\n const { url } = options\n\n // TODO: Update structured data POST payload with when helper\n // is updated to removing the dependency on `SummaryViewModel` etc.\n const viewModel = new SummaryViewModel(request, page, context)\n const items = getFormSubmissionData(viewModel.context, viewModel.details)\n\n // @ts-expect-error - function signature will be refactored in the next iteration of the formatter\n const payload = format(context, items, model, undefined, undefined)\n const opts = { payload }\n\n if (preparePageEventRequestOptions) {\n preparePageEventRequestOptions(opts, event, page, context)\n }\n\n const { payload: response } = await httpService.postJson(url, opts)\n\n Object.assign(context.data, response)\n}\n\nexport function makeGetHandler(\n preparePageEventRequestOptions?: PreparePageEventRequestOptions,\n onRequest?: OnRequestCallback\n) {\n return function getHandler(request: FormRequest, h: FormResponseToolkit) {\n const { params } = request\n\n if (normalisePath(params.path) === '') {\n return dispatchHandler(request, h)\n }\n\n return redirectOrMakeHandler(\n request,\n h,\n onRequest,\n async (page, context) => {\n // Check for a page onLoad HTTP event and if one exists,\n // call it and assign the response to the context data\n const { events } = page\n const { model } = request.app\n\n if (!model) {\n throw Boom.notFound(`No model found for /${params.path}`)\n }\n\n if (events?.onLoad && events.onLoad.type === 'http') {\n await handleHttpEvent(\n request,\n page,\n context,\n events.onLoad,\n model,\n preparePageEventRequestOptions\n )\n }\n\n return page.makeGetRouteHandler()(request, context, h)\n }\n )\n }\n}\n\nexport function makePostHandler(\n preparePageEventRequestOptions?: PreparePageEventRequestOptions,\n onRequest?: OnRequestCallback\n) {\n return function postHandler(\n request: FormRequestPayload,\n h: FormResponseToolkit\n ) {\n const { query } = request\n\n return redirectOrMakeHandler(\n request,\n h,\n onRequest,\n async (page, context) => {\n const { pageDef } = page\n const { isForceAccess } = context\n const { model } = request.app\n const { events } = page\n\n // Redirect to GET for preview URL direct access\n if (isForceAccess && !hasFormComponents(pageDef)) {\n return proceed(request, h, redirectPath(page.href, query))\n }\n\n if (!model) {\n throw Boom.notFound(`No model found for /${request.params.path}`)\n }\n\n const response = await page.makePostRouteHandler()(request, context, h)\n\n if (\n events?.onSave &&\n events.onSave.type === 'http' &&\n isSuccessful(response)\n ) {\n await handleHttpEvent(\n request,\n page,\n context,\n events.onSave,\n model,\n preparePageEventRequestOptions\n )\n }\n\n return response\n }\n )\n }\n}\n\nfunction isSuccessful(response: ResponseObject): boolean {\n const { statusCode } = response\n\n return !Boom.isBoom(response) && statusCode >= 200 && statusCode < 400\n}\n\nexport function getRoutes(\n getRouteOptions: RouteOptions<FormRequestRefs>,\n postRouteOptions: RouteOptions<FormRequestPayloadRefs>,\n preparePageEventRequestOptions?: PreparePageEventRequestOptions,\n onRequest?: OnRequestCallback\n): (ServerRoute<FormRequestRefs> | ServerRoute<FormRequestPayloadRefs>)[] {\n return [\n {\n method: 'get',\n path: '/{slug}',\n handler: makeGetHandler(preparePageEventRequestOptions, onRequest),\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema\n })\n }\n }\n },\n {\n method: 'get',\n path: '/preview/{state}/{slug}',\n handler: dispatchHandler,\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema\n })\n }\n }\n },\n {\n method: 'get',\n path: '/{slug}/{path}/{itemId?}',\n handler: makeGetHandler(preparePageEventRequestOptions, onRequest),\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema.optional()\n })\n }\n }\n },\n {\n method: 'get',\n path: '/preview/{state}/{slug}/{path}/{itemId?}',\n handler: makeGetHandler(preparePageEventRequestOptions, onRequest),\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema.optional()\n })\n }\n }\n },\n {\n method: 'post',\n path: '/{slug}/{path}/{itemId?}',\n handler: makePostHandler(preparePageEventRequestOptions, onRequest),\n options: {\n ...postRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema.optional()\n }),\n payload: Joi.object()\n .keys({\n crumb: crumbSchema,\n action: actionSchema\n })\n .unknown(true)\n .required()\n }\n }\n },\n {\n method: 'post',\n path: '/preview/{state}/{slug}/{path}/{itemId?}',\n handler: makePostHandler(preparePageEventRequestOptions, onRequest),\n options: {\n ...postRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema.optional()\n }),\n payload: Joi.object()\n .keys({\n crumb: crumbSchema,\n action: actionSchema\n })\n .unknown(true)\n .required()\n }\n }\n }\n ]\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import { type RouteOptions, type ServerRoute } from '@hapi/hapi';
|
|
2
|
+
import { type OnRequestCallback } from '~/src/server/plugins/engine/types.js';
|
|
2
3
|
import { type FormRequestPayloadRefs, type FormRequestRefs } from '~/src/server/routes/types.js';
|
|
3
|
-
export declare function getRoutes(getRouteOptions: RouteOptions<FormRequestRefs>, postRouteOptions: RouteOptions<FormRequestPayloadRefs
|
|
4
|
+
export declare function getRoutes(getRouteOptions: RouteOptions<FormRequestRefs>, postRouteOptions: RouteOptions<FormRequestPayloadRefs>, onRequest?: OnRequestCallback): (ServerRoute<FormRequestRefs> | ServerRoute<FormRequestPayloadRefs>)[];
|
|
@@ -7,36 +7,40 @@ import { redirectOrMakeHandler } from "../index.js";
|
|
|
7
7
|
import { actionSchema, confirmSchema, crumbSchema, itemIdSchema, pathSchema, stateSchema } from "../../../../schemas/index.js";
|
|
8
8
|
|
|
9
9
|
// Item delete GET route
|
|
10
|
-
function getHandler(
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
10
|
+
function getHandler(onRequest) {
|
|
11
|
+
return async function (request, h) {
|
|
12
|
+
const {
|
|
13
|
+
params
|
|
14
|
+
} = request;
|
|
15
|
+
return redirectOrMakeHandler(request, h, onRequest, (page, context) => {
|
|
16
|
+
if (!(page instanceof RepeatPageController || page instanceof FileUploadPageController)) {
|
|
17
|
+
throw Boom.notFound(`No page found for /${params.path}`);
|
|
18
|
+
}
|
|
19
|
+
return page.makeGetItemDeleteRouteHandler()(request, context, h);
|
|
20
|
+
});
|
|
21
|
+
};
|
|
20
22
|
}
|
|
21
|
-
function postHandler(
|
|
22
|
-
|
|
23
|
-
params
|
|
24
|
-
} = request;
|
|
25
|
-
return redirectOrMakeHandler(request, h, (page, context) => {
|
|
23
|
+
function postHandler(onRequest) {
|
|
24
|
+
return async function (request, h) {
|
|
26
25
|
const {
|
|
27
|
-
|
|
28
|
-
} =
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
26
|
+
params
|
|
27
|
+
} = request;
|
|
28
|
+
return redirectOrMakeHandler(request, h, onRequest, (page, context) => {
|
|
29
|
+
const {
|
|
30
|
+
isForceAccess
|
|
31
|
+
} = context;
|
|
32
|
+
if (isForceAccess || !(page instanceof RepeatPageController || page instanceof FileUploadPageController)) {
|
|
33
|
+
throw Boom.notFound(`No page found for /${params.path}`);
|
|
34
|
+
}
|
|
35
|
+
return page.makePostItemDeleteRouteHandler()(request, context, h);
|
|
36
|
+
});
|
|
37
|
+
};
|
|
34
38
|
}
|
|
35
|
-
export function getRoutes(getRouteOptions, postRouteOptions) {
|
|
39
|
+
export function getRoutes(getRouteOptions, postRouteOptions, onRequest) {
|
|
36
40
|
return [{
|
|
37
41
|
method: 'get',
|
|
38
42
|
path: '/{slug}/{path}/{itemId}/confirm-delete',
|
|
39
|
-
handler: getHandler,
|
|
43
|
+
handler: getHandler(onRequest),
|
|
40
44
|
options: {
|
|
41
45
|
...getRouteOptions,
|
|
42
46
|
validate: {
|
|
@@ -50,7 +54,7 @@ export function getRoutes(getRouteOptions, postRouteOptions) {
|
|
|
50
54
|
}, {
|
|
51
55
|
method: 'get',
|
|
52
56
|
path: '/preview/{state}/{slug}/{path}/{itemId}/confirm-delete',
|
|
53
|
-
handler: getHandler,
|
|
57
|
+
handler: getHandler(onRequest),
|
|
54
58
|
options: {
|
|
55
59
|
...getRouteOptions,
|
|
56
60
|
validate: {
|
|
@@ -65,7 +69,7 @@ export function getRoutes(getRouteOptions, postRouteOptions) {
|
|
|
65
69
|
}, {
|
|
66
70
|
method: 'post',
|
|
67
71
|
path: '/{slug}/{path}/{itemId}/confirm-delete',
|
|
68
|
-
handler: postHandler,
|
|
72
|
+
handler: postHandler(onRequest),
|
|
69
73
|
options: {
|
|
70
74
|
...postRouteOptions,
|
|
71
75
|
validate: {
|
|
@@ -84,7 +88,7 @@ export function getRoutes(getRouteOptions, postRouteOptions) {
|
|
|
84
88
|
}, {
|
|
85
89
|
method: 'post',
|
|
86
90
|
path: '/preview/{state}/{slug}/{path}/{itemId}/confirm-delete',
|
|
87
|
-
handler: postHandler,
|
|
91
|
+
handler: postHandler(onRequest),
|
|
88
92
|
options: {
|
|
89
93
|
...postRouteOptions,
|
|
90
94
|
validate: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"item-delete.js","names":["slugSchema","Boom","Joi","FileUploadPageController","RepeatPageController","redirectOrMakeHandler","actionSchema","confirmSchema","crumbSchema","itemIdSchema","pathSchema","stateSchema","getHandler","request","h","params","page","context","notFound","path","makeGetItemDeleteRouteHandler","postHandler","isForceAccess","makePostItemDeleteRouteHandler","getRoutes","getRouteOptions","postRouteOptions","method","handler","options","validate","object","keys","slug","itemId","state","payload","crumb","action","confirm","required"],"sources":["../../../../../../src/server/plugins/engine/routes/repeaters/item-delete.ts"],"sourcesContent":["import { slugSchema } from '@defra/forms-model'\nimport Boom from '@hapi/boom'\nimport { type RouteOptions, type ServerRoute } from '@hapi/hapi'\nimport Joi from 'joi'\n\nimport { FileUploadPageController } from '~/src/server/plugins/engine/pageControllers/FileUploadPageController.js'\nimport { RepeatPageController } from '~/src/server/plugins/engine/pageControllers/RepeatPageController.js'\nimport { redirectOrMakeHandler } from '~/src/server/plugins/engine/routes/index.js'\nimport {\n type FormRequest,\n type FormRequestPayload,\n type FormRequestPayloadRefs,\n type FormRequestRefs,\n type FormResponseToolkit\n} from '~/src/server/routes/types.js'\nimport {\n actionSchema,\n confirmSchema,\n crumbSchema,\n itemIdSchema,\n pathSchema,\n stateSchema\n} from '~/src/server/schemas/index.js'\n\n// Item delete GET route\nfunction getHandler(request: FormRequest, h: FormResponseToolkit) {\n
|
|
1
|
+
{"version":3,"file":"item-delete.js","names":["slugSchema","Boom","Joi","FileUploadPageController","RepeatPageController","redirectOrMakeHandler","actionSchema","confirmSchema","crumbSchema","itemIdSchema","pathSchema","stateSchema","getHandler","onRequest","request","h","params","page","context","notFound","path","makeGetItemDeleteRouteHandler","postHandler","isForceAccess","makePostItemDeleteRouteHandler","getRoutes","getRouteOptions","postRouteOptions","method","handler","options","validate","object","keys","slug","itemId","state","payload","crumb","action","confirm","required"],"sources":["../../../../../../src/server/plugins/engine/routes/repeaters/item-delete.ts"],"sourcesContent":["import { slugSchema } from '@defra/forms-model'\nimport Boom from '@hapi/boom'\nimport { type RouteOptions, type ServerRoute } from '@hapi/hapi'\nimport Joi from 'joi'\n\nimport { FileUploadPageController } from '~/src/server/plugins/engine/pageControllers/FileUploadPageController.js'\nimport { RepeatPageController } from '~/src/server/plugins/engine/pageControllers/RepeatPageController.js'\nimport { redirectOrMakeHandler } from '~/src/server/plugins/engine/routes/index.js'\nimport { type OnRequestCallback } from '~/src/server/plugins/engine/types.js'\nimport {\n type FormRequest,\n type FormRequestPayload,\n type FormRequestPayloadRefs,\n type FormRequestRefs,\n type FormResponseToolkit\n} from '~/src/server/routes/types.js'\nimport {\n actionSchema,\n confirmSchema,\n crumbSchema,\n itemIdSchema,\n pathSchema,\n stateSchema\n} from '~/src/server/schemas/index.js'\n\n// Item delete GET route\nfunction getHandler(onRequest?: OnRequestCallback) {\n return async function (request: FormRequest, h: FormResponseToolkit) {\n const { params } = request\n\n return redirectOrMakeHandler(request, h, onRequest, (page, context) => {\n if (\n !(\n page instanceof RepeatPageController ||\n page instanceof FileUploadPageController\n )\n ) {\n throw Boom.notFound(`No page found for /${params.path}`)\n }\n\n return page.makeGetItemDeleteRouteHandler()(request, context, h)\n })\n }\n}\n\nfunction postHandler(onRequest?: OnRequestCallback) {\n return async function (request: FormRequestPayload, h: FormResponseToolkit) {\n const { params } = request\n\n return redirectOrMakeHandler(request, h, onRequest, (page, context) => {\n const { isForceAccess } = context\n\n if (\n isForceAccess ||\n !(\n page instanceof RepeatPageController ||\n page instanceof FileUploadPageController\n )\n ) {\n throw Boom.notFound(`No page found for /${params.path}`)\n }\n\n return page.makePostItemDeleteRouteHandler()(request, context, h)\n })\n }\n}\n\nexport function getRoutes(\n getRouteOptions: RouteOptions<FormRequestRefs>,\n postRouteOptions: RouteOptions<FormRequestPayloadRefs>,\n onRequest?: OnRequestCallback\n): (ServerRoute<FormRequestRefs> | ServerRoute<FormRequestPayloadRefs>)[] {\n return [\n {\n method: 'get',\n path: '/{slug}/{path}/{itemId}/confirm-delete',\n handler: getHandler(onRequest),\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema\n })\n }\n }\n },\n\n {\n method: 'get',\n path: '/preview/{state}/{slug}/{path}/{itemId}/confirm-delete',\n handler: getHandler(onRequest),\n options: {\n ...getRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema\n })\n }\n }\n },\n\n {\n method: 'post',\n path: '/{slug}/{path}/{itemId}/confirm-delete',\n handler: postHandler(onRequest),\n options: {\n ...postRouteOptions,\n validate: {\n params: Joi.object().keys({\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema\n }),\n payload: Joi.object()\n .keys({\n crumb: crumbSchema,\n action: actionSchema,\n confirm: confirmSchema\n })\n .required()\n }\n }\n },\n\n {\n method: 'post',\n path: '/preview/{state}/{slug}/{path}/{itemId}/confirm-delete',\n handler: postHandler(onRequest),\n options: {\n ...postRouteOptions,\n validate: {\n params: Joi.object().keys({\n state: stateSchema,\n slug: slugSchema,\n path: pathSchema,\n itemId: itemIdSchema\n }),\n payload: Joi.object()\n .keys({\n crumb: crumbSchema,\n action: actionSchema,\n confirm: confirmSchema\n })\n .required()\n }\n }\n }\n ]\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import { type RouteOptions, type ServerRoute } from '@hapi/hapi';
|
|
2
|
+
import { type OnRequestCallback } from '~/src/server/plugins/engine/types.js';
|
|
2
3
|
import { type FormRequestPayloadRefs, type FormRequestRefs } from '~/src/server/routes/types.js';
|
|
3
|
-
export declare function getRoutes(getRouteOptions: RouteOptions<FormRequestRefs>, postRouteOptions: RouteOptions<FormRequestPayloadRefs
|
|
4
|
+
export declare function getRoutes(getRouteOptions: RouteOptions<FormRequestRefs>, postRouteOptions: RouteOptions<FormRequestPayloadRefs>, onRequest?: OnRequestCallback): (ServerRoute<FormRequestRefs> | ServerRoute<FormRequestPayloadRefs>)[];
|
|
@@ -5,36 +5,40 @@ import Joi from 'joi';
|
|
|
5
5
|
import { RepeatPageController } from "../../pageControllers/RepeatPageController.js";
|
|
6
6
|
import { redirectOrMakeHandler } from "../index.js";
|
|
7
7
|
import { actionSchema, crumbSchema, pathSchema, stateSchema } from "../../../../schemas/index.js";
|
|
8
|
-
function getHandler(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
8
|
+
function getHandler(onRequest) {
|
|
9
|
+
return async function (request, h) {
|
|
10
|
+
const {
|
|
11
|
+
params
|
|
12
|
+
} = request;
|
|
13
|
+
return redirectOrMakeHandler(request, h, onRequest, (page, context) => {
|
|
14
|
+
if (!(page instanceof RepeatPageController)) {
|
|
15
|
+
throw Boom.notFound(`No repeater page found for /${params.path}`);
|
|
16
|
+
}
|
|
17
|
+
return page.makeGetListSummaryRouteHandler()(request, context, h);
|
|
18
|
+
});
|
|
19
|
+
};
|
|
18
20
|
}
|
|
19
|
-
function postHandler(
|
|
20
|
-
|
|
21
|
-
params
|
|
22
|
-
} = request;
|
|
23
|
-
return redirectOrMakeHandler(request, h, (page, context) => {
|
|
21
|
+
function postHandler(onRequest) {
|
|
22
|
+
return async function (request, h) {
|
|
24
23
|
const {
|
|
25
|
-
|
|
26
|
-
} =
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
24
|
+
params
|
|
25
|
+
} = request;
|
|
26
|
+
return redirectOrMakeHandler(request, h, onRequest, (page, context) => {
|
|
27
|
+
const {
|
|
28
|
+
isForceAccess
|
|
29
|
+
} = context;
|
|
30
|
+
if (isForceAccess || !(page instanceof RepeatPageController)) {
|
|
31
|
+
throw Boom.notFound(`No repeater page found for /${params.path}`);
|
|
32
|
+
}
|
|
33
|
+
return page.makePostListSummaryRouteHandler()(request, context, h);
|
|
34
|
+
});
|
|
35
|
+
};
|
|
32
36
|
}
|
|
33
|
-
export function getRoutes(getRouteOptions, postRouteOptions) {
|
|
37
|
+
export function getRoutes(getRouteOptions, postRouteOptions, onRequest) {
|
|
34
38
|
return [{
|
|
35
39
|
method: 'get',
|
|
36
40
|
path: '/{slug}/{path}/summary',
|
|
37
|
-
handler: getHandler,
|
|
41
|
+
handler: getHandler(onRequest),
|
|
38
42
|
options: {
|
|
39
43
|
...getRouteOptions,
|
|
40
44
|
validate: {
|
|
@@ -47,7 +51,7 @@ export function getRoutes(getRouteOptions, postRouteOptions) {
|
|
|
47
51
|
}, {
|
|
48
52
|
method: 'get',
|
|
49
53
|
path: '/preview/{state}/{slug}/{path}/summary',
|
|
50
|
-
handler: getHandler,
|
|
54
|
+
handler: getHandler(onRequest),
|
|
51
55
|
options: {
|
|
52
56
|
...getRouteOptions,
|
|
53
57
|
validate: {
|
|
@@ -61,7 +65,7 @@ export function getRoutes(getRouteOptions, postRouteOptions) {
|
|
|
61
65
|
}, {
|
|
62
66
|
method: 'post',
|
|
63
67
|
path: '/{slug}/{path}/summary',
|
|
64
|
-
handler: postHandler,
|
|
68
|
+
handler: postHandler(onRequest),
|
|
65
69
|
options: {
|
|
66
70
|
...postRouteOptions,
|
|
67
71
|
validate: {
|
|
@@ -78,7 +82,7 @@ export function getRoutes(getRouteOptions, postRouteOptions) {
|
|
|
78
82
|
}, {
|
|
79
83
|
method: 'post',
|
|
80
84
|
path: '/preview/{state}/{slug}/{path}/summary',
|
|
81
|
-
handler: postHandler,
|
|
85
|
+
handler: postHandler(onRequest),
|
|
82
86
|
options: {
|
|
83
87
|
...postRouteOptions,
|
|
84
88
|
validate: {
|