Skip to content

Commit 75d6681

Browse files
committed
add session helper module
1 parent fc16115 commit 75d6681

File tree

6 files changed

+97
-15
lines changed

6 files changed

+97
-15
lines changed

server/@types/express/index.d.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ export declare module 'express-session' {
88
}
99

1010
interface ApplicationData {
11-
type: ApplicationType
12-
prisonerName: string
13-
date: Date
11+
type?: ApplicationType
12+
prisonerName?: string
13+
date?: Date
1414
additionalData?: AdditionalApplicationData
1515
}
1616

server/routes/applications/applicationTypeRoutes.ts

+2-5
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Request, Response, Router } from 'express'
22
import { APPLICATION_TYPES } from '../../constants/applicationTypes'
33
import asyncMiddleware from '../../middleware/asyncMiddleware'
44
import AuditService, { Page } from '../../services/auditService'
5+
import { updateSessionData } from '../../utils/session'
56

67
export default function applicationTypeRoutes({ auditService }: { auditService: AuditService }): Router {
78
const router = Router()
@@ -36,11 +37,7 @@ export default function applicationTypeRoutes({ auditService }: { auditService:
3637
return
3738
}
3839

39-
req.session.applicationData = {
40-
type: selectedAppType,
41-
prisonerName: '',
42-
date: new Date(),
43-
}
40+
updateSessionData(req, { type: selectedAppType })
4441

4542
res.redirect(`/log/prisoner-details`)
4643
}),

server/routes/applications/prisonerDetailsRoutes.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Request, Response, Router } from 'express'
22
import asyncMiddleware from '../../middleware/asyncMiddleware'
33
import AuditService, { Page } from '../../services/auditService'
4+
import { updateSessionData } from '../../utils/session'
45

56
export default function prisonerDetailsRoutes({ auditService }: { auditService: AuditService }): Router {
67
const router = Router()
@@ -32,11 +33,10 @@ export default function prisonerDetailsRoutes({ auditService }: { auditService:
3233
return
3334
}
3435

35-
req.session.applicationData = {
36-
...req.session.applicationData,
36+
updateSessionData(req, {
3737
prisonerName: req.body.prisonerName,
3838
date: req.body.date,
39-
}
39+
})
4040

4141
res.redirect(`/log/swap-vos-pin-credit-details`)
4242
}),

server/routes/applications/swapVosPinCreditDetailsRoutes.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { Request, Response, Router } from 'express'
2+
import { APPLICATION_TYPES } from '../../constants/applicationTypes'
23
import asyncMiddleware from '../../middleware/asyncMiddleware'
34
import AuditService, { Page } from '../../services/auditService'
4-
import { APPLICATION_TYPES } from '../../constants/applicationTypes'
5+
import { updateSessionData } from '../../utils/session'
56

67
export default function swapVosPinCreditDetailsRoutes({ auditService }: { auditService: AuditService }): Router {
78
const router = Router()
@@ -30,13 +31,12 @@ export default function swapVosPinCreditDetailsRoutes({ auditService }: { auditS
3031
router.post(
3132
'/log/swap-vos-pin-credit-details',
3233
asyncMiddleware(async (req: Request, res: Response) => {
33-
req.session.applicationData = {
34-
...req.session.applicationData,
34+
updateSessionData(req, {
3535
additionalData: {
3636
...req.session.applicationData?.additionalData,
3737
swapVOsToPinCreditDetails: req.body.swapVosPinCreditDetails,
3838
},
39-
}
39+
})
4040

4141
res.redirect(`/log/swap-vos-pin-credit-details/confirm`)
4242
}),

server/utils/session.test.ts

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import { Request } from 'express'
2+
import { SessionData } from 'express-session'
3+
import { updateSessionData } from './session'
4+
5+
describe(updateSessionData.name, () => {
6+
let req: Request
7+
8+
beforeEach(() => {
9+
req = {
10+
session: {} as SessionData,
11+
} as Request
12+
})
13+
14+
it('should initialize applicationData if it does not exist', () => {
15+
updateSessionData(req, { prisonerName: 'John Doe' })
16+
17+
expect(req.session.applicationData).toEqual({
18+
prisonerName: 'John Doe',
19+
})
20+
})
21+
22+
it('should update an existing field without removing other fields', () => {
23+
req.session.applicationData = {
24+
type: { name: 'Swap VOs', value: 'swap-vos' },
25+
prisonerName: 'Jane Doe',
26+
}
27+
28+
updateSessionData(req, { prisonerName: 'John Doe' })
29+
30+
expect(req.session.applicationData).toEqual({
31+
type: { name: 'Swap VOs', value: 'swap-vos' },
32+
prisonerName: 'John Doe',
33+
})
34+
})
35+
36+
it('should add new fields while keeping existing ones', () => {
37+
req.session.applicationData = {
38+
type: { name: 'Swap VOs', value: 'swap-vos' },
39+
}
40+
41+
updateSessionData(req, { prisonerName: 'John Doe', date: new Date('2024-02-05') })
42+
43+
expect(req.session.applicationData).toEqual({
44+
type: { name: 'Swap VOs', value: 'swap-vos' },
45+
prisonerName: 'John Doe',
46+
date: new Date('2024-02-05'),
47+
})
48+
})
49+
50+
it('should not overwrite nested objects but merge updates', () => {
51+
req.session.applicationData = {
52+
type: { name: 'Swap VOs', value: 'swap-vos' },
53+
additionalData: { swapVOsToPinCreditDetails: 'Old value' },
54+
}
55+
56+
updateSessionData(req, {
57+
additionalData: { swapVOsToPinCreditDetails: 'New value' },
58+
})
59+
60+
expect(req.session.applicationData).toEqual({
61+
type: { name: 'Swap VOs', value: 'swap-vos' },
62+
additionalData: { swapVOsToPinCreditDetails: 'New value' },
63+
})
64+
})
65+
66+
it('should handle undefined session gracefully', () => {
67+
req.session = undefined
68+
69+
expect(() => updateSessionData(req, { prisonerName: 'John Doe' })).toThrow()
70+
})
71+
})

server/utils/session.ts

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { Request } from 'express'
2+
import { SessionData } from 'express-session'
3+
4+
// eslint-disable-next-line import/prefer-default-export
5+
export const updateSessionData = (req: Request, updates: Partial<SessionData['applicationData']>) => {
6+
if (!req.session.applicationData) {
7+
req.session.applicationData = {} as SessionData['applicationData']
8+
}
9+
10+
req.session.applicationData = {
11+
...req.session.applicationData,
12+
...updates,
13+
}
14+
}

0 commit comments

Comments
 (0)