@defra/forms-engine-plugin 3.0.3 → 3.0.5

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 (38) hide show
  1. package/.server/server/common/helpers/redis-client.js +2 -3
  2. package/.server/server/common/helpers/redis-client.js.map +1 -1
  3. package/.server/server/plugins/engine/helpers.js +1 -2
  4. package/.server/server/plugins/engine/helpers.js.map +1 -1
  5. package/.server/server/plugins/engine/models/__snapshots__/SummaryViewModel.test.ts.snap +52 -0
  6. package/.server/server/plugins/engine/options.js +2 -1
  7. package/.server/server/plugins/engine/options.js.map +1 -1
  8. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +15 -5
  9. package/.server/server/plugins/engine/outputFormatters/adapter/v1.js.map +1 -1
  10. package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +38 -1
  11. package/.server/server/plugins/engine/outputFormatters/machine/v2.js +1 -1
  12. package/.server/server/plugins/engine/outputFormatters/machine/v2.js.map +1 -1
  13. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +2 -2
  14. package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
  15. package/.server/server/plugins/engine/routes/file-upload.js +2 -3
  16. package/.server/server/plugins/engine/routes/file-upload.js.map +1 -1
  17. package/.server/server/plugins/engine/services/notifyService.js +1 -2
  18. package/.server/server/plugins/engine/services/notifyService.js.map +1 -1
  19. package/.server/server/plugins/engine/types.d.ts +1 -1
  20. package/.server/server/plugins/engine/types.js.map +1 -1
  21. package/.server/server/plugins/errorPages.js +3 -3
  22. package/.server/server/plugins/errorPages.js.map +1 -1
  23. package/package.json +1 -1
  24. package/src/server/common/helpers/redis-client.js +5 -3
  25. package/src/server/plugins/engine/helpers.ts +2 -3
  26. package/src/server/plugins/engine/models/SummaryViewModel.test.ts +142 -112
  27. package/src/server/plugins/engine/models/__snapshots__/SummaryViewModel.test.ts.snap +52 -0
  28. package/src/server/plugins/engine/options.js +3 -1
  29. package/src/server/plugins/engine/outputFormatters/adapter/v1.test.ts +40 -0
  30. package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +17 -14
  31. package/src/server/plugins/engine/outputFormatters/machine/v2.test.ts +41 -0
  32. package/src/server/plugins/engine/outputFormatters/machine/v2.ts +1 -1
  33. package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +2 -2
  34. package/src/server/plugins/engine/routes/file-upload.ts +3 -4
  35. package/src/server/plugins/engine/services/notifyService.test.ts +1 -1
  36. package/src/server/plugins/engine/services/notifyService.ts +2 -3
  37. package/src/server/plugins/engine/types.ts +1 -1
  38. package/src/server/plugins/errorPages.ts +3 -3
