From 7e35e245aa858f667f0c17f11056fabd2d3b3826 Mon Sep 17 00:00:00 2001 From: Jez Barnsley Date: Thu, 18 Sep 2025 09:13:44 +0100 Subject: [PATCH] Adds form details to upload and submission payloads --- .../FileUploadPageController.ts | 21 +++++++++++++++++-- .../pageControllers/SummaryPageController.ts | 9 +++++++- .../plugins/engine/services/uploadService.js | 17 +++++++++++++-- test/form/govuk-notify.test.js | 7 ++++++- test/form/journey-basic.test.js | 7 ++++++- test/form/persist-files.test.js | 7 ++++++- test/form/repeat.test.js | 7 ++++++- 7 files changed, 66 insertions(+), 9 deletions(-) diff --git a/src/server/plugins/engine/pageControllers/FileUploadPageController.ts b/src/server/plugins/engine/pageControllers/FileUploadPageController.ts index 523cdfe50..37b7c6ec2 100644 --- a/src/server/plugins/engine/pageControllers/FileUploadPageController.ts +++ b/src/server/plugins/engine/pageControllers/FileUploadPageController.ts @@ -1,4 +1,8 @@ -import { ComponentType, type PageFileUpload } from '@defra/forms-model' +import { + ComponentType, + type FormMetadata, + type PageFileUpload +} from '@defra/forms-model' import Boom from '@hapi/boom' import { wait } from '@hapi/hoek' import { type ValidationErrorItem } from 'joi' @@ -423,6 +427,7 @@ export class FileUploadPageController extends QuestionPageController { ) { const { fileUpload, href, path } = this const { options, schema } = fileUpload + const params = request.params const files = this.getFilesFromState(state) @@ -436,7 +441,19 @@ export class FileUploadPageController extends QuestionPageController { const outputEmail = this.model.def.outputEmail ?? 'defraforms@defra.gov.uk' - const newUpload = await initiateUpload(href, outputEmail, options.accept) + const { formsService } = this.model.services + const { getFormMetadata } = formsService + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + const metadata = params?.slug + ? await getFormMetadata(params.slug) + : ({} as FormMetadata) + const newUpload = await initiateUpload( + href, + outputEmail, + metadata, + this.href, + options.accept + ) if (newUpload === undefined) { throw Boom.badRequest('Unexpected empty response from initiateUpload') diff --git a/src/server/plugins/engine/pageControllers/SummaryPageController.ts b/src/server/plugins/engine/pageControllers/SummaryPageController.ts index 14d4ecae4..efb61bc78 100644 --- a/src/server/plugins/engine/pageControllers/SummaryPageController.ts +++ b/src/server/plugins/engine/pageControllers/SummaryPageController.ts @@ -188,6 +188,7 @@ async function submitForm( // Submit data request.logger.info(logTags, 'Submitting data') const submitResponse = await submitData( + formMetadata, model, items, emailAddress, @@ -246,6 +247,7 @@ async function extendFileRetention( } function submitData( + form: FormMetadata, model: FormModel, items: DetailItem[], retrievalKey: string, @@ -282,7 +284,12 @@ function submitData( value: getAnswer(subItem.field, subItem.state, { format: 'data' }) })) ) - })) + })), + form: { + id: form.id, + name: form.title, + slug: form.slug + } } return submit(payload) diff --git a/src/server/plugins/engine/services/uploadService.js b/src/server/plugins/engine/services/uploadService.js index 44d63c124..9fa62c318 100644 --- a/src/server/plugins/engine/services/uploadService.js +++ b/src/server/plugins/engine/services/uploadService.js @@ -10,9 +10,17 @@ const stagingPrefix = config.get('stagingPrefix') * Initiates a CDP file upload * @param {string} path - the path of the page in the form * @param {string} retrievalKey - the retrieval key for the files + * @param {FormMetadata} formMetadata + * @param {string} pagePath - the path to the page * @param {string} [mimeTypesCsv] - the csv string of accepted mimeTypes */ -export async function initiateUpload(path, retrievalKey, mimeTypesCsv) { +export async function initiateUpload( + path, + retrievalKey, + formMetadata, + pagePath, + mimeTypesCsv +) { const postJsonByType = /** @type {typeof postJson} */ (postJson) @@ -29,7 +37,11 @@ export async function initiateUpload(path, retrievalKey, mimeTypesCsv) { s3Bucket: uploaderBucketName, s3Path: stagingPrefix, metadata: { - retrievalKey + retrievalKey, + formId: formMetadata.id, + formSlug: formMetadata.slug, + formName: formMetadata.title, + pagePath }, mimeTypes // maxFileSize: 25 * 1000 * 1000 @@ -60,5 +72,6 @@ export async function getUploadStatus(uploadId) { } /** + * @import { FormMetadata } from '@defra/forms-model' * @import { UploadInitiateResponse, UploadStatusResponse } from '~/src/server/plugins/engine/types.js' */ diff --git a/test/form/govuk-notify.test.js b/test/form/govuk-notify.test.js index 4faa98f55..0a8f66665 100644 --- a/test/form/govuk-notify.test.js +++ b/test/form/govuk-notify.test.js @@ -330,7 +330,12 @@ describe('Submission journey test', () => { ], repeaters: [], retrievalKey: 'enrique.chase@defra.gov.uk', - sessionId: expect.any(String) + sessionId: expect.any(String), + form: { + id: '661e4ca5039739ef2902b214', + name: 'Test form', + slug: 'test-form' + } }) // Status page diff --git a/test/form/journey-basic.test.js b/test/form/journey-basic.test.js index b1801ac3a..8d2ab5ec8 100644 --- a/test/form/journey-basic.test.js +++ b/test/form/journey-basic.test.js @@ -403,7 +403,12 @@ describe('Form journey', () => { ], repeaters: [], retrievalKey: 'enrique.chase@defra.gov.uk', - sessionId: expect.any(String) + sessionId: expect.any(String), + form: { + id: '661e4ca5039739ef2902b214', + name: 'Test form', + slug: 'test-form' + } }) expect(response.statusCode).toBe(StatusCodes.SEE_OTHER) diff --git a/test/form/persist-files.test.js b/test/form/persist-files.test.js index 134a84703..4815cbc9c 100644 --- a/test/form/persist-files.test.js +++ b/test/form/persist-files.test.js @@ -192,7 +192,12 @@ describe('Submission journey test', () => { ], repeaters: [], retrievalKey: 'enrique.chase@defra.gov.uk', - sessionId: expect.any(String) + sessionId: expect.any(String), + form: { + id: '661e4ca5039739ef2902b214', + name: 'Test form', + slug: 'test-form' + } }) expect(submitRes.statusCode).toBe(StatusCodes.SEE_OTHER) diff --git a/test/form/repeat.test.js b/test/form/repeat.test.js index 48f4b85b4..3f6d73af2 100644 --- a/test/form/repeat.test.js +++ b/test/form/repeat.test.js @@ -628,7 +628,12 @@ describe('Repeat POST tests', () => { } ], retrievalKey: 'enrique.chase@defra.gov.uk', - sessionId: expect.any(String) + sessionId: expect.any(String), + form: { + id: '661e4ca5039739ef2902b214', + name: 'Test form', + slug: 'test-form' + } }) })