Skip to content

Commit 81ec7cb

Browse files
committed
allow insert record
1 parent b566ed3 commit 81ec7cb

File tree

3 files changed

+65
-23
lines changed

3 files changed

+65
-23
lines changed

lambdas/letter-updates-transformer/src/__tests__/letter-updates-transformer.test.ts

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,18 @@ jest.mock("crypto", () => ({
2626
randomBytes: (size: number) => randomBytes[String(size)],
2727
}));
2828

29-
const eventSource = "/data-plane/supplier-api/nhs-supplier-api-dev/main/letters";
29+
const eventSource =
30+
"/data-plane/supplier-api/nhs-supplier-api-dev/main/letters";
3031
const mockedDeps: jest.Mocked<Deps> = {
31-
snsClient: { send: jest.fn() } as unknown as SNSClient,
32-
logger: { info: jest.fn(), error: jest.fn() } as unknown as pino.Logger,
33-
env: {
34-
EVENTPUB_SNS_TOPIC_ARN: "arn:aws:sns:region:account:topic",
35-
EVENT_SOURCE: eventSource
36-
} as unknown as EnvVars,
37-
} as Deps;
32+
snsClient: { send: jest.fn() } as unknown as SNSClient,
33+
logger: { info: jest.fn(), error: jest.fn() } as unknown as pino.Logger,
34+
env: {
35+
EVENTPUB_SNS_TOPIC_ARN: "arn:aws:sns:region:account:topic",
36+
EVENT_SOURCE: eventSource,
37+
} as unknown as EnvVars,
38+
} as Deps;
3839

3940
describe("letter-updates-transformer Lambda", () => {
40-
4141
beforeEach(() => {
4242
jest.useFakeTimers();
4343
});
@@ -53,7 +53,9 @@ describe("letter-updates-transformer Lambda", () => {
5353
const newLetter = generateLetter("PRINTED");
5454
const expectedEntries = [
5555
expect.objectContaining({
56-
Message: JSON.stringify(mapLetterToCloudEvent(newLetter, eventSource)),
56+
Message: JSON.stringify(
57+
mapLetterToCloudEvent(newLetter, eventSource),
58+
),
5759
}),
5860
];
5961

@@ -79,7 +81,9 @@ describe("letter-updates-transformer Lambda", () => {
7981
newLetter.reasonCode = "R1";
8082
const expectedEntries = [
8183
expect.objectContaining({
82-
Message: JSON.stringify(mapLetterToCloudEvent(newLetter, eventSource)),
84+
Message: JSON.stringify(
85+
mapLetterToCloudEvent(newLetter, eventSource),
86+
),
8387
}),
8488
];
8589

@@ -106,7 +110,9 @@ describe("letter-updates-transformer Lambda", () => {
106110
newLetter.reasonCode = "R2";
107111
const expectedEntries = [
108112
expect.objectContaining({
109-
Message: JSON.stringify(mapLetterToCloudEvent(newLetter, eventSource)),
113+
Message: JSON.stringify(
114+
mapLetterToCloudEvent(newLetter, eventSource),
115+
),
110116
}),
111117
];
112118

@@ -138,14 +144,28 @@ describe("letter-updates-transformer Lambda", () => {
138144
expect(mockedDeps.snsClient.send).not.toHaveBeenCalled();
139145
});
140146

141-
it("does not publish non-modify events", async () => {
147+
it("publishes INSERT events", async () => {
142148
const handler = createHandler(mockedDeps);
143149
const newLetter = generateLetter("ACCEPTED");
150+
const expectedEntries = [
151+
expect.objectContaining({
152+
Message: JSON.stringify(
153+
mapLetterToCloudEvent(newLetter, eventSource),
154+
),
155+
}),
156+
];
144157

145158
const testData = generateKinesisEvent([generateInsertRecord(newLetter)]);
146159
await handler(testData, mockDeep<Context>(), jest.fn());
147160

148-
expect(mockedDeps.snsClient.send).not.toHaveBeenCalled();
161+
expect(mockedDeps.snsClient.send).toHaveBeenCalledWith(
162+
expect.objectContaining({
163+
input: expect.objectContaining({
164+
TopicArn: "arn:aws:sns:region:account:topic",
165+
PublishBatchRequestEntries: expectedEntries,
166+
}),
167+
}),
168+
);
149169
});
150170

151171
it("does not publish invalid letter data", async () => {

lambdas/letter-updates-transformer/src/letter-updates-transformer.ts

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,13 @@ export default function createHandler(deps: Deps): Handler<KinesisStreamEvent> {
2121
return async (streamEvent: KinesisStreamEvent) => {
2222
deps.logger.info({ description: "Received event", streamEvent });
2323

24-
const cloudEvents: LetterEvent[] = streamEvent.Records.map((record) =>
24+
// Ensure logging by extracting all records first
25+
const ddbRecords: DynamoDBRecord[] = streamEvent.Records.map((record) =>
2526
extractPayload(record, deps),
26-
)
27-
.filter((record) => record.eventName === "MODIFY")
28-
.filter(
29-
(record) =>
30-
isChanged(record, "status") || isChanged(record, "reasonCode"),
31-
)
27+
);
28+
29+
const cloudEvents: LetterEvent[] = ddbRecords
30+
.filter((record) => filterRecord(record, deps))
3231
.map((element) => extractNewLetter(element))
3332
.map((element) => mapLetterToCloudEvent(element, deps.env.EVENT_SOURCE));
3433

@@ -50,6 +49,29 @@ export default function createHandler(deps: Deps): Handler<KinesisStreamEvent> {
5049
};
5150
}
5251

52+
function filterRecord(record: DynamoDBRecord, deps: Deps): boolean {
53+
let allowEvent = false;
54+
if (record.eventName === "INSERT") {
55+
allowEvent = true;
56+
}
57+
58+
if (
59+
record.eventName === "MODIFY" &&
60+
(isChanged(record, "status") || isChanged(record, "reasonCode"))
61+
) {
62+
allowEvent = true;
63+
}
64+
65+
deps.logger.info({
66+
description: "Filtering record",
67+
eventName: record.eventName,
68+
eventId: record.eventID,
69+
allowEvent,
70+
});
71+
72+
return allowEvent;
73+
}
74+
5375
function extractPayload(
5476
record: KinesisStreamRecord,
5577
deps: Deps,

lambdas/letter-updates-transformer/src/mappers/letter-mapper.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { LetterForEventPub } from "../types";
55

66
export default function mapLetterToCloudEvent(
77
letter: LetterForEventPub,
8-
source: string
8+
source: string,
99
): LetterEvent {
1010
const eventId = randomUUID();
1111
const dataschemaversion = eventSchemaPackage.version;
@@ -16,7 +16,7 @@ export default function mapLetterToCloudEvent(
1616
plane: "data",
1717
dataschema: `https://notify.nhs.uk/cloudevents/schemas/supplier-api/letter.${letter.status}.${dataschemaversion}.schema.json`,
1818
dataschemaversion,
19-
source: source,
19+
source,
2020
subject: `letter-origin/supplier-api/letter/${letter.id}`,
2121

2222
data: {

0 commit comments

Comments
 (0)