Skip to content

Commit 8f5922b

Browse files
authored
Merge pull request #467 from DEFRA/feat/df-870-unlimited-save-and-exit
feat/df-870: Re-use of save-and-exit links
2 parents 61a598b + 657e98c commit 8f5922b

14 files changed

Lines changed: 231 additions & 259 deletions

package-lock.json

Lines changed: 4 additions & 239 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
"@aws-sdk/client-sqs": "^3.982.0",
4242
"@aws-sdk/s3-request-presigner": "^3.679.0",
4343
"@defra/forms-engine-plugin": "^4.0.57",
44-
"@defra/forms-model": "^3.0.627",
44+
"@defra/forms-model": "^3.0.635",
4545
"@defra/hapi-tracing": "^1.12.0",
4646
"@elastic/ecs-pino-format": "^1.5.0",
4747
"@hapi/boom": "^10.0.1",

src/helpers/error-helper.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { getErrorMessage } from '@defra/forms-model'
2+
import Boom from '@hapi/boom'
3+
4+
/**
5+
* Extract underlying Boom message for Boom errors, otherwise default to standard error object
6+
* @param {unknown} err
7+
* @returns {string}
8+
*/
9+
export function getBoomErrorMessage(err) {
10+
if (Boom.isBoom(err)) {
11+
const boomMessages =
12+
/** @type {{ error: string, message: string }[] | undefined } */ (
13+
err.data?.errors
14+
)
15+
const boomMessage = boomMessages
16+
? boomMessages.map((e) => `${e.error}: ${e.message}`).join(', ')
17+
: ''
18+
return `${getErrorMessage(err)} ${boomMessage}`.trim()
19+
}
20+
return getErrorMessage(err)
21+
}

src/helpers/error-helper.test.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import Boom from '@hapi/boom'
2+
3+
import { getBoomErrorMessage } from '~/src/helpers/error-helper.js'
4+
5+
describe('error-helper', () => {
6+
test('handles non-boom error', () => {
7+
const err = new Error('error message 1')
8+
expect(getBoomErrorMessage(err)).toBe('error message 1')
9+
})
10+
11+
test('handles boom error with no underlying message', () => {
12+
const err = Boom.badRequest('general error message')
13+
expect(getBoomErrorMessage(err)).toBe('general error message')
14+
})
15+
16+
test('handles boom error with one message', () => {
17+
const err = Boom.badRequest('general error message', {
18+
errors: [{ error: 'error type 2', message: 'error message 2' }]
19+
})
20+
expect(getBoomErrorMessage(err)).toBe(
21+
'general error message error type 2: error message 2'
22+
)
23+
})
24+
25+
test('handles boom error with multiple messages', () => {
26+
const err = Boom.badRequest('general error message', {
27+
errors: [
28+
{ error: 'error type 3', message: 'error message 3' },
29+
{ error: 'error type 4', message: 'error message 4' }
30+
]
31+
})
32+
expect(getBoomErrorMessage(err)).toBe(
33+
'general error message error type 3: error message 3, error type 4: error message 4'
34+
)
35+
})
36+
})

src/models/form.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ export const validateSavedLinkResponseSchema = Joi.object({
3131
state: Joi.object(),
3232
securityQuestion: Joi.string().required(),
3333
invalidPasswordAttempts: Joi.number().min(0).required(),
34-
validPassword: Joi.boolean().required()
34+
validPassword: Joi.boolean().required(),
35+
magicLinkGroupId: Joi.string().required()
3536
}).label('validateSavedLinkResponse')
3637

3738
export const generateFormSubmissionsFileResponseSchema = Joi.object({

src/mongo.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ export async function prepareDb(logger) {
5353
const saveColl = db.collection(SAVE_AND_EXIT_COLLECTION_NAME)
5454

5555
await saveColl.createIndex({ magicLinkId: 1 }, { unique: true })
56+
await saveColl.createIndex({ magicLinkGroupId: 1 })
5657
await saveColl.createIndex({ expireAt: 1 }, { expireAfterSeconds: 0 }) // enables TTL
5758
await saveColl.createIndex({
5859
'notify.expireEmailSentTimestamp': 1,

0 commit comments

Comments
 (0)