Skip to content

Commit 51d6819

Browse files
CCM-13675: Event code generation improvements (#254)
* CCM-14616: POC * CCM-13675: Event code generation improvements * CCM-13675: Event code generation improvements * CCM-13675: Event code generation improvements * CCM-13675: Fix component tests * CCM-13675: Fix component tests * CCM-13675: Get rid of js validators in lamdbas * CCM-13675: Get rid of js validators in lamdbas * CCM-13675: Address review comments * CCM-13675: Fix component tests * CCM-13675: Fix component tests * CCM-13675: Address review comments * CCM-13675: Address review comments * CCM-13675: Fix build * CCM-13675: Fix build * CCM-13675: Fix compile issues * CCM-13675: Fix compile issues
1 parent d97dccd commit 51d6819

56 files changed

Lines changed: 433 additions & 352 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

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/apis/sqs-handler.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,16 @@ import {
1010
MessageRequestSkipped,
1111
MessageRequestSubmitted,
1212
PDMResourceAvailable,
13+
validateMessageRequestRejected,
14+
validateMessageRequestSkipped,
15+
validateMessageRequestSubmitted,
1316
} from 'digital-letters-events';
1417
import {
1518
mapPdmEventToMessageRequestRejected,
1619
mapPdmEventToMessageRequestSkipped,
1720
mapPdmEventToMessageRequestSubmitted,
1821
mapPdmEventToSingleMessageRequest,
1922
} from 'domain/mapper';
20-
import messageRequestSubmittedValidator from 'digital-letters-events/MessageRequestSubmitted.js';
21-
import messageRequestRejectedValidator from 'digital-letters-events/MessageRequestRejected.js';
22-
import messageRequestSkippedValidator from 'digital-letters-events/MessageRequestSkipped.js';
2323
import { parseSqsRecord } from 'app/parse-sqs-message';
2424

2525
import type { NotifyMessageProcessor } from 'app/notify-message-processor';
@@ -186,17 +186,17 @@ export const createHandler = ({
186186
submittedEvents.length > 0 &&
187187
eventPublisher.sendEvents<MessageRequestSubmitted>(
188188
submittedEvents,
189-
messageRequestSubmittedValidator,
189+
validateMessageRequestSubmitted,
190190
),
191191
skippedEvents.length > 0 &&
192192
eventPublisher.sendEvents<MessageRequestSkipped>(
193193
skippedEvents,
194-
messageRequestSkippedValidator,
194+
validateMessageRequestSkipped,
195195
),
196196
rejectedEvents.length > 0 &&
197197
eventPublisher.sendEvents<MessageRequestRejected>(
198198
rejectedEvents,
199-
messageRequestRejectedValidator,
199+
validateMessageRequestRejected,
200200
),
201201
].filter(Boolean),
202202
);

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/move-scanned-files-lambda/src/__tests__/domain/mapper.test.ts

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1+
import {
2+
validateFileQuarantined,
3+
validateFileSafe,
4+
} from 'digital-letters-events';
15
import { createFileQuarantinedEvent, createFileSafeEvent } from 'domain/mapper';
2-
import fileSafeValidator from 'digital-letters-events/FileSafe.js';
3-
import fileQuarantinedValidator from 'digital-letters-events/FileQuarantined.js';
6+
import { mock } from 'jest-mock-extended';
7+
import { Logger } from 'utils';
48

59
// Mock randomUUID to make tests deterministic
610
jest.mock('node:crypto', () => ({
@@ -22,6 +26,7 @@ describe('mapper', () => {
2226
});
2327

2428
describe('createFileSafeEvent', () => {
29+
const mockLogger = mock<Logger>();
2530
it('creates a FileSafe event with correct structure', () => {
2631
const messageReference = 'msg-ref-123';
2732
const senderId = 'sender-456';
@@ -52,11 +57,7 @@ describe('mapper', () => {
5257
recordedtime: '2024-01-15T10:30:00.000Z',
5358
severitynumber: 2,
5459
});
55-
const isValid = fileSafeValidator(result);
56-
if (!isValid) {
57-
throw new Error(JSON.stringify(fileSafeValidator.errors, null, 2));
58-
}
59-
expect(isValid).toBe(true);
60+
expect(() => validateFileSafe(result, mockLogger)).not.toThrow();
6061
});
6162

6263
it('handles different input values correctly', () => {
@@ -80,6 +81,8 @@ describe('mapper', () => {
8081
});
8182

8283
describe('createFileQuarantinedEvent', () => {
84+
const mockLogger = mock<Logger>();
85+
8386
it('creates a FileQuarantined event with correct structure', () => {
8487
const messageReference = 'msg-ref-789';
8588
const senderId = 'sender-012';
@@ -111,13 +114,7 @@ describe('mapper', () => {
111114
recordedtime: '2024-01-15T10:30:00.000Z',
112115
severitynumber: 2,
113116
});
114-
const isValid = fileQuarantinedValidator(result);
115-
if (!isValid) {
116-
throw new Error(
117-
JSON.stringify(fileQuarantinedValidator.errors, null, 2),
118-
);
119-
}
120-
expect(isValid).toBe(true);
117+
expect(() => validateFileQuarantined(result, mockLogger)).not.toThrow();
121118
});
122119
});
123120
});

lambdas/move-scanned-files-lambda/src/apis/sqs-handler.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@ import type {
66
SQSRecord,
77
} from 'aws-lambda';
88
import { EventPublisher, Logger } from 'utils';
9-
import { FileQuarantined, FileSafe } from 'digital-letters-events';
10-
import fileSafeValidator from 'digital-letters-events/FileSafe.js';
11-
import fileQuarantinedValidator from 'digital-letters-events/FileQuarantined.js';
9+
import {
10+
FileQuarantined,
11+
FileSafe,
12+
validateFileQuarantined,
13+
validateFileSafe,
14+
} from 'digital-letters-events';
1215
import { parseSqsRecord } from 'app/parse-sqs-message';
1316
import { MoveFileHandler } from 'app/move-file-handler';
1417

@@ -69,14 +72,11 @@ export const createHandler = ({
6972
await Promise.all(
7073
[
7174
fileSafeEvents.length > 0 &&
72-
eventPublisher.sendEvents<FileSafe>(
73-
fileSafeEvents,
74-
fileSafeValidator,
75-
),
75+
eventPublisher.sendEvents<FileSafe>(fileSafeEvents, validateFileSafe),
7676
fileQuarantinedEvents.length > 0 &&
7777
eventPublisher.sendEvents<FileQuarantined>(
7878
fileQuarantinedEvents,
79-
fileQuarantinedValidator,
79+
validateFileQuarantined,
8080
),
8181
].filter(Boolean),
8282
);

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
@@ -296,13 +296,13 @@ describe('SQS Handler', () => {
296296

297297
const result = await handler(event);
298298

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

308308
expect(logger.info).toHaveBeenCalledWith(
@@ -323,13 +323,13 @@ describe('SQS Handler', () => {
323323

324324
const result = await handler(event);
325325

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

335335
expect(logger.info).toHaveBeenCalledWith(

0 commit comments

Comments
 (0)