Skip to content

Commit 0581262

Browse files
committed
CCM-12896: Make eventpublisher method generic instead of class
1 parent 3922440 commit 0581262

File tree

11 files changed

+151
-147
lines changed

11 files changed

+151
-147
lines changed

lambdas/ttl-create-lambda/src/__tests__/apis/sqs-trigger-lambda.test.ts

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
ItemEnqueued,
55
MESHInboxMessageDownloaded,
66
} from 'digital-letters-events';
7+
import itemEnqueuedValidator from 'digital-letters-events/ItemEnqueued.js';
78
import { randomUUID } from 'node:crypto';
89

910
jest.mock('node:crypto', () => ({
@@ -75,7 +76,10 @@ describe('createHandler', () => {
7576

7677
expect(res.batchItemFailures).toEqual([]);
7778
expect(createTtl.send).toHaveBeenCalledWith(messageDownloadedEvent);
78-
expect(eventPublisher.sendEvents).toHaveBeenCalledWith([itemEnqueuedEvent]);
79+
expect(eventPublisher.sendEvents).toHaveBeenCalledWith(
80+
[itemEnqueuedEvent],
81+
itemEnqueuedValidator,
82+
);
7983
expect(logger.info).toHaveBeenCalledWith({
8084
description: 'Processed SQS Event.',
8185
failed: 0,
@@ -185,11 +189,10 @@ describe('createHandler', () => {
185189

186190
expect(res.batchItemFailures).toEqual([]);
187191
expect(createTtl.send).toHaveBeenCalledTimes(3);
188-
expect(eventPublisher.sendEvents).toHaveBeenCalledWith([
189-
itemEnqueuedEvent,
190-
itemEnqueuedEvent,
191-
itemEnqueuedEvent,
192-
]);
192+
expect(eventPublisher.sendEvents).toHaveBeenCalledWith(
193+
[itemEnqueuedEvent, itemEnqueuedEvent, itemEnqueuedEvent],
194+
itemEnqueuedValidator,
195+
);
193196
expect(logger.info).toHaveBeenCalledWith({
194197
description: 'Processed SQS Event.',
195198
failed: 0,
@@ -213,10 +216,10 @@ describe('createHandler', () => {
213216
const res = await handler(event);
214217

215218
expect(res.batchItemFailures).toEqual([]);
216-
expect(eventPublisher.sendEvents).toHaveBeenCalledWith([
217-
itemEnqueuedEvent,
218-
itemEnqueuedEvent,
219-
]);
219+
expect(eventPublisher.sendEvents).toHaveBeenCalledWith(
220+
[itemEnqueuedEvent, itemEnqueuedEvent],
221+
itemEnqueuedValidator,
222+
);
220223
expect(logger.warn).toHaveBeenCalledWith({
221224
description: 'Some events failed to publish',
222225
failedCount: 1,
@@ -236,7 +239,10 @@ describe('createHandler', () => {
236239
const res = await handler(event);
237240

238241
expect(res.batchItemFailures).toEqual([]);
239-
expect(eventPublisher.sendEvents).toHaveBeenCalledWith([itemEnqueuedEvent]);
242+
expect(eventPublisher.sendEvents).toHaveBeenCalledWith(
243+
[itemEnqueuedEvent],
244+
itemEnqueuedValidator,
245+
);
240246
expect(logger.warn).toHaveBeenCalledWith({
241247
err: publishError,
242248
description: 'Failed to send events to EventBridge',
@@ -282,7 +288,10 @@ describe('createHandler', () => {
282288
{ itemIdentifier: 'msg2' },
283289
{ itemIdentifier: 'msg3' },
284290
]);
285-
expect(eventPublisher.sendEvents).toHaveBeenCalledWith([itemEnqueuedEvent]);
291+
expect(eventPublisher.sendEvents).toHaveBeenCalledWith(
292+
[itemEnqueuedEvent],
293+
itemEnqueuedValidator,
294+
);
286295
expect(logger.info).toHaveBeenCalledWith({
287296
description: 'Processed SQS Event.',
288297
failed: 2,

lambdas/ttl-create-lambda/src/apis/sqs-trigger-lambda.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ import type {
66
import { randomUUID } from 'node:crypto';
77
import type { CreateTtl, CreateTtlOutcome } from 'app/create-ttl';
88
import { EventPublisher, Logger } from 'utils';
9-
import eventValidator from 'digital-letters-events/MESHInboxMessageDownloaded.js';
9+
import itemEnqueuedValidator from 'digital-letters-events/ItemEnqueued.js';
10+
import messageDownloadedValidator from 'digital-letters-events/MESHInboxMessageDownloaded.js';
1011
import {
1112
ItemEnqueued,
1213
MESHInboxMessageDownloaded,
@@ -19,7 +20,7 @@ interface ProcessingResult {
1920

2021
interface CreateHandlerDependencies {
2122
createTtl: CreateTtl;
22-
eventPublisher: EventPublisher<ItemEnqueued>;
23+
eventPublisher: EventPublisher;
2324
logger: Logger;
2425
}
2526

@@ -37,10 +38,10 @@ export const createHandler = ({
3738
const sqsEventBody = JSON.parse(body);
3839
const sqsEventDetail = sqsEventBody.detail;
3940

40-
const isEventValid = eventValidator(sqsEventDetail);
41+
const isEventValid = messageDownloadedValidator(sqsEventDetail);
4142
if (!isEventValid) {
4243
logger.error({
43-
err: eventValidator.errors,
44+
err: messageDownloadedValidator.errors,
4445
description: 'Error parsing ttl queue entry',
4546
});
4647
batchItemFailures.push({ itemIdentifier: messageId });
@@ -96,7 +97,7 @@ export const createHandler = ({
9697

9798
if (successfulEvents.length > 0) {
9899
try {
99-
const failedEvents = await eventPublisher.sendEvents(
100+
const failedEvents = await eventPublisher.sendEvents<ItemEnqueued>(
100101
successfulEvents.map((event) => ({
101102
...event,
102103
id: randomUUID(),
@@ -106,6 +107,7 @@ export const createHandler = ({
106107
dataschema:
107108
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-queue-item-enqueued-data.schema.json',
108109
})),
110+
itemEnqueuedValidator,
109111
);
110112
if (failedEvents.length > 0) {
111113
logger.warn({

lambdas/ttl-create-lambda/src/container.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ import {
88
import { loadConfig } from 'infra/config';
99
import { TtlRepository } from 'infra/ttl-repository';
1010
import { CreateTtl } from 'app/create-ttl';
11-
import { ItemEnqueued } from 'digital-letters-events';
12-
import eventValidator from 'digital-letters-events/ItemEnqueued.js';
1311

1412
export const createContainer = () => {
1513
const {
@@ -30,13 +28,12 @@ export const createContainer = () => {
3028

3129
const createTtl = new CreateTtl(requestTtlRepository, logger);
3230

33-
const eventPublisher = new EventPublisher<ItemEnqueued>({
31+
const eventPublisher = new EventPublisher({
3432
eventBusArn: eventPublisherEventBusArn,
3533
dlqUrl: eventPublisherDlqUrl,
3634
logger,
3735
sqsClient,
3836
eventBridgeClient,
39-
validateEvent: eventValidator,
4037
});
4138

4239
return {

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

Lines changed: 34 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +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';
6+
import itemDequeuedValidator from 'digital-letters-events/ItemDequeued.js';
77

88
const logger = mock<Logger>();
9-
const eventPublisher = mock<EventPublisher<ItemDequeued>>();
9+
const eventPublisher = mock<EventPublisher>();
1010
const dlq = mock<Dlq>();
1111
const futureTimestamp = Date.now() + 1_000_000;
1212

@@ -103,24 +103,27 @@ describe('createHandler', () => {
103103

104104
expect(eventPublisher.sendEvents).toHaveBeenCalledTimes(1);
105105

106-
expect(eventPublisher.sendEvents).toHaveBeenCalledWith([
107-
expect.objectContaining({
108-
specversion: '1.0',
109-
source:
110-
'/nhs/england/notify/production/primary/data-plane/digitalletters/mesh',
111-
subject:
112-
'customer/920fca11-596a-4eca-9c47-99f624614658/recipient/769acdd4-6a47-496f-999f-76a6fd2c3959',
113-
type: 'uk.nhs.notify.digital.letters.queue.item.dequeued.v1',
114-
datacontenttype: 'application/json',
115-
dataschema:
116-
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-queue-item-dequeued-data.schema.json',
117-
data: expect.objectContaining({
118-
messageReference: 'ref1',
119-
messageUri: 'https://example.com/ttl/resource',
120-
senderId: 'sender1',
106+
expect(eventPublisher.sendEvents).toHaveBeenCalledWith(
107+
[
108+
expect.objectContaining({
109+
specversion: '1.0',
110+
source:
111+
'/nhs/england/notify/production/primary/data-plane/digitalletters/mesh',
112+
subject:
113+
'customer/920fca11-596a-4eca-9c47-99f624614658/recipient/769acdd4-6a47-496f-999f-76a6fd2c3959',
114+
type: 'uk.nhs.notify.digital.letters.queue.item.dequeued.v1',
115+
datacontenttype: 'application/json',
116+
dataschema:
117+
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-queue-item-dequeued-data.schema.json',
118+
data: expect.objectContaining({
119+
messageReference: 'ref1',
120+
messageUri: 'https://example.com/ttl/resource',
121+
senderId: 'sender1',
122+
}),
121123
}),
122-
}),
123-
]);
124+
],
125+
itemDequeuedValidator,
126+
);
124127

125128
expect(result).toEqual({});
126129
});
@@ -377,16 +380,19 @@ describe('createHandler', () => {
377380
const result = await handler(mockNotWithdrawnEvent);
378381

379382
expect(eventPublisher.sendEvents).toHaveBeenCalledTimes(1);
380-
expect(eventPublisher.sendEvents).toHaveBeenCalledWith([
381-
expect.objectContaining({
382-
type: 'uk.nhs.notify.digital.letters.queue.item.dequeued.v1',
383-
data: expect.objectContaining({
384-
messageReference: 'ref1',
385-
messageUri: 'https://example.com/ttl/resource',
386-
senderId: 'sender1',
383+
expect(eventPublisher.sendEvents).toHaveBeenCalledWith(
384+
[
385+
expect.objectContaining({
386+
type: 'uk.nhs.notify.digital.letters.queue.item.dequeued.v1',
387+
data: expect.objectContaining({
388+
messageReference: 'ref1',
389+
messageUri: 'https://example.com/ttl/resource',
390+
senderId: 'sender1',
391+
}),
387392
}),
388-
}),
389-
]);
393+
],
394+
itemDequeuedValidator,
395+
);
390396
expect(result).toEqual({});
391397
});
392398
});

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
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';
54

65
jest.mock('utils', () => ({
76
EventPublisher: jest.fn(),
@@ -48,7 +47,6 @@ describe('createContainer', () => {
4847
logger: expect.any(Object),
4948
sqsClient: expect.any(Object),
5049
eventBridgeClient: expect.any(Object),
51-
validateEvent: eventValidator,
5250
});
5351

5452
expect(container).toEqual({

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

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@ import type {
99
ItemDequeued,
1010
MESHInboxMessageDownloaded,
1111
} from 'digital-letters-events';
12-
import eventValidator from 'digital-letters-events/MESHInboxMessageDownloaded.js';
12+
import itemDequeuedValidator from 'digital-letters-events/ItemDequeued.js';
13+
import messageDownloadedValidator from 'digital-letters-events/MESHInboxMessageDownloaded.js';
1314
import { randomUUID } from 'node:crypto';
1415
import { $TtlDynamodbRecord, EventPublisher, Logger } from 'utils';
1516

1617
export type CreateHandlerDependencies = {
1718
dlq: Dlq;
18-
eventPublisher: EventPublisher<ItemDequeued>;
19+
eventPublisher: EventPublisher;
1920
logger: Logger;
2021
};
2122

@@ -63,10 +64,10 @@ export const createHandler = ({
6364
return;
6465
}
6566

66-
const isEventValid = eventValidator(item.event);
67+
const isEventValid = messageDownloadedValidator(item.event);
6768
if (!isEventValid) {
6869
logger.warn({
69-
err: eventValidator.errors,
70+
err: messageDownloadedValidator.errors,
7071
description: 'Error parsing ttl item event',
7172
});
7273

@@ -85,17 +86,20 @@ export const createHandler = ({
8586
senderId: itemEvent.data.senderId,
8687
});
8788
} else {
88-
await eventPublisher.sendEvents([
89-
{
90-
...itemEvent,
91-
id: randomUUID(),
92-
time: new Date().toISOString(),
93-
recordedtime: new Date().toISOString(),
94-
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',
97-
},
98-
]);
89+
await eventPublisher.sendEvents<ItemDequeued>(
90+
[
91+
{
92+
...itemEvent,
93+
id: randomUUID(),
94+
time: new Date().toISOString(),
95+
recordedtime: new Date().toISOString(),
96+
type: 'uk.nhs.notify.digital.letters.queue.item.dequeued.v1',
97+
dataschema:
98+
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-queue-item-dequeued-data.schema.json',
99+
},
100+
],
101+
itemDequeuedValidator,
102+
);
99103
}
100104
} catch (error) {
101105
logger.warn({

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,17 @@ 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';
75

86
export const createContainer = (): CreateHandlerDependencies => {
97
const { dlqUrl, eventPublisherDlqUrl, eventPublisherEventBusArn } =
108
loadConfig();
119

12-
const eventPublisher = new EventPublisher<ItemDequeued>({
10+
const eventPublisher = new EventPublisher({
1311
eventBusArn: eventPublisherEventBusArn,
1412
dlqUrl: eventPublisherDlqUrl,
1513
logger,
1614
sqsClient,
1715
eventBridgeClient,
18-
validateEvent: eventValidator,
1916
});
2017

2118
const dlq = new Dlq({

tests/playwright/digital-letters-component-tests/create-ttl.component.spec.ts

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import { expect, test } from '@playwright/test';
2+
import { MESHInboxMessageDownloaded } from 'digital-letters-events';
3+
import messageDownloadedValidator from 'digital-letters-events/MESHInboxMessageDownloaded.js';
24
import getTtl from 'helpers/dynamodb-helpers';
35
import eventPublisher from 'helpers/event-bus-helpers';
46
import expectToPassEventually from 'helpers/expectations';
@@ -9,30 +11,34 @@ test.describe('Digital Letters - Create TTL', () => {
911
const letterId = uuidv4();
1012
const messageUri = `https://example.com/ttl/resource/${letterId}`;
1113

12-
await eventPublisher.sendEvents([
13-
{
14-
id: letterId,
15-
specversion: '1.0',
16-
source:
17-
'/nhs/england/notify/production/primary/data-plane/digitalletters/mesh',
18-
subject:
19-
'customer/920fca11-596a-4eca-9c47-99f624614658/recipient/769acdd4-6a47-496f-999f-76a6fd2c3959',
20-
type: 'uk.nhs.notify.digital.letters.mesh.inbox.message.downloaded.v1',
21-
time: '2023-06-20T12:00:00Z',
22-
recordedtime: '2023-06-20T12:00:00.250Z',
23-
severitynumber: 2,
24-
traceparent: '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01',
25-
datacontenttype: 'application/json',
26-
dataschema:
27-
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-mesh-inbox-message-downloaded-data.schema.json',
28-
severitytext: 'INFO',
29-
data: {
30-
messageUri,
31-
messageReference: 'ref1',
32-
senderId: 'sender1',
14+
await eventPublisher.sendEvents<MESHInboxMessageDownloaded>(
15+
[
16+
{
17+
id: letterId,
18+
specversion: '1.0',
19+
source:
20+
'/nhs/england/notify/production/primary/data-plane/digitalletters/mesh',
21+
subject:
22+
'customer/920fca11-596a-4eca-9c47-99f624614658/recipient/769acdd4-6a47-496f-999f-76a6fd2c3959',
23+
type: 'uk.nhs.notify.digital.letters.mesh.inbox.message.downloaded.v1',
24+
time: '2023-06-20T12:00:00Z',
25+
recordedtime: '2023-06-20T12:00:00.250Z',
26+
severitynumber: 2,
27+
traceparent:
28+
'00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01',
29+
datacontenttype: 'application/json',
30+
dataschema:
31+
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-mesh-inbox-message-downloaded-data.schema.json',
32+
severitytext: 'INFO',
33+
data: {
34+
messageUri,
35+
messageReference: 'ref1',
36+
senderId: 'sender1',
37+
},
3338
},
34-
},
35-
]);
39+
],
40+
messageDownloadedValidator,
41+
);
3642

3743
await expectToPassEventually(async () => {
3844
const ttl = await getTtl(messageUri);

0 commit comments

Comments
 (0)