@@ -6,7 +6,7 @@ import {
6
6
  import { type checkFormStatus } from '~/src/server/plugins/engine/helpers.js'
7
7
  import { type FormModel } from '~/src/server/plugins/engine/models/FormModel.js'
8
8
  import { type DetailItem } from '~/src/server/plugins/engine/models/types.js'
9
- import { format as machineV2 } from '~/src/server/plugins/engine/outputFormatters/machine/v2.js'
9
+ import { categoriseData } from '~/src/server/plugins/engine/outputFormatters/machine/v2.js'
10
10
  import { FormAdapterSubmissionSchemaVersion } from '~/src/server/plugins/engine/types/enums.js'
11
11
  import {
12
12
  type FormAdapterSubmissionMessageData,
@@ -25,20 +25,9 @@ export function format(
25
25
  formStatus: ReturnType<typeof checkFormStatus>,
26
26
  formMetadata?: FormMetadata
27
27
  ): string {
28
- const v2DataString = machineV2(
29
- context,
30
- items,
31
- model,
32
- submitResponse,
33
- formStatus
34
- )
35
- const v2DataParsed = JSON.parse(v2DataString) as {
36
- data: FormAdapterSubmissionMessageData
37
- }
38
-
39
28
  const csvFiles = extractCsvFiles(submitResponse)
40
29
 
41
- const transformedData = v2DataParsed.data
30
+ const { main: v2Main, ...v2Data } = categoriseData(items)
42
31
 
43
32
  const versionMetadata = getVersionMetadata(
44
33
  context.submittedVersionNumber,
@@ -60,7 +49,21 @@ export function format(
60
49
  if (versionMetadata) {
61
50
  meta.versionMetadata = versionMetadata
62
51
  }
63
- const data: FormAdapterSubmissionMessageData = transformedData
52
+
53
+ const main = Object.fromEntries(
54
+ Object.entries(v2Main).map(([key, value]) => {
55
+ if (value === undefined) {
56
+ return [key, null]
57
+ }
58
+
59
+ return [key, value]
60
+ })
61
+ )
62
+
63
+ const data: FormAdapterSubmissionMessageData = {
64
+ main,
65
+ ...v2Data
66
+ }
64
67
 
65
68
  const result: FormAdapterSubmissionMessageResult = {
66
69
  files: csvFiles
@@ -9,6 +9,10 @@ import {
9
9
  type DetailItemRepeat
10
10
  } from '~/src/server/plugins/engine/models/types.js'
11
11
  import { format } from '~/src/server/plugins/engine/outputFormatters/machine/v2.js'
12
+ import {
13
+ SummaryPageController,
14
+ getFormSubmissionData
15
+ } from '~/src/server/plugins/engine/pageControllers/SummaryPageController.js'
12
16
  import { buildFormContextRequest } from '~/src/server/plugins/engine/pageControllers/__stubs__/request.js'
13
17
  import {
14
18
  FileStatus,
@@ -267,4 +271,41 @@ describe('getPersonalisation', () => {
267
271
  expect(parsedBody.meta.referenceNumber).toBe('foobar')
268
272
  expect(parsedBody.data).toEqual(expectedData)
269
273
  })
274
+
275
+ it('should return the machine output 2', () => {
276
+ const pageDef = definition.pages[2]
277
+ const controller = new SummaryPageController(model, pageDef)
278
+
279
+ const summaryViewModel = controller.getSummaryViewModel(request, context)
280
+
281
+ const items = getFormSubmissionData(
282
+ summaryViewModel.context,
283
+ summaryViewModel.details
284
+ )
285
+
286
+ const body = format(context, items, model, submitResponse, formStatus)
287
+
288
+ const parsedBody = JSON.parse(body)
289
+
290
+ const expectedData = {
291
+ main: {
292
+ orderType: 'delivery'
293
+ },
294
+ repeaters: {
295
+ pizza: [
296
+ {
297
+ quantity: 2,
298
+ toppings: 'Ham'
299
+ },
300
+ {
301
+ quantity: 1,
302
+ toppings: 'Pepperoni'
303
+ }
304
+ ]
305
+ },
306
+ files: {}
307
+ }
308
+
309
+ expect(parsedBody.data).toEqual(expectedData)
310
+ })
270
311
  })
@@ -74,7 +74,7 @@ export function format(
74
74
  * }
75
75
  * }
76
76
  */
77
- function categoriseData(items: DetailItem[]) {
77
+ export function categoriseData(items: DetailItem[]) {
78
78
  const output: {
79
79
  main: Record<string, RichFormValue>
80
80
  repeaters: Record<string, Record<string, RichFormValue>[]>
@@ -326,11 +326,11 @@ export class FileUploadPageController extends QuestionPageController {
326
326
  // Depth 1: 2000ms, Depth 2: 4000ms, Depth 3: 8000ms, Depth 4: 16000ms, Depth 5+: 30000ms (capped)
327
327
  // A depth of 5 (or more) implies cumulative delays roughly reaching 55 seconds.
328
328
  if (depth >= 5) {
329
- const error = new Error(
329
+ const err = new Error(
330
330
  `Exceeded cumulative retry delay for ${uploadId} (depth: ${depth}). Re-initiating a new upload.`
331
331
  )
332
332
  request.logger.error(
333
- error,
333
+ err,
334
334
  `[uploadTimeout] Exceeded cumulative retry delay for uploadId: ${uploadId} at depth: ${depth} - re-initiating new upload`
335
335
  )
336
336
  await this.initiateAndStoreNewUpload(request, state)
@@ -23,11 +23,10 @@ export async function getHandler(
23
23
  }
24
24
 
25
25
  return h.response(status)
26
- } catch (error) {
27
- const errMsg = getErrorMessage(error)
26
+ } catch (err) {
28
27
  request.logger.error(
29
- errMsg,
30
- `[uploadStatusFailed] Upload status check failed for uploadId: ${uploadId} - ${errMsg}`
28
+ err,
29
+ `[uploadStatusFailed] Upload status check failed for uploadId: ${uploadId} - ${getErrorMessage(err)}`
31
30
  )
32
31
  return h.response({ error: 'Status check error' }).code(500)
33
32
  }
@@ -301,7 +301,7 @@ describe('notifyService', () => {
301
301
  ).rejects.toThrow('Notification service unavailable')
302
302
 
303
303
  expect(mockRequest.logger.error).toHaveBeenCalledWith(
304
- 'Notification service unavailable',
304
+ new Error('Notification service unavailable'),
305
305
  expect.stringContaining(
306
306
  '[emailSendFailed] Error sending notification email'
307
307
  )
@@ -79,10 +79,9 @@ export async function submit(
79
79
 
80
80
  request.logger.info(logTags, 'Email sent successfully')
81
81
  } catch (err) {
82
- const errMsg = getErrorMessage(err)
83
82
  request.logger.error(
84
- errMsg,
85
- `[emailSendFailed] Error sending notification email - templateId: ${templateId} - recipient: ${emailAddress} - ${errMsg}`
83
+ err,
84
+ `[emailSendFailed] Error sending notification email - templateId: ${templateId} - recipient: ${emailAddress} - ${getErrorMessage(err)}`
86
85
  )
87
86
 
88
87
  throw err
@@ -446,7 +446,7 @@ export type RichFormValue =
446
446
  | UkAddressState
447
447
 
448
448
  export interface FormAdapterSubmissionMessageData {
449
- main: Record<string, RichFormValue>
449
+ main: Record<string, RichFormValue | null>
450
450
  repeaters: Record<string, Record<string, RichFormValue>[]>
451
451
  files: Record<string, FormAdapterFile[]>
452
452
  }
@@ -19,18 +19,18 @@ export default {
19
19
  // processing the request
20
20
  const statusCode = response.output.statusCode
21
21
 
22
- const error = {
22
+ const err = {
23
23
  statusCode,
24
24
  message: response.message,
25
25
  stack: response.stack
26
26
  }
27
27
 
28
28
  request.logger.error(
29
- error,
29
+ err,
30
30
  `[httpError] HTTP ${statusCode} error occurred - ${response.message} - path: ${request.path} - method: ${request.method}`
31
31
  )
32
32
 
33
- return h.response(error).code(statusCode)
33
+ return h.response(err).code(statusCode)
34
34
  }
35
35
 
36
36
  return h.continue