diff --git a/src/server/plugins/engine/beta/form-context.test.ts b/src/server/plugins/engine/beta/form-context.test.ts index bda790707..f2677c70e 100644 --- a/src/server/plugins/engine/beta/form-context.test.ts +++ b/src/server/plugins/engine/beta/form-context.test.ts @@ -183,7 +183,6 @@ describe('getFormModel helper', () => { definition, { basePath: slug, - versionNumber: 17, ordnanceSurveyApiKey: undefined, formId: metadata.id }, @@ -288,7 +287,6 @@ describe('resolveFormModel helper', () => { definition, expect.objectContaining({ basePath: 'forms/preview/live/tb-origin', - versionNumber: 9, ordnanceSurveyApiKey: 'os-api-key', formId: metadata.id }), diff --git a/src/server/plugins/engine/beta/form-context.ts b/src/server/plugins/engine/beta/form-context.ts index fa5d8836f..556f5aa99 100644 --- a/src/server/plugins/engine/beta/form-context.ts +++ b/src/server/plugins/engine/beta/form-context.ts @@ -5,8 +5,7 @@ import { isEqual } from 'date-fns' import { PREVIEW_PATH_PREFIX } from '~/src/server/constants.js' import { checkEmailAddressForLiveFormSubmission, - getCacheService, - getFormVersion + getCacheService } from '~/src/server/plugins/engine/helpers.js' import { FormModel } from '~/src/server/plugins/engine/models/index.js' import { type PageController } from '~/src/server/plugins/engine/pageControllers/PageController.js' @@ -65,15 +64,12 @@ export async function getFormModel( ) } - const versionNumber = getFormVersion(definition)?.versionNumber - return new FormModel( definition, { basePath: options.basePath ?? buildBasePath(options.routePrefix ?? '', slug, formState, isPreview), - versionNumber, ordnanceSurveyApiKey: options.ordnanceSurveyApiKey, formId: options.formId ?? metadata.id }, @@ -182,15 +178,12 @@ export async function resolveFormModel( const routePrefix = options.routePrefix ?? server.realm.modifiers.route.prefix - const versionNumber = getFormVersion(definition)?.versionNumber - const model = new FormModel( definition, { basePath: options.basePath ?? buildBasePath(routePrefix, slug, formState, isPreview), - versionNumber, ordnanceSurveyApiKey: options.ordnanceSurveyApiKey, formId: options.formId ?? metadata.id }, diff --git a/src/server/plugins/engine/models/FormModel.test.ts b/src/server/plugins/engine/models/FormModel.test.ts index c4899ad0d..4ae416e60 100644 --- a/src/server/plugins/engine/models/FormModel.test.ts +++ b/src/server/plugins/engine/models/FormModel.test.ts @@ -141,21 +141,6 @@ describe('FormModel', () => { expect(model.schemaVersion).toBe(SchemaVersion.V1) }) - it('sets versionNumber from options', () => { - const model = new FormModel(definition, { - basePath: 'test', - versionNumber: 42 - }) - - expect(model.versionNumber).toBe(42) - }) - - it('sets versionNumber to undefined when not provided', () => { - const model = new FormModel(definition, { basePath: 'test' }) - - expect(model.versionNumber).toBeUndefined() - }) - it.each([ { input: undefined, @@ -344,55 +329,6 @@ describe('FormModel', () => { ) }) - it('includes submittedVersionNumber in context when versionNumber is set', () => { - const formModel = new FormModel(fieldsRequiredDefinition, { - basePath: '/components', - versionNumber: 123 - }) - - const state = { - $$__referenceNumber: 'foobar' - } - const pageUrl = new URL('http://example.com/components/fields-required') - - const request: FormContextRequest = buildFormContextRequest({ - method: 'get', - query: {}, - path: pageUrl.pathname, - params: { path: 'components', slug: 'fields-required' }, - url: pageUrl, - app: { model: formModel } - }) - - const context = formModel.getFormContext(request, state) - - expect(context.submittedVersionNumber).toBe(123) - }) - - it('sets submittedVersionNumber to undefined when versionNumber is not set', () => { - const formModel = new FormModel(fieldsRequiredDefinition, { - basePath: '/components' - }) - - const state = { - $$__referenceNumber: 'foobar' - } - const pageUrl = new URL('http://example.com/components/fields-required') - - const request: FormContextRequest = buildFormContextRequest({ - method: 'get', - query: {}, - path: pageUrl.pathname, - params: { path: 'components', slug: 'fields-required' }, - url: pageUrl, - app: { model: formModel } - }) - - const context = formModel.getFormContext(request, state) - - expect(context.submittedVersionNumber).toBeUndefined() - }) - it('redirects to the page if the list field (radio) is invalidated due to list item conditions', () => { const formModel = new FormModel(conditionsListDefinition, { basePath: '/conditional-list-items' diff --git a/src/server/plugins/engine/models/FormModel.ts b/src/server/plugins/engine/models/FormModel.ts index 6050a33b4..87c2e6d57 100644 --- a/src/server/plugins/engine/models/FormModel.ts +++ b/src/server/plugins/engine/models/FormModel.ts @@ -78,7 +78,6 @@ export class FormModel { formId: string values: FormDefinition basePath: string - versionNumber?: number ordnanceSurveyApiKey?: string conditions: Partial> pages: PageControllerClass[] @@ -100,7 +99,6 @@ export class FormModel { def: typeof this.def, options: { basePath: string - versionNumber?: number ordnanceSurveyApiKey?: string formId?: string }, @@ -158,7 +156,6 @@ export class FormModel { this.formId = options.formId ?? '' this.values = result.value this.basePath = options.basePath - this.versionNumber = options.versionNumber this.ordnanceSurveyApiKey = options.ordnanceSurveyApiKey this.conditions = {} this.services = services @@ -362,8 +359,7 @@ export class FormModel { componentDefMap: this.componentDefMap, pageMap: this.pageMap, componentMap: this.componentMap, - referenceNumber: getReferenceNumber(state), - submittedVersionNumber: this.versionNumber + referenceNumber: getReferenceNumber(state) } // Validate current page diff --git a/src/server/plugins/engine/outputFormatters/adapter/v1.test.ts b/src/server/plugins/engine/outputFormatters/adapter/v1.test.ts index 11f0be182..b1ee81ab0 100644 --- a/src/server/plugins/engine/outputFormatters/adapter/v1.test.ts +++ b/src/server/plugins/engine/outputFormatters/adapter/v1.test.ts @@ -11,10 +11,7 @@ import { type DetailItemField, type DetailItemRepeat } from '~/src/server/plugins/engine/models/types.js' -import { - format, - getVersionMetadata -} from '~/src/server/plugins/engine/outputFormatters/adapter/v1.js' +import { format } from '~/src/server/plugins/engine/outputFormatters/adapter/v1.js' import { buildFormContextRequest } from '~/src/server/plugins/engine/pageControllers/__stubs__/request.js' import { FormAdapterSubmissionSchemaVersion } from '~/src/server/plugins/engine/types/index.js' import { @@ -764,7 +761,7 @@ describe('Adapter v1 formatter', () => { }) describe('version metadata handling', () => { - it('should prefer $$__formVersion from definition metadata over formMetadata.versions', () => { + it('should include versionMetadata from $$__formVersion in definition metadata', () => { const definitionWithFormVersion = { ...definition, metadata: { @@ -818,92 +815,7 @@ describe('Adapter v1 formatter', () => { }) }) - it('should include versionMetadata when context has submittedVersionNumber and formMetadata has versions', () => { - const formMetadata: Partial = { - id: 'form-123', - slug: 'test-form', - title: 'Test Form', - notificationEmail: 'test@example.com', - versions: [ - { - versionNumber: 1, - createdAt: new Date('2024-01-01T00:00:00.000Z') - }, - { - versionNumber: 2, - createdAt: new Date('2024-01-15T00:00:00.000Z') - } - ] - } - - const modelWithVersion = new FormModel(definition, { - basePath: 'test', - versionNumber: 2 - }) - - const contextWithVersion = modelWithVersion.getFormContext(request, state) - - const formStatus = { - isPreview: false, - state: FormStatus.Live - } - - const body = format( - contextWithVersion, - items, - modelWithVersion, - submitResponse, - formStatus, - formMetadata as FormMetadata - ) - const parsedBody = JSON.parse(body) as FormAdapterSubmissionMessagePayload - - expect(parsedBody.meta.versionMetadata).toEqual({ - versionNumber: 2, - createdAt: '2024-01-15T00:00:00.000Z' - }) - }) - - it('should use first version as fallback when submittedVersionNumber is undefined', () => { - const formMetadata: Partial = { - id: 'form-123', - slug: 'test-form', - title: 'Test Form', - notificationEmail: 'test@example.com', - versions: [ - { - versionNumber: 1, - createdAt: new Date('2024-01-01T00:00:00.000Z') - }, - { - versionNumber: 2, - createdAt: new Date('2024-01-15T00:00:00.000Z') - } - ] - } - - const formStatus = { - isPreview: false, - state: FormStatus.Live - } - - const body = format( - context, - items, - model, - submitResponse, - formStatus, - formMetadata as FormMetadata - ) - const parsedBody = JSON.parse(body) as FormAdapterSubmissionMessagePayload - - expect(parsedBody.meta.versionMetadata).toEqual({ - versionNumber: 1, - createdAt: '2024-01-01T00:00:00.000Z' - }) - }) - - it('should not include versionMetadata when submittedVersionNumber is undefined and no versions exist', () => { + it('should not include versionMetadata when no versions exist', () => { const formMetadata: Partial = { id: 'form-123', slug: 'test-form', @@ -929,7 +841,7 @@ describe('Adapter v1 formatter', () => { expect(parsedBody.meta.versionMetadata).toBeUndefined() }) - it('should not include versionMetadata when submittedVersionNumber is undefined and versions array is empty', () => { + it('should not include versionMetadata when versions array is empty', () => { const formMetadata: Partial = { id: 'form-123', slug: 'test-form', @@ -955,269 +867,5 @@ describe('Adapter v1 formatter', () => { expect(parsedBody.meta.versionMetadata).toBeUndefined() }) - - it('should not include versionMetadata when submittedVersionNumber does not match any version', () => { - const formMetadata: Partial = { - id: 'form-123', - slug: 'test-form', - title: 'Test Form', - notificationEmail: 'test@example.com', - versions: [ - { - versionNumber: 1, - createdAt: new Date('2024-01-01T00:00:00.000Z') - }, - { - versionNumber: 2, - createdAt: new Date('2024-01-15T00:00:00.000Z') - } - ] - } - - const modelWithVersion = new FormModel(definition, { - basePath: 'test', - versionNumber: 99 // Non-existent version - }) - - const contextWithVersion = modelWithVersion.getFormContext(request, state) - - const formStatus = { - isPreview: false, - state: FormStatus.Live - } - - const body = format( - contextWithVersion, - items, - modelWithVersion, - submitResponse, - formStatus, - formMetadata as FormMetadata - ) - const parsedBody = JSON.parse(body) as FormAdapterSubmissionMessagePayload - - // Should fall back to first version since submittedVersionNumber doesn't match - expect(parsedBody.meta.versionMetadata).toEqual({ - versionNumber: 1, - createdAt: '2024-01-01T00:00:00.000Z' - }) - }) - - it('should use first version as fallback when submittedVersionNumber does not match any version', () => { - const formMetadata: Partial = { - id: 'form-123', - slug: 'test-form', - title: 'Test Form', - notificationEmail: 'test@example.com', - versions: [ - { - versionNumber: 1, - createdAt: new Date('2024-01-01T00:00:00.000Z') - }, - { - versionNumber: 2, - createdAt: new Date('2024-01-15T00:00:00.000Z') - } - ] - } - - const modelWithVersion = new FormModel(definition, { - basePath: 'test', - versionNumber: 99 // Non-existent version - }) - - const contextWithVersion = modelWithVersion.getFormContext(request, state) - - const formStatus = { - isPreview: false, - state: FormStatus.Live - } - - const body = format( - contextWithVersion, - items, - modelWithVersion, - submitResponse, - formStatus, - formMetadata as FormMetadata - ) - const parsedBody = JSON.parse(body) as FormAdapterSubmissionMessagePayload - - // Should fall back to first version since submittedVersionNumber doesn't match - expect(parsedBody.meta.versionMetadata).toEqual({ - versionNumber: 1, - createdAt: '2024-01-01T00:00:00.000Z' - }) - }) - - it('should handle single version in versions array', () => { - const formMetadata: Partial = { - id: 'form-123', - slug: 'test-form', - title: 'Test Form', - notificationEmail: 'test@example.com', - versions: [ - { - versionNumber: 5, - createdAt: new Date('2024-02-01T00:00:00.000Z') - } - ] - } - - const formStatus = { - isPreview: false, - state: FormStatus.Live - } - - const body = format( - context, - items, - model, - submitResponse, - formStatus, - formMetadata as FormMetadata - ) - const parsedBody = JSON.parse(body) as FormAdapterSubmissionMessagePayload - - expect(parsedBody.meta.versionMetadata).toEqual({ - versionNumber: 5, - createdAt: '2024-02-01T00:00:00.000Z' - }) - }) - }) - - describe('getVersionMetadata', () => { - const mockFormMetadata: Partial = { - id: 'form-123', - slug: 'test-form', - title: 'Test Form', - notificationEmail: 'test@example.com', - versions: [ - { - versionNumber: 1, - createdAt: new Date('2024-01-01T00:00:00.000Z') - }, - { - versionNumber: 2, - createdAt: new Date('2024-01-02T00:00:00.000Z') - }, - { - versionNumber: 3, - createdAt: new Date('2024-01-03T00:00:00.000Z') - } - ] - } - - it('should return undefined when no form metadata provided', () => { - const result = getVersionMetadata(1, undefined) - expect(result).toBeUndefined() - }) - - it('should return undefined when form metadata has no versions', () => { - const formMetadataWithoutVersions: Partial = { - ...mockFormMetadata, - versions: undefined - } - - const result = getVersionMetadata( - 1, - formMetadataWithoutVersions as FormMetadata - ) - expect(result).toBeUndefined() - }) - - it('should return undefined when versions array is empty', () => { - const formMetadataWithEmptyVersions: Partial = { - ...mockFormMetadata, - versions: [] - } - - const result = getVersionMetadata( - 1, - formMetadataWithEmptyVersions as FormMetadata - ) - expect(result).toBeUndefined() - }) - - it('should return specific version when submittedVersionNumber matches', () => { - const result = getVersionMetadata(2, mockFormMetadata as FormMetadata) - expect(result).toEqual({ - versionNumber: 2, - createdAt: new Date('2024-01-02T00:00:00.000Z') - }) - }) - - it('should return first version when submittedVersionNumber not found', () => { - const result = getVersionMetadata(999, mockFormMetadata as FormMetadata) - expect(result).toEqual({ - versionNumber: 1, - createdAt: new Date('2024-01-01T00:00:00.000Z') - }) - }) - - it('should return first version when no submittedVersionNumber provided', () => { - const result = getVersionMetadata( - undefined, - mockFormMetadata as FormMetadata - ) - expect(result).toEqual({ - versionNumber: 1, - createdAt: new Date('2024-01-01T00:00:00.000Z') - }) - }) - - it('should handle single version in versions array', () => { - const singleVersionMetadata: Partial = { - ...mockFormMetadata, - versions: [ - { - versionNumber: 5, - createdAt: new Date('2024-02-01T00:00:00.000Z') - } - ] - } - - const result = getVersionMetadata( - undefined, - singleVersionMetadata as FormMetadata - ) - expect(result).toEqual({ - versionNumber: 5, - createdAt: new Date('2024-02-01T00:00:00.000Z') - }) - }) - - it('should return correct version when submittedVersionNumber is 0', () => { - const metadataWithVersionZero: Partial = { - ...mockFormMetadata, - versions: [ - { - versionNumber: 0, - createdAt: new Date('2024-01-01T00:00:00.000Z') - }, - { - versionNumber: 1, - createdAt: new Date('2024-01-02T00:00:00.000Z') - } - ] - } - - const result = getVersionMetadata( - 0, - metadataWithVersionZero as FormMetadata - ) - expect(result).toEqual({ - versionNumber: 0, - createdAt: new Date('2024-01-01T00:00:00.000Z') - }) - }) - - it('should handle negative submittedVersionNumber by falling back to first version', () => { - const result = getVersionMetadata(-1, mockFormMetadata as FormMetadata) - expect(result).toEqual({ - versionNumber: 1, - createdAt: new Date('2024-01-01T00:00:00.000Z') - }) - }) }) }) diff --git a/src/server/plugins/engine/outputFormatters/adapter/v1.ts b/src/server/plugins/engine/outputFormatters/adapter/v1.ts index f5728c320..eb9660b5c 100644 --- a/src/server/plugins/engine/outputFormatters/adapter/v1.ts +++ b/src/server/plugins/engine/outputFormatters/adapter/v1.ts @@ -31,9 +31,7 @@ export function format( const { main: v2Main, ...v2Data } = categoriseData(items) - const versionMetadata = - getFormVersion(model.def) ?? - getVersionMetadata(context.submittedVersionNumber, formMetadata) + const versionMetadata = getFormVersion(model.def) const meta: FormAdapterSubmissionMessageMeta = { schemaVersion: FormAdapterSubmissionSchemaVersion.V1, @@ -79,34 +77,6 @@ export function format( return JSON.stringify(payload) } -export function getVersionMetadata( - submittedVersionNumber: number | undefined, - formMetadata?: FormMetadata -): { versionNumber: number; createdAt: Date } | undefined { - if (!formMetadata?.versions?.length) { - return undefined - } - - if (submittedVersionNumber !== undefined) { - const submittedVersion = formMetadata.versions.find( - (v) => v.versionNumber === submittedVersionNumber - ) - if (submittedVersion) { - return { - versionNumber: submittedVersion.versionNumber, - createdAt: submittedVersion.createdAt - } - } - } - - // fallback to first available version - const firstVersion = formMetadata.versions[0] - return { - versionNumber: firstVersion.versionNumber, - createdAt: firstVersion.createdAt - } -} - function extractCsvFiles( submitResponse: SubmitResponsePayload ): FormAdapterSubmissionMessageResult['files'] { diff --git a/src/server/plugins/engine/types.ts b/src/server/plugins/engine/types.ts index 4eb4bd086..dffa6916e 100644 --- a/src/server/plugins/engine/types.ts +++ b/src/server/plugins/engine/types.ts @@ -194,7 +194,6 @@ export interface FormContext { pageMap: Map componentMap: Map referenceNumber: string - submittedVersionNumber?: number } export type FormContextRequest = (