Skip to content

Commit 15bf8c6

Browse files
committed
CCM-12896: Update ttl-handle-expiry-lambda to use new types/validators
1 parent e02b34d commit 15bf8c6

File tree

6 files changed

+31
-37
lines changed

6 files changed

+31
-37
lines changed

lambdas/ttl-handle-expiry-lambda/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"@aws-sdk/client-sqs": "^3.914.0",
44
"@aws-sdk/util-dynamodb": "^3.928.0",
55
"aws-lambda": "^1.0.7",
6+
"digital-letters-events": "^0.0.1",
67
"utils": "^0.0.1"
78
},
89
"devDependencies": {

lambdas/ttl-handle-expiry-lambda/src/__tests__/apis/dynamodb-stream-handler.test.ts

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@ import { EventPublisher, Logger } from 'utils';
33
import { mock } from 'jest-mock-extended';
44
import { createHandler } from 'apis/dynamodb-stream-handler';
55
import { Dlq } from 'app/dlq';
6+
import { ItemDequeued } from 'digital-letters-events';
67

78
const logger = mock<Logger>();
8-
const eventPublisher = mock<EventPublisher>();
9+
const eventPublisher = mock<EventPublisher<ItemDequeued>>();
910
const dlq = mock<Dlq>();
1011
const futureTimestamp = Date.now() + 1_000_000;
1112

@@ -29,12 +30,10 @@ const mockEvent: DynamoDBStreamEvent = {
2930
dateOfExpiry: { S: 'dateOfExpiry' },
3031
event: {
3132
M: {
32-
profileversion: { S: '1.0.0' },
33-
profilepublished: { S: '2025-10' },
3433
id: { S: '550e8400-e29b-41d4-a716-446655440001' },
3534
specversion: { S: '1.0' },
3635
source: {
37-
S: '/nhs/england/notify/production/primary/data-plane/digital-letters',
36+
S: '/nhs/england/notify/production/primary/data-plane/digitalletters/mesh',
3837
},
3938
subject: {
4039
S: 'customer/920fca11-596a-4eca-9c47-99f624614658/recipient/769acdd4-6a47-496f-999f-76a6fd2c3959',
@@ -50,16 +49,12 @@ const mockEvent: DynamoDBStreamEvent = {
5049
},
5150
datacontenttype: { S: 'application/json' },
5251
dataschema: {
53-
S: 'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10/digital-letter-base-data.schema.json',
52+
S: 'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-mesh-inbox-message-downloaded-data.schema.json',
5453
},
55-
dataschemaversion: { S: '1.0' },
5654
severitytext: { S: 'INFO' },
5755
data: {
5856
M: {
5957
messageUri: { S: 'https://example.com/ttl/resource' },
60-
'digital-letter-id': {
61-
S: '123e4567-e89b-12d3-a456-426614174000',
62-
},
6358
messageReference: { S: 'ref1' },
6459
senderId: { S: 'sender1' },
6560
},
@@ -110,21 +105,16 @@ describe('createHandler', () => {
110105

111106
expect(eventPublisher.sendEvents).toHaveBeenCalledWith([
112107
expect.objectContaining({
113-
profileversion: '1.0.0',
114-
profilepublished: '2025-10',
115108
specversion: '1.0',
116109
source:
117-
'/nhs/england/notify/production/primary/data-plane/digital-letters',
110+
'/nhs/england/notify/production/primary/data-plane/digitalletters/mesh',
118111
subject:
119112
'customer/920fca11-596a-4eca-9c47-99f624614658/recipient/769acdd4-6a47-496f-999f-76a6fd2c3959',
120113
type: 'uk.nhs.notify.digital.letters.queue.item.dequeued.v1',
121114
datacontenttype: 'application/json',
122115
dataschema:
123-
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10/digital-letter-base-data.schema.json',
116+
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-queue-item-dequeued-data.schema.json',
124117
data: expect.objectContaining({
125-
'digital-letter-id': expect.stringMatching(
126-
/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,
127-
),
128118
messageReference: 'ref1',
129119
messageUri: 'https://example.com/ttl/resource',
130120
senderId: 'sender1',

lambdas/ttl-handle-expiry-lambda/src/__tests__/container.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { EventPublisher } from 'utils';
22
import { loadConfig } from 'infra/config';
33
import { createContainer } from 'container';
4+
import eventValidator from 'digital-letters-events/ItemDequeued.js';
45

56
jest.mock('utils', () => ({
67
EventPublisher: jest.fn(),
@@ -14,9 +15,7 @@ jest.mock('infra/config', () => ({
1415
}));
1516

1617
const mockLoadConfig = loadConfig as jest.MockedFunction<typeof loadConfig>;
17-
const mockEventPublisher = EventPublisher as jest.MockedClass<
18-
typeof EventPublisher
19-
>;
18+
const mockEventPublisher = jest.mocked(EventPublisher);
2019

2120
describe('createContainer', () => {
2221
beforeEach(() => {
@@ -49,6 +48,7 @@ describe('createContainer', () => {
4948
logger: expect.any(Object),
5049
sqsClient: expect.any(Object),
5150
eventBridgeClient: expect.any(Object),
51+
validateEvent: eventValidator,
5252
});
5353

5454
expect(container).toEqual({

lambdas/ttl-handle-expiry-lambda/src/apis/dynamodb-stream-handler.ts

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
1+
import { unmarshall } from '@aws-sdk/util-dynamodb';
2+
import { Dlq } from 'app/dlq';
13
import type {
24
DynamoDBBatchItemFailure,
35
DynamoDBRecord,
46
DynamoDBStreamEvent,
57
} from 'aws-lambda';
6-
import { unmarshall } from '@aws-sdk/util-dynamodb';
7-
import {
8-
$TtlDynamodbRecord,
9-
$TtlItemEvent,
10-
EventPublisher,
11-
Logger,
12-
} from 'utils';
8+
import type {
9+
ItemDequeued,
10+
MESHInboxMessageDownloaded,
11+
} from 'digital-letters-events';
12+
import eventValidator from 'digital-letters-events/MESHInboxMessageDownloaded.js';
1313
import { randomUUID } from 'node:crypto';
14-
import { Dlq } from 'app/dlq';
14+
import { $TtlDynamodbRecord, EventPublisher, Logger } from 'utils';
1515

1616
export type CreateHandlerDependencies = {
1717
dlq: Dlq;
18-
eventPublisher: EventPublisher;
18+
eventPublisher: EventPublisher<ItemDequeued>;
1919
logger: Logger;
2020
};
2121

@@ -63,15 +63,10 @@ export const createHandler = ({
6363
return;
6464
}
6565

66-
const {
67-
data: itemEvent,
68-
error: eventParseError,
69-
success: eventParseSuccess,
70-
} = $TtlItemEvent.safeParse(item.event);
71-
72-
if (!eventParseSuccess) {
66+
const isEventValid = eventValidator(item.event);
67+
if (!isEventValid) {
7368
logger.warn({
74-
err: eventParseError,
69+
err: eventValidator.errors,
7570
description: 'Error parsing ttl item event',
7671
});
7772

@@ -80,6 +75,8 @@ export const createHandler = ({
8075
return;
8176
}
8277

78+
const itemEvent: MESHInboxMessageDownloaded = item.event as any;
79+
8380
if (item.withdrawn) {
8481
logger.info({
8582
description: 'ItemDequeued event not sent as item withdrawn',
@@ -95,6 +92,8 @@ export const createHandler = ({
9592
time: new Date().toISOString(),
9693
recordedtime: new Date().toISOString(),
9794
type: 'uk.nhs.notify.digital.letters.queue.item.dequeued.v1',
95+
dataschema:
96+
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-queue-item-dequeued-data.schema.json',
9897
},
9998
]);
10099
}

lambdas/ttl-handle-expiry-lambda/src/container.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,20 @@ import { EventPublisher, eventBridgeClient, logger, sqsClient } from 'utils';
22
import { CreateHandlerDependencies } from 'apis/dynamodb-stream-handler';
33
import { loadConfig } from 'infra/config';
44
import { Dlq } from 'app/dlq';
5+
import { ItemDequeued } from 'digital-letters-events';
6+
import eventValidator from 'digital-letters-events/ItemDequeued.js';
57

68
export const createContainer = (): CreateHandlerDependencies => {
79
const { dlqUrl, eventPublisherDlqUrl, eventPublisherEventBusArn } =
810
loadConfig();
911

10-
const eventPublisher = new EventPublisher({
12+
const eventPublisher = new EventPublisher<ItemDequeued>({
1113
eventBusArn: eventPublisherEventBusArn,
1214
dlqUrl: eventPublisherDlqUrl,
1315
logger,
1416
sqsClient,
1517
eventBridgeClient,
18+
validateEvent: eventValidator,
1619
});
1720

1821
const dlq = new Dlq({

package-lock.json

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

0 commit comments

Comments
 (0)