@defra/forms-engine-plugin 3.0.9 → 4.0.0

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.
Files changed (34) hide show
  1. package/.server/server/plugins/engine/plugin.js +3 -2
  2. package/.server/server/plugins/engine/plugin.js.map +1 -1
  3. package/.server/server/plugins/engine/routes/index.d.ts +2 -2
  4. package/.server/server/plugins/engine/routes/index.js +10 -8
  5. package/.server/server/plugins/engine/routes/index.js.map +1 -1
  6. package/.server/server/plugins/engine/routes/questions.d.ts +4 -4
  7. package/.server/server/plugins/engine/routes/questions.js +10 -10
  8. package/.server/server/plugins/engine/routes/questions.js.map +1 -1
  9. package/.server/server/plugins/engine/routes/repeaters/item-delete.d.ts +2 -1
  10. package/.server/server/plugins/engine/routes/repeaters/item-delete.js +31 -27
  11. package/.server/server/plugins/engine/routes/repeaters/item-delete.js.map +1 -1
  12. package/.server/server/plugins/engine/routes/repeaters/summary.d.ts +2 -1
  13. package/.server/server/plugins/engine/routes/repeaters/summary.js +31 -27
  14. package/.server/server/plugins/engine/routes/repeaters/summary.js.map +1 -1
  15. package/.server/server/plugins/engine/types.d.ts +3 -3
  16. package/.server/server/plugins/engine/types.js.map +1 -1
  17. package/.server/server/routes/types.d.ts +1 -1
  18. package/.server/server/routes/types.js.map +1 -1
  19. package/package.json +1 -1
  20. package/src/server/plugins/engine/helpers.test.ts +2 -1
  21. package/src/server/plugins/engine/pageControllers/PageController.test.ts +2 -1
  22. package/src/server/plugins/engine/pageControllers/QuestionPageController.test.ts +8 -4
  23. package/src/server/plugins/engine/pageControllers/SummaryPageController.test.ts +2 -1
  24. package/src/server/plugins/engine/plugin.ts +10 -4
  25. package/src/server/plugins/engine/routes/index.test.ts +316 -0
  26. package/src/server/plugins/engine/routes/index.ts +11 -6
  27. package/src/server/plugins/engine/routes/questions.test.ts +126 -15
  28. package/src/server/plugins/engine/routes/questions.ts +71 -57
  29. package/src/server/plugins/engine/routes/repeaters/item-delete.test.ts +83 -0
  30. package/src/server/plugins/engine/routes/repeaters/item-delete.ts +39 -33
  31. package/src/server/plugins/engine/routes/repeaters/summary.test.ts +75 -0
  32. package/src/server/plugins/engine/routes/repeaters/summary.ts +28 -22
  33. package/src/server/plugins/engine/types.ts +6 -7
  34. package/src/server/routes/types.ts +4 -1
@@ -40,8 +40,14 @@ jest.mock('~/src/server/plugins/engine/routes/index')
40
40
 
