Skip to content

Commit 77577e5

Browse files
committed
Use updatedAt from database for event timestamp
1 parent 42d4507 commit 77577e5

File tree

5 files changed

+19
-24
lines changed

5 files changed

+19
-24
lines changed

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

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { Deps } from "../deps";
1313
import { EnvVars } from "../env";
1414
import mapLetterToCloudEvent from "../mappers/letter-mapper";
1515
import { LetterStatus } from "../../../api-handler/src/contracts/letters";
16-
import { LetterWithSupplierId } from "../types";
16+
import { LetterForEventPub } from "../types";
1717

1818
// Make crypto return consistent values, since we"re calling it in both prod and test code and comparing the values
1919
const realCrypto = jest.requireActual("crypto");
@@ -148,7 +148,7 @@ describe("letter-updates-transformer Lambda", () => {
148148
it("does not publish invalid letter data", async () => {
149149
const handler = createHandler(mockedDeps);
150150
const oldLetter = generateLetter("ACCEPTED");
151-
const newLetter = { id: oldLetter.id } as LetterWithSupplierId;
151+
const newLetter = { id: oldLetter.id } as LetterForEventPub;
152152

153153
const testData = generateKinesisEvent([
154154
generateModifyRecord(oldLetter, newLetter),
@@ -252,33 +252,31 @@ describe("letter-updates-transformer Lambda", () => {
252252
});
253253
});
254254

255-
function generateLetter(
256-
status: LetterStatus,
257-
id?: string,
258-
): LetterWithSupplierId {
255+
function generateLetter(status: LetterStatus, id?: string): LetterForEventPub {
259256
return {
260257
id: id || "1",
261258
status,
262259
specificationId: "spec1",
263260
supplierId: "supplier1",
264261
groupId: "group1",
262+
updatedAt: "2025-12-10T11:13:54Z",
265263
};
266264
}
267265

268266
function generateLetters(
269267
numLetters: number,
270268
status: LetterStatus,
271-
): LetterWithSupplierId[] {
272-
const letters: LetterWithSupplierId[] = Array.from({ length: numLetters });
269+
): LetterForEventPub[] {
270+
const letters: LetterForEventPub[] = Array.from({ length: numLetters });
273271
for (let i = 0; i < numLetters; i++) {
274272
letters[i] = generateLetter(status, String(i + 1));
275273
}
276274
return letters;
277275
}
278276

279277
function generateModifyRecord(
280-
oldLetter: LetterWithSupplierId,
281-
newLetter: LetterWithSupplierId,
278+
oldLetter: LetterForEventPub,
279+
newLetter: LetterForEventPub,
282280
): DynamoDBRecord {
283281
const oldImage = Object.fromEntries(
284282
Object.entries(oldLetter).map(([key, value]) => [key, { S: value }]),

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
import { LetterEvent } from "@nhsdigital/nhs-notify-event-schemas-supplier-api/src";
1313
import mapLetterToCloudEvent from "./mappers/letter-mapper";
1414
import { Deps } from "./deps";
15-
import { LetterSchemaWithSupplierId, LetterWithSupplierId } from "./types";
15+
import { LetterForEventPub, LetterSchemaForEventPub } from "./types";
1616

1717
// SNS PublishBatchCommand supports up to 10 messages per batch
1818
const BATCH_SIZE = 10;
@@ -62,9 +62,9 @@ function isChanged(record: DynamoDBRecord, property: string): boolean {
6262
return oldValue?.S !== newValue?.S;
6363
}
6464

65-
function extractNewLetter(record: DynamoDBRecord): LetterWithSupplierId {
65+
function extractNewLetter(record: DynamoDBRecord): LetterForEventPub {
6666
const newImage = record.dynamodb?.NewImage!;
67-
return LetterSchemaWithSupplierId.parse(unmarshall(newImage as any));
67+
return LetterSchemaForEventPub.parse(unmarshall(newImage as any));
6868
}
6969

7070
function* generateBatches(events: LetterEvent[]) {

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,8 @@ describe("letter-mapper", () => {
1212
status: "PRINTED",
1313
reasonCode: "R02",
1414
reasonText: "Reason text",
15+
updatedAt: "2025-11-24T15:55:18.000Z",
1516
} as Letter;
16-
jest.useFakeTimers().setSystemTime(new Date("2025-11-24T15:55:18Z"));
17-
1817
const event = mapLetterToCloudEvent(letter);
1918

2019
// Check it conforms to the letter event schema - parse will throw an error if not
@@ -42,7 +41,5 @@ describe("letter-mapper", () => {
4241
event: event.id,
4342
},
4443
});
45-
46-
jest.useRealTimers();
4744
});
4845
});

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
import { LetterEvent } from "@nhsdigital/nhs-notify-event-schemas-supplier-api/src";
22
import { randomBytes, randomUUID } from "node:crypto";
33
import eventSchemaPackage from "@nhsdigital/nhs-notify-event-schemas-supplier-api/package.json";
4-
import { LetterWithSupplierId } from "../types";
4+
import { LetterForEventPub } from "../types";
55

66
export default function mapLetterToCloudEvent(
7-
letter: LetterWithSupplierId,
7+
letter: LetterForEventPub,
88
): LetterEvent {
9-
const now = new Date().toISOString();
109
const eventId = randomUUID();
1110
const dataschemaversion = eventSchemaPackage.version;
1211
return {
@@ -34,10 +33,10 @@ export default function mapLetterToCloudEvent(
3433
event: eventId,
3534
},
3635
},
37-
time: now,
36+
time: letter.updatedAt,
3837
datacontenttype: "application/json",
3938
traceparent: `00-${randomBytes(16).toString("hex")}-${randomBytes(8).toString("hex")}-01`,
40-
recordedtime: now,
39+
recordedtime: letter.updatedAt,
4140
severitynumber: 2,
4241
severitytext: "INFO",
4342
};

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ import { LetterSchemaBase, SupplierSchema } from "@internal/datastore";
22
import { idRef } from "@internal/helpers";
33
import { z } from "zod";
44

5-
export const LetterSchemaWithSupplierId = LetterSchemaBase.extend({
5+
export const LetterSchemaForEventPub = LetterSchemaBase.extend({
66
supplierId: idRef(SupplierSchema, "id"),
7+
updatedAt: z.string(),
78
});
89

9-
export type LetterWithSupplierId = z.infer<typeof LetterSchemaWithSupplierId>;
10+
export type LetterForEventPub = z.infer<typeof LetterSchemaForEventPub>;

0 commit comments

Comments
 (0)