Skip to content

Commit d7fc63d

Browse files
Feature notifications setup submit check (#1755)
* Add Notification setup submit check service https://eaflood.atlassian.net/browse/WATER-4904 As part of the work to migrate the returns notifications from the legacy code. We need to have a service to send notification to notify. This change adds the initial service to orchestrate creating, sending and persisting notifications. The create event and event presenter have been implemented in earlier work and plumbed in this change. --------- Co-authored-by: Alan Cruikshanks <[email protected]>
1 parent d5e9015 commit d7fc63d

File tree

7 files changed

+142
-3
lines changed

7 files changed

+142
-3
lines changed

app/controllers/notifications-setup.controller.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ const RemoveLicencesService = require('../services/notifications/setup/remove-li
1414
const ReturnsPeriodService = require('../services/notifications/setup/returns-period.service.js')
1515
const SubmitAdHocLicenceService = require('../services/notifications/setup/submit-ad-hoc-licence.service.js')
1616
const SubmitCancelService = require('../services/notifications/setup/submit-cancel.service.js')
17+
const SubmitCheckService = require('../services/notifications/setup/submit-check.service.js')
1718
const SubmitRemoveLicencesService = require('../services/notifications/setup/submit-remove-licences.service.js')
1819
const SubmitReturnsPeriodService = require('../services/notifications/setup/submit-returns-period.service.js')
1920

@@ -97,6 +98,14 @@ async function submitCancel(request, h) {
9798
return h.redirect(`/manage`)
9899
}
99100

101+
async function submitCheck(request, h) {
102+
const { sessionId } = request.params
103+
104+
SubmitCheckService.go(sessionId)
105+
106+
return h.redirect(`/system/${basePath}/${sessionId}/confirmation`)
107+
}
108+
100109
async function submitLicence(request, h) {
101110
const { sessionId } = request.params
102111

@@ -148,6 +157,7 @@ module.exports = {
148157
viewReturnsPeriod,
149158
setup,
150159
submitCancel,
160+
submitCheck,
151161
submitLicence,
152162
submitRemoveLicences,
153163
submitReturnsPeriod

app/presenters/notifications/setup/check.presenter.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ const NOTIFICATION_TYPES = {
2020
* @param {object[]} recipients - List of recipient objects, each containing recipient details like email or name.
2121
* @param {number|string} page - The currently selected page
2222
* @param {object} pagination - The result from `PaginatorPresenter`
23-
* @param {string} session - The session instance
23+
* @param {object} session - The session instance
2424
*
2525
* @returns {object} - The data formatted for the view template
2626
*/

app/routes/notifications-setup.routes.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,18 @@ const routes = [
8989
}
9090
}
9191
},
92+
{
93+
method: 'POST',
94+
path: basePath + '/{sessionId}/check',
95+
options: {
96+
handler: NotificationsSetupController.submitCheck,
97+
auth: {
98+
access: {
99+
scope: ['returns']
100+
}
101+
}
102+
}
103+
},
92104
{
93105
method: 'GET',
94106
path: basePath + '/{sessionId}/returns-period',
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
'use strict'
2+
3+
/**
4+
* Orchestrates handling the data for `/notifications/setup/{sessionId}/check` page
5+
* @module SubmitCheckService
6+
*/
7+
8+
const SessionModel = require('../../../models/session.model.js')
9+
const RecipientsService = require('./fetch-recipients.service.js')
10+
const DetermineRecipientsService = require('./determine-recipients.service.js')
11+
const { currentTimeInNanoseconds, calculateAndLogTimeTaken } = require('../../../lib/general.lib.js')
12+
13+
/**
14+
* Orchestrates handling the data for `/notifications/setup/{sessionId}/check` page
15+
*
16+
* This service will transform the recipients into notifications and start processing notifications.
17+
*
18+
* @param {string} sessionId - The UUID for the notification setup session record
19+
*
20+
*/
21+
async function go(sessionId) {
22+
try {
23+
const startTime = currentTimeInNanoseconds()
24+
25+
const session = await SessionModel.query().findById(sessionId)
26+
27+
const recipientsData = await RecipientsService.go(session)
28+
29+
DetermineRecipientsService.go(recipientsData)
30+
31+
calculateAndLogTimeTaken(startTime, 'Send notifications complete', {})
32+
} catch (error) {
33+
global.GlobalNotifier.omfg('Send notifications failed', { sessionId }, error)
34+
}
35+
}
36+
37+
module.exports = {
38+
go
39+
}

test/controllers/notifications-setup.controller.test.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ const ReturnsPeriodService = require('../../app/services/notifications/setup/ret
1919
const CancelService = require('../../app/services/notifications/setup/cancel.service.js')
2020
const CheckService = require('../../app/services/notifications/setup/check.service.js')
2121
const SubmitCancelService = require('../../app/services/notifications/setup/submit-cancel.service.js')
22+
const SubmitCheckService = require('../../app/services/notifications/setup/submit-check.service.js')
2223
const SubmitLicenceService = require('../../app/services/notifications/setup/submit-ad-hoc-licence.service.js')
2324
const SubmitRemoveLicencesService = require('../../app/services/notifications/setup/submit-remove-licences.service.js')
2425
const SubmitReturnsPeriodService = require('../../app/services/notifications/setup/submit-returns-period.service.js')
@@ -143,6 +144,22 @@ describe('Notifications Setup controller', () => {
143144
})
144145
})
145146
})
147+
148+
describe('POST', () => {
149+
describe('when the request succeeds', () => {
150+
beforeEach(async () => {
151+
Sinon.stub(SubmitCheckService, 'go').returns()
152+
postOptions = postRequestOptions(basePath + `/${session.id}/check`, {})
153+
})
154+
155+
it('redirects the to the next page', async () => {
156+
const response = await server.inject(postOptions)
157+
158+
expect(response.statusCode).to.equal(302)
159+
expect(response.headers.location).to.equal(`/system/notifications/setup/${session.id}/confirmation`)
160+
})
161+
})
162+
})
146163
})
147164

