Skip to content

Commit 504a803

Browse files
committed
CCM-13675: Event code generation improvements
1 parent d45e448 commit 504a803

26 files changed

Lines changed: 114 additions & 185 deletions

File tree

lambdas/core-notifier-lambda/src/__tests__/apis/sqs-handler.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ import { NotifyMessageProcessor } from 'app/notify-message-processor';
55
import { ISenderManagement } from 'sender-management';
66
import { SqsHandlerDependencies, createHandler } from 'apis/sqs-handler';
77
import { parseSqsRecord } from 'app/parse-sqs-message';
8-
import { InvalidPdmResourceAvailableEvent } from 'domain/invalid-pdm-resource-available-event';
98
import { RequestNotifyError } from 'domain/request-notify-error';
109
import { validPdmEvent, validSender } from '__tests__/constants';
1110
import {
11+
InvalidEvent,
1212
MessageRequestRejected,
1313
MessageRequestSkipped,
1414
MessageRequestSubmitted,
@@ -195,14 +195,14 @@ describe('createHandler', () => {
195195
});
196196
});
197197

198-
describe('when parseSqsRecord throws InvalidPdmResourceAvailableEvent', () => {
198+
describe('when parseSqsRecord throws InvalidEvent', () => {
199199
it('marks the message as failed for retry', async () => {
200200
const sqsEvent = createSqsEvent(1);
201201
const handler = createHandler(dependencies);
202202
const { messageId } = sqsEvent.Records[0];
203203

204204
mockParseSqsRecord.mockImplementationOnce(() => {
205-
throw new InvalidPdmResourceAvailableEvent(messageId);
205+
throw new InvalidEvent('Some validation errors');
206206
});
207207

208208
const result = await handler(sqsEvent);
@@ -211,7 +211,7 @@ describe('createHandler', () => {
211211
batchItemFailures: [{ itemIdentifier: messageId }],
212212
});
213213
expect(mockLogger.warn).toHaveBeenCalledWith({
214-
error: 'Unable to parse PDMResourceAvailable event from SQS message',
214+
error: 'Unable to parse event',
215215
description: 'Failed processing message',
216216
messageId,
217217
senderId: undefined,

lambdas/core-notifier-lambda/src/__tests__/app/parse-sqs-message.test.ts

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ import type { SQSRecord } from 'aws-lambda';
22
import { mock } from 'jest-mock-extended';
33
import { Logger } from 'utils';
44
import { parseSqsRecord } from 'app/parse-sqs-message';
5-
import { InvalidPdmResourceAvailableEvent } from 'domain/invalid-pdm-resource-available-event';
65
import { validPdmEvent } from '__tests__/constants';
6+
import { InvalidEvent } from 'digital-letters-events';
77

88
const mockLogger = mock<Logger>();
9+
const mockChildLogger = mock<Logger>();
910

1011
describe('parseSqsRecord', () => {
1112
const messageId = 'test-message-id-123';
@@ -27,6 +28,10 @@ describe('parseSqsRecord', () => {
2728
awsRegion: 'eu-west-2',
2829
});
2930

31+
beforeAll(() => {
32+
mockLogger.child.mockReturnValue(mockChildLogger);
33+
});
34+
3035
beforeEach(() => {
3136
jest.clearAllMocks();
3237
});
@@ -38,13 +43,12 @@ describe('parseSqsRecord', () => {
3843
const result = parseSqsRecord(sqsRecord, mockLogger);
3944

4045
expect(result).toEqual(validPdmEvent);
41-
expect(mockLogger.info).toHaveBeenCalledWith({
46+
expect(mockLogger.child).toHaveBeenCalledWith({ messageId });
47+
expect(mockChildLogger.info).toHaveBeenCalledWith({
4248
description: 'Parsing SQS Record',
43-
messageId,
4449
});
45-
expect(mockLogger.info).toHaveBeenCalledWith({
50+
expect(mockChildLogger.info).toHaveBeenCalledWith({
4651
description: 'Parsed valid PDMResourceAvailable Event',
47-
messageId,
4852
messageReference: validPdmEvent.data.messageReference,
4953
senderId: validPdmEvent.data.senderId,
5054
resourceId: validPdmEvent.data.resourceId,
@@ -53,20 +57,16 @@ describe('parseSqsRecord', () => {
5357
});
5458

5559
describe('when SQS record contains an invalid PDMResourceAvailable event', () => {
56-
it('logs error and throws InvalidPdmResourceAvailableEvent', () => {
60+
it('logs error and throws InvalidEvent', () => {
5761
const invalidEvent = { ...validPdmEvent, data: {} };
5862
const sqsRecord = createSqsRecord(invalidEvent);
5963

60-
expect(() => parseSqsRecord(sqsRecord, mockLogger)).toThrow(
61-
InvalidPdmResourceAvailableEvent,
62-
);
63-
64-
expect(mockLogger.error).toHaveBeenCalledWith(
64+
expect(() => parseSqsRecord(sqsRecord, mockLogger)).toThrow(InvalidEvent);
65+
expect(mockLogger.child).toHaveBeenCalledWith({ messageId });
66+
expect(mockChildLogger.error).toHaveBeenCalledWith(
6567
expect.objectContaining({
66-
description:
67-
'The SQS message does not contain a valid PDMResourceAvailable event',
68-
messageId,
69-
error: expect.any(Array),
68+
description: 'Error parsing PDMResourceAvailable event',
69+
err: expect.any(Array),
7070
}),
7171
);
7272
});
@@ -92,9 +92,8 @@ describe('parseSqsRecord', () => {
9292
};
9393

9494
expect(() => parseSqsRecord(sqsRecord, mockLogger)).toThrow(SyntaxError);
95-
expect(mockLogger.info).toHaveBeenCalledWith({
95+
expect(mockChildLogger.info).toHaveBeenCalledWith({
9696
description: 'Parsing SQS Record',
97-
messageId,
9897
});
9998
});
10099
});

lambdas/core-notifier-lambda/src/app/parse-sqs-message.ts

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,26 @@
11
import type { SQSRecord } from 'aws-lambda';
22
import { Logger } from 'utils';
3-
import { PDMResourceAvailable } from 'digital-letters-events';
4-
import { InvalidPdmResourceAvailableEvent } from 'domain/invalid-pdm-resource-available-event';
5-
import messagePDMResourceAvailableValidator from 'digital-letters-events/PDMResourceAvailable.js';
3+
import {
4+
PDMResourceAvailable,
5+
validatePDMResourceAvailable,
6+
} from 'digital-letters-events';
67

78
export const parseSqsRecord = (
89
sqsRecord: SQSRecord,
910
logger: Logger,
1011
): PDMResourceAvailable => {
11-
logger.info({
12+
const childLogger = logger.child({ messageId: sqsRecord.messageId });
13+
childLogger.info({
1214
description: 'Parsing SQS Record',
13-
messageId: sqsRecord.messageId,
1415
});
1516

1617
const sqsEventBody = JSON.parse(sqsRecord.body);
1718
const sqsEventDetail = sqsEventBody.detail;
1819

19-
if (!messagePDMResourceAvailableValidator(sqsEventDetail)) {
20-
logger.error({
21-
error: messagePDMResourceAvailableValidator.errors,
22-
description:
23-
'The SQS message does not contain a valid PDMResourceAvailable event',
24-
messageId: sqsRecord.messageId,
25-
});
26-
throw new InvalidPdmResourceAvailableEvent(sqsRecord.messageId);
27-
}
20+
validatePDMResourceAvailable(sqsEventDetail, childLogger);
2821

29-
logger.info({
22+
childLogger.info({
3023
description: 'Parsed valid PDMResourceAvailable Event',
31-
messageId: sqsRecord.messageId,
3224
messageReference: sqsEventDetail.data.messageReference,
3325
senderId: sqsEventDetail.data.senderId,
3426
resourceId: sqsEventDetail.data.resourceId,

lambdas/core-notifier-lambda/src/domain/invalid-pdm-resource-available-event.ts

Lines changed: 0 additions & 8 deletions
This file was deleted.

lambdas/file-scanner-lambda/src/__tests__/apis/sqs-handler.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ describe('SQS Handler', () => {
345345
);
346346
expect(mockLogger.warn).toHaveBeenCalledWith(
347347
expect.objectContaining({
348-
description: 'Error parsing queue entry',
348+
description: 'Error parsing SQS record',
349349
}),
350350
);
351351
});
@@ -405,7 +405,7 @@ describe('SQS Handler', () => {
405405
expect(mockFileScanner.scanFile).not.toHaveBeenCalled();
406406
expect(mockLogger.warn).toHaveBeenCalledWith(
407407
expect.objectContaining({
408-
description: 'Error parsing queue entry',
408+
description: 'Error parsing SQS record',
409409
}),
410410
);
411411
expect(mockLogger.warn).toHaveBeenCalledWith(

lambdas/file-scanner-lambda/src/apis/sqs-handler.ts

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ import type {
44
SQSBatchResponse,
55
SQSEvent,
66
} from 'aws-lambda';
7-
import { ItemDequeued } from 'digital-letters-events';
8-
import itemDequeuedValidator from 'digital-letters-events/ItemDequeued.js';
7+
import { ItemDequeued, validateItemDequeued } from 'digital-letters-events';
98
import { EventPublisher, Logger } from 'utils';
109

1110
export interface HandlerDependencies {
@@ -27,15 +26,7 @@ function validateRecord(
2726
const sqsEventBody = JSON.parse(body);
2827
const sqsEventDetail = sqsEventBody.detail;
2928

30-
const isEventValid = itemDequeuedValidator(sqsEventDetail);
31-
if (!isEventValid) {
32-
logger.warn({
33-
err: itemDequeuedValidator.errors,
34-
description: 'Error parsing queue entry',
35-
});
36-
37-
return null;
38-
}
29+
validateItemDequeued(sqsEventDetail, logger);
3930

4031
return { messageId, event: sqsEventDetail };
4132
} catch (error) {

lambdas/pdm-poll-lambda/src/__tests__/apis/sqs-handler.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -295,13 +295,13 @@ describe('SQS Handler', () => {
295295

296296
const result = await handler(event);
297297

298-
expect(logger.warn).toHaveBeenCalledWith({
298+
expect(logger.error).toHaveBeenCalledWith({
299299
err: expect.arrayContaining([
300300
expect.objectContaining({
301301
instancePath: '/source',
302302
}),
303303
]),
304-
description: 'Error parsing queue entry',
304+
description: 'Error parsing PDMResourceSubmitted event',
305305
});
306306

307307
expect(logger.info).toHaveBeenCalledWith(
@@ -322,13 +322,13 @@ describe('SQS Handler', () => {
322322

323323
const result = await handler(event);
324324

325-
expect(logger.warn).toHaveBeenCalledWith({
325+
expect(logger.error).toHaveBeenCalledWith({
326326
err: expect.arrayContaining([
327327
expect.objectContaining({
328328
instancePath: '/source',
329329
}),
330330
]),
331-
description: 'Error parsing queue entry',
331+
description: 'Error parsing PDMResourceUnavailable event',
332332
});
333333

334334
expect(logger.info).toHaveBeenCalledWith(

lambdas/pdm-poll-lambda/src/apis/sqs-handler.ts

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ import {
99
PDMResourceRetriesExceeded,
1010
PDMResourceSubmitted,
1111
PDMResourceUnavailable,
12+
validatePDMResourceSubmitted,
13+
validatePDMResourceUnavailable,
1214
} from 'digital-letters-events';
1315
import pdmResourceAvailableValidator from 'digital-letters-events/PDMResourceAvailable.js';
14-
import pdmResourceSubmittedValidator from 'digital-letters-events/PDMResourceSubmitted.js';
1516
import pdmResourceUnavailableValidator from 'digital-letters-events/PDMResourceUnavailable.js';
1617
import pdmResourceRetriesExceededValidator from 'digital-letters-events/PDMResourceRetriesExceeded.js';
1718
import { randomUUID } from 'node:crypto';
@@ -43,28 +44,12 @@ function validateRecord(
4344
sqsEventDetail.type ===
4445
'uk.nhs.notify.digital.letters.pdm.resource.submitted.v1'
4546
) {
46-
const isEventValid = pdmResourceSubmittedValidator(sqsEventDetail);
47-
if (!isEventValid) {
48-
logger.warn({
49-
err: pdmResourceSubmittedValidator.errors,
50-
description: 'Error parsing queue entry',
51-
});
52-
53-
return null;
54-
}
47+
validatePDMResourceSubmitted(sqsEventDetail, logger);
5548

5649
return { messageId, event: sqsEventDetail };
5750
}
5851

59-
const isEventValid = pdmResourceUnavailableValidator(sqsEventDetail);
60-
if (!isEventValid) {
61-
logger.warn({
62-
err: pdmResourceUnavailableValidator.errors,
63-
description: 'Error parsing queue entry',
64-
});
65-
66-
return null;
67-
}
52+
validatePDMResourceUnavailable(sqsEventDetail, logger);
6853

6954
return { messageId, event: sqsEventDetail };
7055
} catch (error) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ describe('sqs-trigger-lambda', () => {
222222
expect(mockEventPublisher.sendEvents).not.toHaveBeenCalled();
223223
expect(mockLogger.error).toHaveBeenCalledWith(
224224
expect.objectContaining({
225-
description: 'Error parsing queue entry',
225+
description: 'Error parsing MESHInboxMessageDownloaded event',
226226
}),
227227
);
228228
});

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

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ import type {
99
UploadToPdmOutcome,
1010
UploadToPdmResult,
1111
} from 'app/upload-to-pdm';
12-
import messageDownloadedValidator from 'digital-letters-events/MESHInboxMessageDownloaded.js';
1312
import pdmResourceSubmittedValidator from 'digital-letters-events/PDMResourceSubmitted.js';
1413
import pdmResourceSubmissionRejectedValidator from 'digital-letters-events/PDMResourceSubmissionRejected.js';
1514
import {
1615
MESHInboxMessageDownloaded,
1716
PDMResourceSubmitted,
17+
validateMESHInboxMessageDownloaded,
1818
} from 'digital-letters-events';
1919
import { EventPublisher, Logger } from 'utils';
2020

@@ -42,14 +42,7 @@ function validateRecord(
4242
const sqsEventBody = JSON.parse(body);
4343
const sqsEventDetail = sqsEventBody.detail;
4444

45-
const isEventValid = messageDownloadedValidator(sqsEventDetail);
46-
if (!isEventValid) {
47-
logger.error({
48-
err: messageDownloadedValidator.errors,
49-
description: 'Error parsing queue entry',
50-
});
51-
return null;
52-
}
45+
validateMESHInboxMessageDownloaded(sqsEventDetail, logger);
5346

5447
return { messageId, event: sqsEventDetail };
5548
} catch (error) {

0 commit comments

Comments
 (0)