@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.
- package/.server/server/common/helpers/redis-client.js +2 -3
- package/.server/server/common/helpers/redis-client.js.map +1 -1
- package/.server/server/plugins/engine/helpers.js +1 -2
- package/.server/server/plugins/engine/helpers.js.map +1 -1
- package/.server/server/plugins/engine/models/__snapshots__/SummaryViewModel.test.ts.snap +52 -0
- package/.server/server/plugins/engine/options.js +2 -1
- package/.server/server/plugins/engine/options.js.map +1 -1
- package/.server/server/plugins/engine/outputFormatters/adapter/v1.js +15 -5
- package/.server/server/plugins/engine/outputFormatters/adapter/v1.js.map +1 -1
- package/.server/server/plugins/engine/outputFormatters/machine/v2.d.ts +38 -1
- package/.server/server/plugins/engine/outputFormatters/machine/v2.js +1 -1
- package/.server/server/plugins/engine/outputFormatters/machine/v2.js.map +1 -1
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js +2 -2
- package/.server/server/plugins/engine/pageControllers/FileUploadPageController.js.map +1 -1
- package/.server/server/plugins/engine/routes/file-upload.js +2 -3
- package/.server/server/plugins/engine/routes/file-upload.js.map +1 -1
- package/.server/server/plugins/engine/services/notifyService.js +1 -2
- package/.server/server/plugins/engine/services/notifyService.js.map +1 -1
- package/.server/server/plugins/engine/types.d.ts +1 -1
- package/.server/server/plugins/engine/types.js.map +1 -1
- package/.server/server/plugins/errorPages.js +3 -3
- package/.server/server/plugins/errorPages.js.map +1 -1
- package/package.json +1 -1
- package/src/server/common/helpers/redis-client.js +5 -3
- package/src/server/plugins/engine/helpers.ts +2 -3
- package/src/server/plugins/engine/models/SummaryViewModel.test.ts +142 -112
- package/src/server/plugins/engine/models/__snapshots__/SummaryViewModel.test.ts.snap +52 -0
- package/src/server/plugins/engine/options.js +3 -1
- package/src/server/plugins/engine/outputFormatters/adapter/v1.test.ts +40 -0
- package/src/server/plugins/engine/outputFormatters/adapter/v1.ts +17 -14
- package/src/server/plugins/engine/outputFormatters/machine/v2.test.ts +41 -0
- package/src/server/plugins/engine/outputFormatters/machine/v2.ts +1 -1
- package/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +2 -2
- package/src/server/plugins/engine/routes/file-upload.ts +3 -4
- package/src/server/plugins/engine/services/notifyService.test.ts +1 -1
- package/src/server/plugins/engine/services/notifyService.ts +2 -3
- package/src/server/plugins/engine/types.ts +1 -1
- 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 {
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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 (
|
|
27
|
-
const errMsg = getErrorMessage(error)
|
|
26
|
+
} catch (err) {
|
|
28
27
|
request.logger.error(
|
|
29
|
-
|
|
30
|
-
`[uploadStatusFailed] Upload status check failed for uploadId: ${uploadId} - ${
|
|
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
|
-
|
|
85
|
-
`[emailSendFailed] Error sending notification email - templateId: ${templateId} - recipient: ${emailAddress} - ${
|
|
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
|
|
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
|
-
|
|
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(
|
|
33
|
+
return h.response(err).code(statusCode)
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
return h.continue
|