Skip to content

Commit 2c856d1

Browse files
committed
CCM-13278: Add data.meshMessageId field to MESHInboxMessageDownloaded
1 parent f507c23 commit 2c856d1

14 files changed

Lines changed: 104 additions & 135 deletions

File tree

lambdas/pdm-uploader-lambda/src/__tests__/apis/sqs-trigger-lambda.test.ts

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type { SQSEvent } from 'aws-lambda';
33
import type { EventPublisher, Logger } from 'utils';
44
import { createHandler } from 'apis/sqs-trigger-lambda';
55
import type { UploadToPdm } from 'app/upload-to-pdm';
6+
import { mockEvent } from '__tests__/data';
67

78
jest.mock('node:crypto');
89

@@ -13,29 +14,7 @@ const createValidSQSEvent = (overrides?: Partial<SQSEvent>): SQSEvent => ({
1314
{
1415
messageId: 'msg-1',
1516
body: JSON.stringify({
16-
detail: {
17-
id: 'a449d419-e683-4ab4-9291-a0451b5cef8e',
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: '2025-01-01T00:00:00Z',
25-
recordedtime: '2025-01-01T00:00:00Z',
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-
messageReference: 'test-message-reference',
35-
senderId: 'test-sender-id',
36-
messageUri: 's3://bucket/key',
37-
},
38-
},
17+
detail: mockEvent,
3918
}),
4019
receiptHandle: 'receipt-1',
4120
attributes: {} as any,

lambdas/pdm-uploader-lambda/src/__tests__/app/upload-to-pdm.test.ts

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1+
import { mockEvent } from '__tests__/data';
12
import { UploadToPdm } from 'app/upload-to-pdm';
2-
import { MESHInboxMessageDownloaded } from 'digital-letters-events';
33
import { IPdmClient, Logger, getS3ObjectFromUri } from 'utils';
44

55
jest.mock('utils', () => ({
@@ -12,28 +12,6 @@ describe('UploadToPdm', () => {
1212
let mockLogger: jest.Mocked<Logger>;
1313
let uploadToPdm: UploadToPdm;
1414

15-
const mockEvent: MESHInboxMessageDownloaded = {
16-
id: 'test-event-id',
17-
specversion: '1.0',
18-
source: '/nhs/england/notify/production/primary/data-plane/digital-letters',
19-
subject:
20-
'customer/920fca11-596a-4eca-9c47-99f624614658/recipient/769acdd4-6a47-496f-999f-76a6fd2c3959',
21-
type: 'uk.nhs.notify.digital.letters.mesh.inbox.message.downloaded.v1',
22-
time: '2023-06-20T12:00:00Z',
23-
recordedtime: '2023-06-20T12:00:00.250Z',
24-
severitynumber: 2,
25-
traceparent: '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01',
26-
datacontenttype: 'application/json',
27-
dataschema:
28-
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-mesh-inbox-message-downloaded-data.schema.json',
29-
severitytext: 'INFO',
30-
data: {
31-
messageReference: 'test-message-reference',
32-
senderId: 'test-sender-id',
33-
messageUri: 's3://bucket/key',
34-
},
35-
};
36-
3715
const mockFhirRequest = { resourceType: 'Bundle' };
3816
const mockPdmResponse = {
3917
id: 'test-resource-id',
@@ -87,7 +65,7 @@ describe('UploadToPdm', () => {
8765
expect(getS3ObjectFromUri).toHaveBeenCalledWith('s3://bucket/key');
8866
expect(mockPdmClient.createDocumentReference).toHaveBeenCalledWith(
8967
mockFhirRequest,
90-
'test-message-reference',
68+
mockEvent.data.messageReference,
9169
);
9270
expect(result).toEqual({
9371
outcome: 'sent',
@@ -96,8 +74,8 @@ describe('UploadToPdm', () => {
9674
expect(mockLogger.info).toHaveBeenCalledWith(
9775
expect.objectContaining({
9876
description: 'Successfully sent request to PDM',
99-
eventId: 'test-event-id',
100-
messageReference: 'test-message-reference',
77+
eventId: mockEvent.id,
78+
messageReference: mockEvent.data.messageReference,
10179
resourceId: 'test-resource-id',
10280
}),
10381
);
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { MESHInboxMessageDownloaded } from 'digital-letters-events';
2+
3+
export const mockEvent: MESHInboxMessageDownloaded = {
4+
id: 'a449d419-e683-4ab4-9291-a0451b5cef8e',
5+
specversion: '1.0',
6+
source:
7+
'/nhs/england/notify/production/primary/data-plane/digitalletters/mesh',
8+
subject:
9+
'customer/920fca11-596a-4eca-9c47-99f624614658/recipient/769acdd4-6a47-496f-999f-76a6fd2c3959',
10+
type: 'uk.nhs.notify.digital.letters.mesh.inbox.message.downloaded.v1',
11+
time: '2023-06-20T12:00:00Z',
12+
recordedtime: '2023-06-20T12:00:00.250Z',
13+
severitynumber: 2,
14+
traceparent: '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01',
15+
datacontenttype: 'application/json',
16+
dataschema:
17+
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-mesh-inbox-message-downloaded-data.schema.json',
18+
severitytext: 'INFO',
19+
data: {
20+
meshMessageId: '12345',
21+
messageReference: 'test-message-reference',
22+
senderId: 'test-sender-id',
23+
messageUri: 's3://bucket/key',
24+
},
25+
};

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

Lines changed: 7 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1+
import { messageDownloadedEvent } from '__tests__/data';
12
import { createHandler } from 'apis/sqs-trigger-lambda';
23
import type { SQSEvent } from 'aws-lambda';
3-
import {
4-
ItemEnqueued,
5-
MESHInboxMessageDownloaded,
6-
} from 'digital-letters-events';
4+
import { ItemEnqueued } from 'digital-letters-events';
75
import itemEnqueuedValidator from 'digital-letters-events/ItemEnqueued.js';
86
import { randomUUID } from 'node:crypto';
97

@@ -22,29 +20,6 @@ describe('createHandler', () => {
2220
let logger: any;
2321
let handler: any;
2422

25-
const messageDownloadedEvent: MESHInboxMessageDownloaded = {
26-
id: '550e8400-e29b-41d4-a716-446655440001',
27-
specversion: '1.0',
28-
source:
29-
'/nhs/england/notify/production/primary/data-plane/digitalletters/mesh',
30-
subject:
31-
'customer/920fca11-596a-4eca-9c47-99f624614658/recipient/769acdd4-6a47-496f-999f-76a6fd2c3959',
32-
type: 'uk.nhs.notify.digital.letters.mesh.inbox.message.downloaded.v1',
33-
time: '2023-06-20T12:00:00Z',
34-
recordedtime: '2023-06-20T12:00:00.250Z',
35-
severitynumber: 2,
36-
traceparent: '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01',
37-
datacontenttype: 'application/json',
38-
dataschema:
39-
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-mesh-inbox-message-downloaded-data.schema.json',
40-
severitytext: 'INFO',
41-
data: {
42-
messageUri: 'https://example.com/ttl/resource',
43-
messageReference: 'ref1',
44-
senderId: 'sender1',
45-
},
46-
};
47-
4823
const eventBusEvent = {
4924
detail: messageDownloadedEvent,
5025
};
@@ -59,6 +34,11 @@ describe('createHandler', () => {
5934
recordedtime: '2023-06-20T12:00:00.250Z',
6035
dataschema:
6136
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-queue-item-enqueued-data.schema.json',
37+
data: {
38+
messageReference: messageDownloadedEvent.data.messageReference,
39+
senderId: messageDownloadedEvent.data.senderId,
40+
messageUri: messageDownloadedEvent.data.messageUri,
41+
},
6242
};
6343

6444
beforeEach(() => {

lambdas/ttl-create-lambda/src/__tests__/app/create-ttl.test.ts

Lines changed: 4 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,11 @@
1+
import { messageDownloadedEvent } from '__tests__/data';
12
import { CreateTtl } from 'app/create-ttl';
23
import { TtlRepository } from 'infra/ttl-repository';
3-
import { MESHInboxMessageDownloaded } from 'digital-letters-events';
44

55
describe('CreateTtl', () => {
66
let repo: jest.Mocked<TtlRepository>;
77
let logger: any;
88
let createTtl: CreateTtl;
9-
const item: MESHInboxMessageDownloaded = {
10-
id: '550e8400-e29b-41d4-a716-446655440001',
11-
specversion: '1.0',
12-
source: '/nhs/england/notify/production/primary/data-plane/digital-letters',
13-
subject:
14-
'customer/920fca11-596a-4eca-9c47-99f624614658/recipient/769acdd4-6a47-496f-999f-76a6fd2c3959',
15-
type: 'uk.nhs.notify.digital.letters.mesh.inbox.message.downloaded.v1',
16-
time: '2023-06-20T12:00:00Z',
17-
recordedtime: '2023-06-20T12:00:00.250Z',
18-
severitynumber: 2,
19-
traceparent: '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01',
20-
datacontenttype: 'application/json',
21-
dataschema:
22-
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-mesh-inbox-message-downloaded-data.schema.json',
23-
severitytext: 'INFO',
24-
data: {
25-
messageReference: 'ref1',
26-
senderId: 'sender1',
27-
messageUri: 'https://example.com/ttl/resource',
28-
},
29-
};
309

3110
beforeEach(() => {
3211
repo = { insertTtlRecord: jest.fn() } as any;
@@ -37,17 +16,17 @@ describe('CreateTtl', () => {
3716
it('returns sent when insert succeeds', async () => {
3817
repo.insertTtlRecord.mockResolvedValue();
3918

40-
const result = await createTtl.send(item);
19+
const result = await createTtl.send(messageDownloadedEvent);
4120

4221
expect(result).toBe('sent');
43-
expect(repo.insertTtlRecord).toHaveBeenCalledWith(item);
22+
expect(repo.insertTtlRecord).toHaveBeenCalledWith(messageDownloadedEvent);
4423
});
4524

4625
it('returns failed and logs error when insert throws', async () => {
4726
const error = new Error('fail');
4827
repo.insertTtlRecord.mockRejectedValue(error);
4928

50-
const result = await createTtl.send(item);
29+
const result = await createTtl.send(messageDownloadedEvent);
5130

5231
expect(result).toBe('failed');
5332
expect(logger.error).toHaveBeenCalledWith(
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { MESHInboxMessageDownloaded } from 'digital-letters-events';
2+
3+
export const messageDownloadedEvent: MESHInboxMessageDownloaded = {
4+
id: '550e8400-e29b-41d4-a716-446655440001',
5+
specversion: '1.0',
6+
source:
7+
'/nhs/england/notify/production/primary/data-plane/digitalletters/mesh',
8+
subject:
9+
'customer/920fca11-596a-4eca-9c47-99f624614658/recipient/769acdd4-6a47-496f-999f-76a6fd2c3959',
10+
type: 'uk.nhs.notify.digital.letters.mesh.inbox.message.downloaded.v1',
11+
time: '2023-06-20T12:00:00Z',
12+
recordedtime: '2023-06-20T12:00:00.250Z',
13+
severitynumber: 2,
14+
traceparent: '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01',
15+
datacontenttype: 'application/json',
16+
dataschema:
17+
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-mesh-inbox-message-downloaded-data.schema.json',
18+
severitytext: 'INFO',
19+
data: {
20+
meshMessageId: '12345',
21+
senderId: 'sender1',
22+
messageReference: 'ref1',
23+
messageUri: 'https://example.com/ttl/resource',
24+
},
25+
};

lambdas/ttl-create-lambda/src/__tests__/infra/ttl-repository.test.ts

Lines changed: 12 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { PutCommand } from '@aws-sdk/lib-dynamodb';
2+
import { messageDownloadedEvent } from '__tests__/data';
23
import { TtlRepository } from 'infra/ttl-repository';
3-
import { MESHInboxMessageDownloaded } from 'digital-letters-events';
44

55
jest.useFakeTimers();
66

@@ -16,27 +16,6 @@ describe('TtlRepository', () => {
1616
let senderRepository: any;
1717
let repo: TtlRepository;
1818
const tableName = 'table';
19-
const item: MESHInboxMessageDownloaded = {
20-
id: '550e8400-e29b-41d4-a716-446655440001',
21-
specversion: '1.0',
22-
source: '/nhs/england/notify/production/primary/data-plane/digital-letters',
23-
subject:
24-
'customer/920fca11-596a-4eca-9c47-99f624614658/recipient/769acdd4-6a47-496f-999f-76a6fd2c3959',
25-
type: 'uk.nhs.notify.digital.letters.mesh.inbox.message.downloaded.v1',
26-
time: '2023-06-20T12:00:00Z',
27-
recordedtime: '2023-06-20T12:00:00.250Z',
28-
severitynumber: 2,
29-
traceparent: '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01',
30-
datacontenttype: 'application/json',
31-
dataschema:
32-
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-mesh-inbox-message-downloaded-data.schema.json',
33-
severitytext: 'INFO',
34-
data: {
35-
messageReference: 'ref1',
36-
senderId: 'sender1',
37-
messageUri: 'https://example.com/ttl/resource',
38-
},
39-
};
4019

4120
beforeEach(() => {
4221
logger = { info: jest.fn(), error: jest.fn() };
@@ -68,7 +47,7 @@ describe('TtlRepository', () => {
6847
.split('T')[0];
6948
const expectedDateOfExpiry = `${expectedTtlDate}#${expectedShard}`;
7049

71-
await repo.insertTtlRecord(item);
50+
await repo.insertTtlRecord(messageDownloadedEvent);
7251

7352
expect(logger.info).toHaveBeenCalledWith(
7453
expect.objectContaining({
@@ -77,17 +56,17 @@ describe('TtlRepository', () => {
7756
);
7857

7958
expect(senderRepository.getSender).toHaveBeenCalledWith({
80-
senderId: item.data.senderId,
59+
senderId: messageDownloadedEvent.data.senderId,
8160
});
8261

8362
const putCommand: PutCommand = dynamoClient.send.mock.calls[0][0];
8463
expect(putCommand.input).toStrictEqual({
8564
TableName: tableName,
8665
Item: {
87-
PK: item.data.messageUri,
66+
PK: messageDownloadedEvent.data.messageUri,
8867
SK: 'TTL',
8968
dateOfExpiry: expectedDateOfExpiry,
90-
event: item,
69+
event: messageDownloadedEvent,
9170
ttl: expectedTtlSeconds,
9271
},
9372
});
@@ -97,7 +76,9 @@ describe('TtlRepository', () => {
9776
const error = new Error('fail');
9877
dynamoClient.send.mockRejectedValue(error);
9978

100-
await expect(repo.insertTtlRecord(item)).rejects.toThrow(error);
79+
await expect(repo.insertTtlRecord(messageDownloadedEvent)).rejects.toThrow(
80+
error,
81+
);
10182

10283
expect(logger.error).toHaveBeenCalledWith(
10384
expect.objectContaining({
@@ -114,20 +95,20 @@ describe('TtlRepository', () => {
11495
return Promise.resolve({});
11596
});
11697

117-
await repo.insertTtlRecord(item);
98+
await repo.insertTtlRecord(messageDownloadedEvent);
11899

119100
expect(gsiPk).toMatch(/^\d{4}-\d{2}-\d{2}#\d{1,2}$/);
120101
});
121102

122103
it('throws and logs error when sender not found', async () => {
123104
senderRepository.getSender.mockResolvedValue(null);
124105

125-
await expect(repo.insertTtlRecord(item)).rejects.toThrow(
126-
`Sender not found for sender ID ${item.data.senderId}`,
106+
await expect(repo.insertTtlRecord(messageDownloadedEvent)).rejects.toThrow(
107+
`Sender not found for sender ID ${messageDownloadedEvent.data.senderId}`,
127108
);
128109

129110
expect(logger.error).toHaveBeenCalledWith({
130-
description: `Sender not found for sender ID ${item.data.senderId}`,
111+
description: `Sender not found for sender ID ${messageDownloadedEvent.data.senderId}`,
131112
});
132113
});
133114
});

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,11 @@ export const createHandler = ({
107107
dataschema:
108108
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-queue-item-enqueued-data.schema.json',
109109
source: event.source.replace(/\/mesh$/, '/queue'),
110+
data: {
111+
messageReference: event.data.messageReference,
112+
senderId: event.data.senderId,
113+
messageUri: event.data.messageUri,
114+
},
110115
})),
111116
itemEnqueuedValidator,
112117
);

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ const mockEvent: DynamoDBStreamEvent = {
5454
severitytext: { S: 'INFO' },
5555
data: {
5656
M: {
57+
meshMessageId: { S: '12345' },
5758
messageUri: { S: 'https://example.com/ttl/resource' },
5859
messageReference: { S: 'ref1' },
5960
senderId: { S: 'sender1' },

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,11 @@ export const createHandler = ({
101101
dataschema:
102102
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-queue-item-dequeued-data.schema.json',
103103
source: itemEvent.source.replace(/\/mesh$/, '/queue'),
104+
data: {
105+
senderId: itemEvent.data.senderId,
106+
messageReference: itemEvent.data.messageReference,
107+
messageUri: itemEvent.data.messageUri,
108+
},
104109
},
105110
],
106111
itemDequeuedValidator,

0 commit comments

Comments
 (0)