148165
describe('notifications/setup/download', () => {

test/services/notifications/setup/check.service.test.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const Lab = require('@hapi/lab')
55
const Code = require('@hapi/code')
66
const Sinon = require('sinon')
77

8-
const { describe, it, before } = (exports.lab = Lab.script())
8+
const { describe, it, afterEach, before } = (exports.lab = Lab.script())
99
const { expect } = Code
1010

1111
// Test helpers
@@ -16,7 +16,7 @@ const SessionHelper = require('../../../support/helpers/session.helper.js')
1616
// Thing under test
1717
const CheckService = require('../../../../app/services/notifications/setup/check.service.js')
1818

19-
describe('Notifications Setup - Review service', () => {
19+
describe('Notifications Setup - Check service', () => {
2020
let removeLicences
2121
let session
2222
let testRecipients
@@ -33,6 +33,10 @@ describe('Notifications Setup - Review service', () => {
3333
Sinon.stub(RecipientsService, 'go').resolves([testRecipients.primaryUser])
3434
})
3535

36+
afterEach(() => {
37+
Sinon.restore()
38+
})
39+
3640
it('correctly presents the data', async () => {
3741
const result = await CheckService.go(session.id)
3842

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
'use strict'
2+
3+
// Test framework dependencies
4+
const Lab = require('@hapi/lab')
5+
const Code = require('@hapi/code')
6+
const Sinon = require('sinon')
7+
8+
const { describe, it, afterEach, before } = (exports.lab = Lab.script())
9+
const { expect } = Code
10+
11+
// Test helpers
12+
const RecipientsFixture = require('../../../fixtures/recipients.fixtures.js')
13+
const SessionHelper = require('../../../support/helpers/session.helper.js')
14+
15+
// Things we need to stub
16+
const DetermineRecipientsService = require('../../../../app/services/notifications/setup/determine-recipients.service.js')
17+
const RecipientsService = require('../../../../app/services/notifications/setup/fetch-recipients.service.js')
18+
19+
// Thing under test
20+
const SubmitCheckService = require('../../../../app/services/notifications/setup/submit-check.service.js')
21+
22+
describe('Notifications Setup - Submit Check service', () => {
23+
let notifierStub
24+
let recipients
25+
let session
26+
27+
before(async () => {
28+
notifierStub = { omg: Sinon.stub(), omfg: Sinon.stub() }
29+
global.GlobalNotifier = notifierStub
30+
31+
recipients = RecipientsFixture.recipients()
32+
33+
session = await SessionHelper.add({
34+
data: {
35+
journey: 'invitations',
36+
referenceCode: 'RINV-123',
37+
returnsPeriod: 'quarterFour'
38+
}
39+
})
40+
41+
recipients = RecipientsFixture.recipients()
42+
43+
Sinon.stub(DetermineRecipientsService, 'go').resolves()
44+
Sinon.stub(RecipientsService, 'go').resolves([recipients.primaryUser])
45+
})
46+
47+
afterEach(() => {
48+
Sinon.restore()
49+
delete global.GlobalNotifier
50+
})
51+
52+
it('correctly triggers the "DetermineRecipientsService"', async () => {
53+
await SubmitCheckService.go(session.id)
54+
55+
expect(DetermineRecipientsService.go.calledWith([recipients.primaryUser])).to.be.true()
56+
})
57+
})

0 commit comments

Comments
 (0)