Skip to content

Commit

Permalink
add session helper module
Browse files Browse the repository at this point in the history
  • Loading branch information
madebyzak committed Feb 6, 2025
1 parent fc16115 commit 75d6681
Show file tree
Hide file tree
Showing 6 changed files with 97 additions and 15 deletions.
6 changes: 3 additions & 3 deletions server/@types/express/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ export declare module 'express-session' {
}

interface ApplicationData {
type: ApplicationType
prisonerName: string
date: Date
type?: ApplicationType
prisonerName?: string
date?: Date
additionalData?: AdditionalApplicationData
}

Expand Down
7 changes: 2 additions & 5 deletions server/routes/applications/applicationTypeRoutes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Request, Response, Router } from 'express'
import { APPLICATION_TYPES } from '../../constants/applicationTypes'
import asyncMiddleware from '../../middleware/asyncMiddleware'
import AuditService, { Page } from '../../services/auditService'
import { updateSessionData } from '../../utils/session'

export default function applicationTypeRoutes({ auditService }: { auditService: AuditService }): Router {
const router = Router()
Expand Down Expand Up @@ -36,11 +37,7 @@ export default function applicationTypeRoutes({ auditService }: { auditService:
return
}

req.session.applicationData = {
type: selectedAppType,
prisonerName: '',
date: new Date(),
}
updateSessionData(req, { type: selectedAppType })

res.redirect(`/log/prisoner-details`)
}),
Expand Down
6 changes: 3 additions & 3 deletions server/routes/applications/prisonerDetailsRoutes.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Request, Response, Router } from 'express'
import asyncMiddleware from '../../middleware/asyncMiddleware'
import AuditService, { Page } from '../../services/auditService'
import { updateSessionData } from '../../utils/session'

export default function prisonerDetailsRoutes({ auditService }: { auditService: AuditService }): Router {
const router = Router()
Expand Down Expand Up @@ -32,11 +33,10 @@ export default function prisonerDetailsRoutes({ auditService }: { auditService:
return
}

req.session.applicationData = {
...req.session.applicationData,
updateSessionData(req, {
prisonerName: req.body.prisonerName,
date: req.body.date,
}
})

res.redirect(`/log/swap-vos-pin-credit-details`)
}),
Expand Down
8 changes: 4 additions & 4 deletions server/routes/applications/swapVosPinCreditDetailsRoutes.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { Request, Response, Router } from 'express'
import { APPLICATION_TYPES } from '../../constants/applicationTypes'
import asyncMiddleware from '../../middleware/asyncMiddleware'
import AuditService, { Page } from '../../services/auditService'
import { APPLICATION_TYPES } from '../../constants/applicationTypes'
import { updateSessionData } from '../../utils/session'

export default function swapVosPinCreditDetailsRoutes({ auditService }: { auditService: AuditService }): Router {
const router = Router()
Expand Down Expand Up @@ -30,13 +31,12 @@ export default function swapVosPinCreditDetailsRoutes({ auditService }: { auditS
router.post(
'/log/swap-vos-pin-credit-details',
asyncMiddleware(async (req: Request, res: Response) => {
req.session.applicationData = {
...req.session.applicationData,
updateSessionData(req, {
additionalData: {
...req.session.applicationData?.additionalData,
swapVOsToPinCreditDetails: req.body.swapVosPinCreditDetails,
},
}
})

res.redirect(`/log/swap-vos-pin-credit-details/confirm`)
}),
Expand Down
71 changes: 71 additions & 0 deletions server/utils/session.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import { Request } from 'express'
import { SessionData } from 'express-session'
import { updateSessionData } from './session'

describe(updateSessionData.name, () => {
let req: Request

beforeEach(() => {
req = {
session: {} as SessionData,
} as Request
})

it('should initialize applicationData if it does not exist', () => {
updateSessionData(req, { prisonerName: 'John Doe' })

expect(req.session.applicationData).toEqual({
prisonerName: 'John Doe',
})
})

it('should update an existing field without removing other fields', () => {
req.session.applicationData = {
type: { name: 'Swap VOs', value: 'swap-vos' },
prisonerName: 'Jane Doe',
}

updateSessionData(req, { prisonerName: 'John Doe' })

expect(req.session.applicationData).toEqual({
type: { name: 'Swap VOs', value: 'swap-vos' },
prisonerName: 'John Doe',
})
})

it('should add new fields while keeping existing ones', () => {
req.session.applicationData = {
type: { name: 'Swap VOs', value: 'swap-vos' },
}

updateSessionData(req, { prisonerName: 'John Doe', date: new Date('2024-02-05') })

expect(req.session.applicationData).toEqual({
type: { name: 'Swap VOs', value: 'swap-vos' },
prisonerName: 'John Doe',
date: new Date('2024-02-05'),
})
})

it('should not overwrite nested objects but merge updates', () => {
req.session.applicationData = {
type: { name: 'Swap VOs', value: 'swap-vos' },
additionalData: { swapVOsToPinCreditDetails: 'Old value' },
}

updateSessionData(req, {
additionalData: { swapVOsToPinCreditDetails: 'New value' },
})

expect(req.session.applicationData).toEqual({
type: { name: 'Swap VOs', value: 'swap-vos' },
additionalData: { swapVOsToPinCreditDetails: 'New value' },
})
})

it('should handle undefined session gracefully', () => {
req.session = undefined

expect(() => updateSessionData(req, { prisonerName: 'John Doe' })).toThrow()
})
})
14 changes: 14 additions & 0 deletions server/utils/session.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { Request } from 'express'
import { SessionData } from 'express-session'

// eslint-disable-next-line import/prefer-default-export
export const updateSessionData = (req: Request, updates: Partial<SessionData['applicationData']>) => {
if (!req.session.applicationData) {
req.session.applicationData = {} as SessionData['applicationData']
}

req.session.applicationData = {
...req.session.applicationData,
...updates,
}
}

0 comments on commit 75d6681

Please sign in to comment.