Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/server/plugins/engine/options.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ const pluginRegistrationOptionsSchema = Joi.object({
saveAndExit: Joi.function().optional(),
ordnanceSurveyApiKey: Joi.string().optional(),
ordnanceSurveyApiSecret: Joi.string().optional(),
getLanguage: Joi.function().optional()
getLanguage: Joi.function().optional(),
generateReferenceNumber: Joi.function().optional()
})

/**
Expand Down
6 changes: 6 additions & 0 deletions src/server/plugins/engine/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {

import { type FormModel } from '~/src/server/plugins/engine/models/index.js'
import { validatePluginOptions } from '~/src/server/plugins/engine/options.js'
import { generateUniqueReference } from '~/src/server/plugins/engine/referenceNumbers.js'
import { getRoutes as getFileUploadStatusRoutes } from '~/src/server/plugins/engine/routes/file-upload.js'
import { makeLoadFormPreHandler } from '~/src/server/plugins/engine/routes/index.js'
import { getRoutes as getPaymentRoutes } from '~/src/server/plugins/engine/routes/payment.js'
Expand Down Expand Up @@ -37,6 +38,7 @@ export const plugin = {
cache,
saveAndExit,
getLanguage,
generateReferenceNumber,
nunjucks: nunjucksOptions,
viewContext,
preparePageEventRequestOptions,
Expand Down Expand Up @@ -80,6 +82,10 @@ export const plugin = {
server.expose('cacheService', cacheService)
server.expose('saveAndExit', saveAndExit)
server.expose('getLanguage', getLanguage)
server.expose(
'generateReferenceNumber',
generateReferenceNumber ?? generateUniqueReference
)
server.expose('baseUrl', baseUrl)
server.expose('services', services)

Expand Down
2 changes: 2 additions & 0 deletions src/server/plugins/engine/referenceNumbers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import {
englishRecommendedTransformers
} from 'obscenity'

export const DEFAULT_REFERENCE_NUMBER = 'XXX-XXX-XXX'

/**
* To prevent confusion to users reading the reference number, ambiguous letters and numbers are removed.
* @param strCodes - array of binary input values
Expand Down
12 changes: 9 additions & 3 deletions src/server/plugins/engine/routes/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import {
findPage,
getCacheService,
getPage,
getPluginOptions,
getStartPath,
proceed
} from '~/src/server/plugins/engine/helpers.js'
Expand All @@ -28,7 +29,7 @@ import {
checkSaveAndExitRepeater,
copyNotYetValidatedState
} from '~/src/server/plugins/engine/pageControllers/helpers/state.js'
import { generateUniqueReference } from '~/src/server/plugins/engine/referenceNumbers.js'
import { DEFAULT_REFERENCE_NUMBER } from '~/src/server/plugins/engine/referenceNumbers.js'
import * as defaultServices from '~/src/server/plugins/engine/services/index.js'
import {
type AnyFormRequest,
Expand All @@ -54,7 +55,7 @@ export async function redirectOrMakeHandler(
context: FormContext
) => ResponseObject | Promise<ResponseObject>
) {
const { app, params } = request
const { app, params, query } = request
const { model } = app

if (!model) {
Expand All @@ -74,7 +75,12 @@ export async function redirectOrMakeHandler(
)
}

const referenceNumber = generateUniqueReference(prefix)
const isForce = 'force' in query
const { generateReferenceNumber } = getPluginOptions(request.server)
const referenceNumber = isForce
? DEFAULT_REFERENCE_NUMBER
: await generateReferenceNumber(prefix)

state = await page.mergeState(request, state, {
$$__referenceNumber: referenceNumber
})
Expand Down
5 changes: 5 additions & 0 deletions src/server/plugins/engine/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -483,6 +483,10 @@ export type SaveAndExitHandler = (

export type GetLanguageHandler = (query?: RequestQuery, yar?: Yar) => string

export type GenerateReferenceNumberHandler = (
prefix?: string
) => Promise<string>

export interface ExternalArgs {
component: ComponentDef
controller: QuestionPageController
Expand Down Expand Up @@ -523,6 +527,7 @@ export interface PluginOptions {
preparePageEventRequestOptions?: PreparePageEventRequestOptions
onRequest?: OnRequestCallback
getLanguage?: GetLanguageHandler
generateReferenceNumber?: GenerateReferenceNumberHandler
baseUrl: string // base URL of the application, protocol and hostname e.g. "https://myapp.com"
ordnanceSurveyApiKey?: string
ordnanceSurveyApiSecret?: string
Expand Down
2 changes: 2 additions & 0 deletions src/typings/hapi/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { type FormModel } from '~/src/server/plugins/engine/models/index.js'
import {
type AnyFormRequest,
type FormSubmissionError,
type GenerateReferenceNumberHandler,
type PluginOptions
} from '~/src/server/plugins/engine/types.ts'
import { type CacheService } from '~/src/server/services/index.js'
Expand Down Expand Up @@ -41,6 +42,7 @@ declare module '@hapi/hapi' {
getLanguage?: PluginOptions['getLanguage']
baseUrl: string
services: PluginOptions['services']
generateReferenceNumber: GenerateReferenceNumberHandler
}
}

Expand Down
3 changes: 2 additions & 1 deletion test/form/postcode-lookup.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,8 @@ describe('Postcode lookup form pages', () => {
getFlash: jest.fn().mockReturnValue(undefined),
setFlash: jest.fn()
},
saveAndExit: undefined
saveAndExit: undefined,
generateReferenceNumber: jest.fn().mockReturnValue('XXX-XXX-XXX')
})
})

Expand Down
Loading