41
41
  describe('makeGetHandler', () => {
42
42
  const hMock: FormResponseToolkit = {
43
- redirect: jest.fn(),
44
- view: jest.fn()
43
+ redirect: jest.fn().mockReturnValue({
44
+ takeover: jest.fn().mockReturnValue({
45
+ statusCode: 302,
46
+ headers: { location: '/redirect-url' }
47
+ })
48
+ }),
49
+ view: jest.fn(),
50
+ continue: Symbol('continue')
45
51
  }
46
52
 
47
53
  beforeEach(() => {
@@ -84,8 +90,9 @@ describe('makeGetHandler', () => {
84
90
 
85
91
  jest
86
92
  .mocked(redirectOrMakeHandler)
87
- .mockImplementation((_req: AnyFormRequest, _h: FormResponseToolkit, fn) =>
88
- Promise.resolve(fn(pageMock, contextMock))
93
+ .mockImplementation(
94
+ (_req: AnyFormRequest, _h: FormResponseToolkit, _onRequest, fn) =>
95
+ Promise.resolve(fn(pageMock, contextMock))
89
96
  )
90
97
 
91
98
  await makeGetHandler()(requestMock, hMock)
@@ -126,8 +133,9 @@ describe('makeGetHandler', () => {
126
133
 
127
134
  jest
128
135
  .mocked(redirectOrMakeHandler)
129
- .mockImplementation((_req: AnyFormRequest, _h: FormResponseToolkit, fn) =>
130
- Promise.resolve(fn(pageMock, contextMock))
136
+ .mockImplementation(
137
+ (_req: AnyFormRequest, _h: FormResponseToolkit, _onRequest, fn) =>
138
+ Promise.resolve(fn(pageMock, contextMock))
131
139
  )
132
140
 
133
141
  await makeGetHandler()(requestMock, hMock)
@@ -164,7 +172,12 @@ describe('makeGetHandler', () => {
164
172
  jest
165
173
  .mocked(redirectOrMakeHandler)
166
174
  .mockImplementation(
167
- async (_req: AnyFormRequest, _h: FormResponseToolkit, fn) => {
175
+ async (
176
+ _req: AnyFormRequest,
177
+ _h: FormResponseToolkit,
178
+ _onRequest,
179
+ fn
180
+ ) => {
168
181
  try {
169
182
  await fn(pageMock, contextMock)
170
183
  } catch (err) {
@@ -179,12 +192,57 @@ describe('makeGetHandler', () => {
179
192
 
180
193
  expect(error).toEqual(Boom.notFound('No model found for /some-path'))
181
194
  })
195
+
196
+ it('should pass onRequest callback to redirectOrMakeHandler', async () => {
197
+ const onRequestCallback = jest.fn().mockResolvedValue(undefined)
198
+ const modelMock = {
199
+ basePath: 'some-base-path',
200
+ def: { name: 'Hello world' }
201
+ } as FormModel
202
+
203
+ const pageMock = createMockPageController(
204
+ modelMock,
205
+ (
206
+ _request: FormRequest,
207
+ _context: FormContext,
208
+ _h: FormResponseToolkit
209
+ ) => {
210
+ return Promise.resolve({} as unknown as ResponseObject)
211
+ }
212
+ )
213
+
214
+ const contextMock = { data: {}, model: {} } as unknown as FormContext
215
+
216
+ const requestMock = {
217
+ params: { path: 'some-path' },
218
+ app: { model: modelMock }
219
+ } as FormRequest
220
+
221
+ jest
222
+ .mocked(redirectOrMakeHandler)
223
+ .mockImplementation(
224
+ (_req: AnyFormRequest, _h: FormResponseToolkit, onRequest, fn) => {
225
+ expect(onRequest).toBe(onRequestCallback)
226
+ return Promise.resolve(fn(pageMock, contextMock))
227
+ }
228
+ )
229
+
230
+ await makeGetHandler(undefined, onRequestCallback)(requestMock, hMock)
231
+
232
+ expect(redirectOrMakeHandler).toHaveBeenCalledWith(
233
+ requestMock,
234
+ hMock,
235
+ onRequestCallback,
236
+ expect.any(Function)
237
+ )
238
+ })
182
239
  })
183
240
 
184
241
  describe('makePostHandler', () => {
185
242
  const hMock: FormResponseToolkit = {
186
243
  redirect: jest.fn(),
187
- view: jest.fn()
244
+ view: jest.fn(),
245
+ continue: Symbol('continue')
188
246
  }
189
247
 
190
248
  beforeEach(() => {
@@ -230,8 +288,9 @@ describe('makePostHandler', () => {
230
288
 
231
289
  jest
232
290
  .mocked(redirectOrMakeHandler)
233
- .mockImplementation((_req: AnyFormRequest, _h: FormResponseToolkit, fn) =>
234
- Promise.resolve(fn(pageMock, contextMock))
291
+ .mockImplementation(
292
+ (_req: AnyFormRequest, _h: FormResponseToolkit, _onRequest, fn) =>
293
+ Promise.resolve(fn(pageMock, contextMock))
235
294
  )
236
295
 
237
296
  const response = await makePostHandler()(requestMock, hMock)
@@ -269,8 +328,9 @@ describe('makePostHandler', () => {
269
328
 
270
329
  jest
271
330
  .mocked(redirectOrMakeHandler)
272
- .mockImplementation((_req: AnyFormRequest, _h: FormResponseToolkit, fn) =>
273
- Promise.resolve(fn(pageMock, contextMock))
331
+ .mockImplementation(
332
+ (_req: AnyFormRequest, _h: FormResponseToolkit, _onRequest, fn) =>
333
+ Promise.resolve(fn(pageMock, contextMock))
274
334
  )
275
335
 
276
336
  await makePostHandler()(requestMock, hMock)
@@ -310,8 +370,9 @@ describe('makePostHandler', () => {
310
370
 
311
371
  jest
312
372
  .mocked(redirectOrMakeHandler)
313
- .mockImplementation((_req: AnyFormRequest, _h: FormResponseToolkit, fn) =>
314
- Promise.resolve(fn(pageMock, contextMock))
373
+ .mockImplementation(
374
+ (_req: AnyFormRequest, _h: FormResponseToolkit, _onRequest, fn) =>
375
+ Promise.resolve(fn(pageMock, contextMock))
315
376
  )
316
377
 
317
378
  await makePostHandler()(requestMock, hMock)
@@ -349,7 +410,12 @@ describe('makePostHandler', () => {
349
410
  jest
350
411
  .mocked(redirectOrMakeHandler)
351
412
  .mockImplementation(
352
- async (_req: AnyFormRequest, _h: FormResponseToolkit, fn) => {
413
+ async (
414
+ _req: AnyFormRequest,
415
+ _h: FormResponseToolkit,
416
+ _onRequest,
417
+ fn
418
+ ) => {
353
419
  try {
354
420
  await fn(pageMock, contextMock)
355
421
  } catch (err) {
@@ -364,6 +430,51 @@ describe('makePostHandler', () => {
364
430
 
365
431
  expect(error).toEqual(Boom.notFound('No model found for /some-path'))
366
432
  })
433
+
434
+ it('should pass onRequest callback to redirectOrMakeHandler', async () => {
435
+ const onRequestCallback = jest.fn().mockResolvedValue(undefined)
436
+ const modelMock = {
437
+ basePath: 'some-base-path',
438
+ def: { name: 'Hello world' }
439
+ } as FormModel
440
+
441
+ const pageMock = createMockPageController(
442
+ modelMock,
443
+ (
444
+ _request: FormRequest,
445
+ _context: FormContext,
446
+ _h: FormResponseToolkit
447
+ ) => {
448
+ return Promise.resolve({} as unknown as ResponseObject)
449
+ }
450
+ )
451
+
452
+ const contextMock = { data: {}, model: {} } as unknown as FormContext
453
+
454
+ const requestMock = {
455
+ params: { path: 'some-path' },
456
+ app: { model: modelMock },
457
+ payload: { some: 'payload' }
458
+ } as unknown as FormRequestPayload
459
+
460
+ jest
461
+ .mocked(redirectOrMakeHandler)
462
+ .mockImplementation(
463
+ (_req: AnyFormRequest, _h: FormResponseToolkit, onRequest, fn) => {
464
+ expect(onRequest).toBe(onRequestCallback)
465
+ return Promise.resolve(fn(pageMock, contextMock))
466
+ }
467
+ )
468
+
469
+ await makePostHandler(undefined, onRequestCallback)(requestMock, hMock)
470
+
471
+ expect(redirectOrMakeHandler).toHaveBeenCalledWith(
472
+ requestMock,
473
+ hMock,
474
+ onRequestCallback,
475
+ expect.any(Function)
476
+ )
477
+ })
367
478
  })
368
479
 
369
480
  function createMockPageController(
@@ -26,6 +26,7 @@ import {
26
26
  import {
27
27
  type AnyFormRequest,
28
28
  type FormContext,
29
+ type OnRequestCallback,
29
30
  type PreparePageEventRequestOptions
30
31
  } from '~/src/server/plugins/engine/types.js'
31
32
  import {
@@ -74,7 +75,8 @@ async function handleHttpEvent(
74
75
  }
75
76
 
76
77
  export function makeGetHandler(
77
- preparePageEventRequestOptions?: PreparePageEventRequestOptions
78
+ preparePageEventRequestOptions?: PreparePageEventRequestOptions,
79
+ onRequest?: OnRequestCallback
78
80
  ) {
79
81
  return function getHandler(request: FormRequest, h: FormResponseToolkit) {
80
82
  const { params } = request
@@ -83,34 +85,40 @@ export function makeGetHandler(
83
85
  return dispatchHandler(request, h)
84
86
  }
85
87
 
86
- return redirectOrMakeHandler(request, h, async (page, context) => {
87
- // Check for a page onLoad HTTP event and if one exists,
88
- // call it and assign the response to the context data
89
- const { events } = page
90
- const { model } = request.app
88
+ return redirectOrMakeHandler(
89
+ request,
90
+ h,
91
+ onRequest,
92
+ async (page, context) => {
93
+ // Check for a page onLoad HTTP event and if one exists,
94
+ // call it and assign the response to the context data
95
+ const { events } = page
96
+ const { model } = request.app
91
97
 
92
- if (!model) {
93
- throw Boom.notFound(`No model found for /${params.path}`)
94
- }
98
+ if (!model) {
99
+ throw Boom.notFound(`No model found for /${params.path}`)
100
+ }
95
101
 
96
- if (events?.onLoad && events.onLoad.type === 'http') {
97
- await handleHttpEvent(
98
- request,
99
- page,
100
- context,
101
- events.onLoad,
102
- model,
103
- preparePageEventRequestOptions
104
- )
105
- }
102
+ if (events?.onLoad && events.onLoad.type === 'http') {
103
+ await handleHttpEvent(
104
+ request,
105
+ page,
106
+ context,
107
+ events.onLoad,
108
+ model,
109
+ preparePageEventRequestOptions
110
+ )
111
+ }
106
112
 
107
- return page.makeGetRouteHandler()(request, context, h)
108
- })
113
+ return page.makeGetRouteHandler()(request, context, h)
114
+ }
115
+ )
109
116
  }
110
117
  }
111
118
 
112
119
  export function makePostHandler(
113
- preparePageEventRequestOptions?: PreparePageEventRequestOptions
120
+ preparePageEventRequestOptions?: PreparePageEventRequestOptions,
121
+ onRequest?: OnRequestCallback
114
122
  ) {
115
123
  return function postHandler(
116
124
  request: FormRequestPayload,
@@ -118,40 +126,45 @@ export function makePostHandler(
118
126
  ) {
119
127
  const { query } = request
120
128
 
121
- return redirectOrMakeHandler(request, h, async (page, context) => {
122
- const { pageDef } = page
123
- const { isForceAccess } = context
124
- const { model } = request.app
125
- const { events } = page
129
+ return redirectOrMakeHandler(
130
+ request,
131
+ h,
132
+ onRequest,
133
+ async (page, context) => {
134
+ const { pageDef } = page
135
+ const { isForceAccess } = context
136
+ const { model } = request.app
137
+ const { events } = page
126
138
 
127
- // Redirect to GET for preview URL direct access
128
- if (isForceAccess && !hasFormComponents(pageDef)) {
129
- return proceed(request, h, redirectPath(page.href, query))
130
- }
139
+ // Redirect to GET for preview URL direct access
140
+ if (isForceAccess && !hasFormComponents(pageDef)) {
141
+ return proceed(request, h, redirectPath(page.href, query))
142
+ }
131
143
 
132
- if (!model) {
133
- throw Boom.notFound(`No model found for /${request.params.path}`)
134
- }
144
+ if (!model) {
145
+ throw Boom.notFound(`No model found for /${request.params.path}`)
146
+ }
135
147
 
136
- const response = await page.makePostRouteHandler()(request, context, h)
148
+ const response = await page.makePostRouteHandler()(request, context, h)
137
149
 
138
- if (
139
- events?.onSave &&
140
- events.onSave.type === 'http' &&
141
- isSuccessful(response)
142
- ) {
143
- await handleHttpEvent(
144
- request,
145
- page,
146
- context,
147
- events.onSave,
148
- model,
149
- preparePageEventRequestOptions
150
- )
151
- }
150
+ if (
151
+ events?.onSave &&
152
+ events.onSave.type === 'http' &&
153
+ isSuccessful(response)
154
+ ) {
155
+ await handleHttpEvent(
156
+ request,
157
+ page,
158
+ context,
159
+ events.onSave,
160
+ model,
161
+ preparePageEventRequestOptions
162
+ )
163
+ }
152
164
 
153
- return response
154
- })
165
+ return response
166
+ }
167
+ )
155
168
  }
156
169
  }
157
170
 
@@ -164,13 +177,14 @@ function isSuccessful(response: ResponseObject): boolean {
164
177
  export function getRoutes(
165
178
  getRouteOptions: RouteOptions<FormRequestRefs>,
166
179
  postRouteOptions: RouteOptions<FormRequestPayloadRefs>,
167
- preparePageEventRequestOptions?: PreparePageEventRequestOptions
180
+ preparePageEventRequestOptions?: PreparePageEventRequestOptions,
181
+ onRequest?: OnRequestCallback
168
182
  ): (ServerRoute<FormRequestRefs> | ServerRoute<FormRequestPayloadRefs>)[] {
169
183
  return [
170
184
  {
171
185
  method: 'get',
172
186
  path: '/{slug}',
173
- handler: makeGetHandler(preparePageEventRequestOptions),
187
+ handler: makeGetHandler(preparePageEventRequestOptions, onRequest),
174
188
  options: {
175
189
  ...getRouteOptions,
176
190
  validate: {
@@ -197,7 +211,7 @@ export function getRoutes(
197
211
  {
198
212
  method: 'get',
199
213
  path: '/{slug}/{path}/{itemId?}',
200
- handler: makeGetHandler(preparePageEventRequestOptions),
214
+ handler: makeGetHandler(preparePageEventRequestOptions, onRequest),
201
215
  options: {
202
216
  ...getRouteOptions,
203
217
  validate: {
@@ -212,7 +226,7 @@ export function getRoutes(
212
226
  {
213
227
  method: 'get',
214
228
  path: '/preview/{state}/{slug}/{path}/{itemId?}',
215
- handler: makeGetHandler(preparePageEventRequestOptions),
229
+ handler: makeGetHandler(preparePageEventRequestOptions, onRequest),
216
230
  options: {
217
231
  ...getRouteOptions,
218
232
  validate: {
@@ -228,7 +242,7 @@ export function getRoutes(
228
242
  {
229
243
  method: 'post',
230
244
  path: '/{slug}/{path}/{itemId?}',
231
- handler: makePostHandler(preparePageEventRequestOptions),
245
+ handler: makePostHandler(preparePageEventRequestOptions, onRequest),
232
246
  options: {
233
247
  ...postRouteOptions,
234
248
  validate: {
@@ -250,7 +264,7 @@ export function getRoutes(
250
264
  {
251
265
  method: 'post',
252
266
  path: '/preview/{state}/{slug}/{path}/{itemId?}',
253
- handler: makePostHandler(preparePageEventRequestOptions),
267
+ handler: makePostHandler(preparePageEventRequestOptions, onRequest),
254
268
  options: {
255
269
  ...postRouteOptions,
256
270
  validate: {
@@ -0,0 +1,83 @@
1
+ import { getRoutes } from '~/src/server/plugins/engine/routes/repeaters/item-delete.js'
2
+ import { type OnRequestCallback } from '~/src/server/plugins/engine/types.js'
3
+
4
+ describe('repeater item-delete routes', () => {
5
+ beforeEach(() => {
6
+ jest.clearAllMocks()
7
+ })
8
+
9
+ describe('route configuration', () => {
10
+ it('should return all expected routes', () => {
11
+ const routes = getRoutes({}, {}, undefined)
12
+
13
+ expect(routes).toHaveLength(4)
14
+
15
+ const expectedPaths = [
16
+ '/{slug}/{path}/{itemId}/confirm-delete',
17
+ '/preview/{state}/{slug}/{path}/{itemId}/confirm-delete'
18
+ ]
19
+
20
+ expectedPaths.forEach((path) => {
21
+ const getRoute = routes.find(
22
+ (route) => route.method === 'get' && route.path === path
23
+ )
24
+ const postRoute = routes.find(
25
+ (route) => route.method === 'post' && route.path === path
26
+ )
27
+
28
+ expect(getRoute).toBeDefined()
29
+ expect(postRoute).toBeDefined()
30
+ })
31
+ })
32
+
33
+ it('should pass onRequest callback to handlers', () => {
34
+ const onRequestCallback: OnRequestCallback = jest
35
+ .fn()
36
+ .mockResolvedValue(undefined)
37
+ const routes = getRoutes({}, {}, onRequestCallback)
38
+
39
+ // Test that the handlers are created with the onRequest callback
40
+ const getRoute = routes.find(
41
+ (route) =>
42
+ route.method === 'get' &&
43
+ route.path === '/{slug}/{path}/{itemId}/confirm-delete'
44
+ )
45
+ const postRoute = routes.find(
46
+ (route) =>
47
+ route.method === 'post' &&
48
+ route.path === '/{slug}/{path}/{itemId}/confirm-delete'
49
+ )
50
+
51
+ expect(getRoute?.handler).toBeDefined()
52
+ expect(postRoute?.handler).toBeDefined()
53
+ })
54
+ })
55
+
56
+ describe('handler functionality', () => {
57
+ it('should create handlers that accept onRequest callback', () => {
58
+ const onRequestCallback: OnRequestCallback = jest
59
+ .fn()
60
+ .mockResolvedValue(undefined)
61
+ const routes = getRoutes({}, {}, onRequestCallback)
62
+
63
+ // Test that the handlers are created with the onRequest callback
64
+ const getRoute = routes.find(
65
+ (route) =>
66
+ route.method === 'get' &&
67
+ route.path === '/{slug}/{path}/{itemId}/confirm-delete'
68
+ )
69
+ const postRoute = routes.find(
70
+ (route) =>
71
+ route.method === 'post' &&
72
+ route.path === '/{slug}/{path}/{itemId}/confirm-delete'
73
+ )
74
+
75
+ expect(getRoute?.handler).toBeDefined()
76
+ expect(postRoute?.handler).toBeDefined()
77
+
78
+ // Test that handlers are functions
79
+ expect(typeof getRoute?.handler).toBe('function')
80
+ expect(typeof postRoute?.handler).toBe('function')
81
+ })
82
+ })
83
+ })
@@ -6,6 +6,7 @@ import Joi from 'joi'
6
6
  import { FileUploadPageController } from '~/src/server/plugins/engine/pageControllers/FileUploadPageController.js'
7
7
  import { RepeatPageController } from '~/src/server/plugins/engine/pageControllers/RepeatPageController.js'
8
8
  import { redirectOrMakeHandler } from '~/src/server/plugins/engine/routes/index.js'
9
+ import { type OnRequestCallback } from '~/src/server/plugins/engine/types.js'
9
10
  import {
10
11
  type FormRequest,
11
12
  type FormRequestPayload,
@@ -23,52 +24,57 @@ import {
23
24
  } from '~/src/server/schemas/index.js'
24
25
 
25
26
  // Item delete GET route
26
- function getHandler(request: FormRequest, h: FormResponseToolkit) {
27
- const { params } = request
27
+ function getHandler(onRequest?: OnRequestCallback) {
28
+ return async function (request: FormRequest, h: FormResponseToolkit) {
29
+ const { params } = request
28
30
 
29
- return redirectOrMakeHandler(request, h, (page, context) => {
30
- if (
31
- !(
32
- page instanceof RepeatPageController ||
33
- page instanceof FileUploadPageController
34
- )
35
- ) {
36
- throw Boom.notFound(`No page found for /${params.path}`)
37
- }
31
+ return redirectOrMakeHandler(request, h, onRequest, (page, context) => {
32
+ if (
33
+ !(
34
+ page instanceof RepeatPageController ||
35
+ page instanceof FileUploadPageController
36
+ )
37
+ ) {
38
+ throw Boom.notFound(`No page found for /${params.path}`)
39
+ }
38
40
 
39
- return page.makeGetItemDeleteRouteHandler()(request, context, h)
40
- })
41
+ return page.makeGetItemDeleteRouteHandler()(request, context, h)
42
+ })
43
+ }
41
44
  }
42
45
 
43
- function postHandler(request: FormRequestPayload, h: FormResponseToolkit) {
44
- const { params } = request
46
+ function postHandler(onRequest?: OnRequestCallback) {
47
+ return async function (request: FormRequestPayload, h: FormResponseToolkit) {
48
+ const { params } = request
45
49
 
46
- return redirectOrMakeHandler(request, h, (page, context) => {
47
- const { isForceAccess } = context
50
+ return redirectOrMakeHandler(request, h, onRequest, (page, context) => {
51
+ const { isForceAccess } = context
48
52
 
49
- if (
50
- isForceAccess ||
51
- !(
52
- page instanceof RepeatPageController ||
53
- page instanceof FileUploadPageController
54
- )
55
- ) {
56
- throw Boom.notFound(`No page found for /${params.path}`)
57
- }
53
+ if (
54
+ isForceAccess ||
55
+ !(
56
+ page instanceof RepeatPageController ||
57
+ page instanceof FileUploadPageController
58
+ )
59
+ ) {
60
+ throw Boom.notFound(`No page found for /${params.path}`)
61
+ }
58
62
 
59
- return page.makePostItemDeleteRouteHandler()(request, context, h)
60
- })
63
+ return page.makePostItemDeleteRouteHandler()(request, context, h)
64
+ })
65
+ }
61
66
  }
62
67
 
63
68
  export function getRoutes(
64
69
  getRouteOptions: RouteOptions<FormRequestRefs>,
65
- postRouteOptions: RouteOptions<FormRequestPayloadRefs>
70
+ postRouteOptions: RouteOptions<FormRequestPayloadRefs>,
71
+ onRequest?: OnRequestCallback
66
72
  ): (ServerRoute<FormRequestRefs> | ServerRoute<FormRequestPayloadRefs>)[] {
67
73
  return [
68
74
  {
69
75
  method: 'get',
70
76
  path: '/{slug}/{path}/{itemId}/confirm-delete',
71
- handler: getHandler,
77
+ handler: getHandler(onRequest),
72
78
  options: {
73
79
  ...getRouteOptions,
74
80
  validate: {
@@ -84,7 +90,7 @@ export function getRoutes(
84
90
  {
85
91
  method: 'get',
86
92
  path: '/preview/{state}/{slug}/{path}/{itemId}/confirm-delete',
87
- handler: getHandler,
93
+ handler: getHandler(onRequest),
88
94
  options: {
89
95
  ...getRouteOptions,
90
96
  validate: {
@@ -101,7 +107,7 @@ export function getRoutes(
101
107
  {
102
108
  method: 'post',
103
109
  path: '/{slug}/{path}/{itemId}/confirm-delete',
104
- handler: postHandler,
110
+ handler: postHandler(onRequest),
105
111
  options: {
106
112
  ...postRouteOptions,
107
113
  validate: {
@@ -124,7 +130,7 @@ export function getRoutes(
124
130
  {
125
131
  method: 'post',
126
132
  path: '/preview/{state}/{slug}/{path}/{itemId}/confirm-delete',
127
- handler: postHandler,
133
+ handler: postHandler(onRequest),
128
134
  options: {
129
135
  ...postRouteOptions,
130
136
  validate: {