Skip to content

Commit 0dab7a0

Browse files
committed
CCM-17208: Use DL specific validator for Supplier API LetterEvent
1 parent 5b667d8 commit 0dab7a0

6 files changed

Lines changed: 66 additions & 41 deletions

File tree

lambdas/print-status-handler/src/__tests__/apis/sqs-handler.test.ts

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,16 @@ describe('SQS Handler', () => {
3737
expect(eventPublisher.sendEvents).toHaveBeenCalledWith(
3838
[
3939
{
40-
...acceptedLetterEvent,
4140
id: '550e8400-e29b-41d4-a716-446655440001',
4241
time: '2023-06-20T12:00:00.250Z',
4342
recordedtime: '2023-06-20T12:00:00.250Z',
4443
plane: 'data',
44+
specversion: '1.0',
45+
datacontenttype: 'application/json',
46+
traceparent:
47+
'00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01',
48+
severitynumber: 2,
49+
severitytext: 'INFO',
4550
dataschema:
4651
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-print-letter-transitioned-data.schema.json',
4752
type: 'uk.nhs.notify.digital.letters.print.letter.transitioned.v1',
@@ -78,10 +83,16 @@ describe('SQS Handler', () => {
7883
expect(eventPublisher.sendEvents).toHaveBeenCalledWith(
7984
[
8085
{
81-
...failedLetterEvent,
8286
id: '550e8400-e29b-41d4-a716-446655440001',
8387
time: '2023-06-20T12:00:00.250Z',
8488
recordedtime: '2023-06-20T12:00:00.250Z',
89+
plane: 'data',
90+
specversion: '1.0',
91+
datacontenttype: 'application/json',
92+
traceparent:
93+
'00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01',
94+
severitynumber: 2,
95+
severitytext: 'INFO',
8596
dataschema:
8697
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-print-letter-transitioned-data.schema.json',
8798
type: 'uk.nhs.notify.digital.letters.print.letter.transitioned.v1',
@@ -181,17 +192,20 @@ describe('SQS Handler', () => {
181192
it('should return failed items to the queue if an invalid letter.ACCEPTED event is received', async () => {
182193
const invalidAcceptedLetterEvent = {
183194
...acceptedLetterEvent,
184-
source: 'invalid letter.ACCEPTED source',
195+
data: {
196+
...acceptedLetterEvent.data,
197+
status: 'INVALID_STATUS',
198+
},
185199
};
186-
const event = recordEvent([invalidAcceptedLetterEvent]);
200+
const event = recordEvent([invalidAcceptedLetterEvent as any]);
187201

188202
const result = await handler(event);
189203

190204
expect(logger.warn).toHaveBeenCalledWith({
191205
err: expect.objectContaining({
192206
issues: expect.arrayContaining([
193207
expect.objectContaining({
194-
path: ['source'],
208+
path: ['data', 'status'],
195209
}),
196210
]),
197211
}),

lambdas/print-status-handler/src/apis/sqs-handler.ts

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,16 @@ import type {
55
} from 'aws-lambda';
66
import { randomUUID } from 'node:crypto';
77
import { z } from 'zod';
8-
import {
9-
$LetterEvent,
10-
LetterEvent,
11-
} from '@nhsdigital/nhs-notify-event-schemas-supplier-api/src/events/letter-events';
128
import {
139
PrintLetterTransitioned,
1410
validatePrintLetterTransitioned,
1511
} from 'digital-letters-events';
16-
import { EventPublisher, Logger } from 'utils';
12+
import {
13+
$SupplierApiLetterEvent,
14+
EventPublisher,
15+
Logger,
16+
SupplierApiLetterEvent,
17+
} from 'utils';
1718

1819
export interface HandlerDependencies {
1920
eventPublisher: EventPublisher;
@@ -22,7 +23,7 @@ export interface HandlerDependencies {
2223

2324
type ValidatedRecord = {
2425
messageId: string;
25-
event: LetterEvent;
26+
event: SupplierApiLetterEvent;
2627
};
2728

2829
const originSubjectSchema = z
@@ -44,7 +45,7 @@ function validateRecord(
4445
data: item,
4546
error: parseError,
4647
success: parseSuccess,
47-
} = $LetterEvent.safeParse(sqsEventDetail);
48+
} = $SupplierApiLetterEvent.safeParse(sqsEventDetail);
4849

4950
if (!parseSuccess) {
5051
logger.warn({
@@ -85,7 +86,9 @@ function validateRecord(
8586
}
8687
}
8788

88-
function generateUpdatedEvent(event: LetterEvent): PrintLetterTransitioned {
89+
function generateUpdatedEvent(
90+
event: SupplierApiLetterEvent,
91+
): PrintLetterTransitioned {
8992
const eventTime = new Date().toISOString();
9093

9194
const {
@@ -104,7 +107,6 @@ function generateUpdatedEvent(event: LetterEvent): PrintLetterTransitioned {
104107
const messageReference = subject.split('/')[3];
105108

106109
return {
107-
...event,
108110
id: randomUUID(),
109111
time: eventTime,
110112
recordedtime: eventTime,
@@ -116,6 +118,11 @@ function generateUpdatedEvent(event: LetterEvent): PrintLetterTransitioned {
116118
source: '/nhs/england/notify/production/primary/digitalletters/print',
117119
plane: 'data',
118120
dataschemaversion: '1.0.0',
121+
specversion: '1.0',
122+
datacontenttype: 'application/json',
123+
traceparent: '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01',
124+
severitynumber: 2,
125+
severitytext: 'INFO',
119126
data: {
120127
senderId,
121128
messageReference,

package-lock.json

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

scripts/tests/contract.sh

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,31 @@
22

33
set -euo pipefail
44

5-
schema_package="@nhsdigital/nhs-notify-event-schemas-status-published"
5+
schema_packages=(
6+
"@nhsdigital/nhs-notify-event-schemas-status-published"
7+
"@nhsdigital/nhs-notify-event-schemas-supplier-api"
8+
)
69

710
cd "$(git rev-parse --show-toplevel)"
811

9-
if npm outdated "$schema_package" >/dev/null 2>&1; then
10-
outdated_status=0
11-
else
12-
outdated_status=$?
13-
fi
12+
for schema_package in "${schema_packages[@]}"; do
13+
if npm outdated "$schema_package" >/dev/null 2>&1; then
14+
outdated_status=0
15+
else
16+
outdated_status=$?
17+
fi
1418

15-
if [[ $outdated_status -eq 1 ]]; then
16-
echo "The provider schema package ($schema_package) is outdated."
17-
echo "Please run npm update $schema_package to update to the latest version and re-run."
18-
echo
19-
exit 1
20-
fi
19+
if [[ $outdated_status -eq 1 ]]; then
20+
echo "The provider schema package ($schema_package) is outdated."
21+
echo "Please run npm update $schema_package to update to the latest version and re-run."
22+
echo
23+
exit 1
24+
fi
2125

22-
if [[ $outdated_status -gt 1 ]]; then
23-
echo "Failed to check provider schema package version (npm outdated exited with status $outdated_status)."
24-
exit $outdated_status
25-
fi
26+
if [[ $outdated_status -gt 1 ]]; then
27+
echo "Failed to check provider schema package version (npm outdated exited with status $outdated_status)."
28+
exit $outdated_status
29+
fi
30+
done
2631

2732
npm run test:contract

tests/pact-tests/consumer/supplier-api.consumer.pact.test.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11

2-
import LetterAccpectedEvent from '@nhsdigital/nhs-notify-event-schemas-supplier-api/schemas/examples/letter.ACCEPTED.json';
2+
import LetterAcceptedEvent from '@nhsdigital/nhs-notify-event-schemas-supplier-api/schemas/examples/letter.ACCEPTED.json';
33
import LetterReturnedEvent from '@nhsdigital/nhs-notify-event-schemas-supplier-api/schemas/examples/letter.RETURNED.json';
44
import LetterFailedEvent from '@nhsdigital/nhs-notify-event-schemas-supplier-api/schemas/examples/letter.FAILED.json';
55
import LetterDispatchedEvent from '@nhsdigital/nhs-notify-event-schemas-supplier-api/schemas/examples/letter.DISPATCHED.json';
@@ -43,14 +43,14 @@ describe('Pact message consumer - Supplier API events', () => {
4343
origin: {
4444
subject: MatchersV3.regex(
4545
/^client\/[^/]+\/letter-request\/[^/]+$/,
46-
LetterAccpectedEvent.data.origin.subject,
46+
LetterAcceptedEvent.data.origin.subject,
4747
),
4848
},
49-
specificationId: MatchersV3.string(LetterAccpectedEvent.data.specificationId),
50-
status: LetterAccpectedEvent.data.status,
51-
supplierId: MatchersV3.string(LetterAccpectedEvent.data.supplierId),
49+
specificationId: MatchersV3.string(LetterAcceptedEvent.data.specificationId),
50+
status: LetterAcceptedEvent.data.status,
51+
supplierId: MatchersV3.string(LetterAcceptedEvent.data.supplierId),
5252
},
53-
time: MatchersV3.timestamp("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", LetterAccpectedEvent.time),
53+
time: MatchersV3.timestamp("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", LetterAcceptedEvent.time),
5454
})
5555
.verify(asynchronousBodyHandler(handle)),
5656
).resolves.not.toThrow();

utils/utils/src/types/supplier-api-letter-event.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ export const $SupplierApiLetterEvent = z.object({
66
subject: z.string(),
77
}),
88
specificationId: z.string(),
9-
status: z.string(),
9+
status: z.enum(['RETURNED', 'DISPATCHED', 'PRINTED', 'REJECTED', 'ACCEPTED', 'FAILED']),
1010
supplierId: z.string(),
11+
reasonCode: z.string().optional(),
12+
reasonText: z.string().optional(),
1113
}),
1214
time: z.string(),
1315
});
1416

15-
export type SupplierApiLetterEvent = z.infer<
16-
typeof $SupplierApiLetterEvent
17-
>;
17+
export type SupplierApiLetterEvent = z.infer<typeof $SupplierApiLetterEvent>;

0 commit comments

Comments
 (0)