Skip to content

Commit f0e0fb8

Browse files
committed
CCM-12845 Structure logs
1 parent 42b0816 commit f0e0fb8

File tree

16 files changed

+185
-110
lines changed

16 files changed

+185
-110
lines changed

lambdas/api-handler/src/handlers/__tests__/letter-status-update.test.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -143,14 +143,12 @@ describe("createLetterStatusUpdateHandler", () => {
143143
expect(mockedDeps.letterRepo.updateLetterStatus).toHaveBeenCalledWith(
144144
updateLetterCommands[0],
145145
);
146-
expect(mockedDeps.logger.error).toHaveBeenCalledWith(
147-
{
148-
err: mockError,
149-
messageId: "mid-id1",
150-
correlationId: "correlationId-id1",
151-
messageBody: '{"id":"id1","status":"ACCEPTED","supplierId":"s1"}',
152-
},
153-
"Error processing letter status update",
154-
);
146+
expect(mockedDeps.logger.error).toHaveBeenCalledWith({
147+
description: "Error processing letter status update",
148+
err: mockError,
149+
messageId: "mid-id1",
150+
correlationId: "correlationId-id1",
151+
messageBody: '{"id":"id1","status":"ACCEPTED","supplierId":"s1"}',
152+
});
155153
});
156154
});

lambdas/api-handler/src/handlers/get-letter-data.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,23 @@ export default function createGetLetterDataHandler(
3333
),
3434
);
3535

36+
const presignedUrl = await getLetterDataUrl(
37+
commonIds.value.supplierId,
38+
letterId,
39+
deps,
40+
);
41+
42+
deps.logger.info({
43+
description: "Generated presigned URL",
44+
supplierId: commonIds.value.supplierId,
45+
letterId,
46+
correlationId: commonIds.value.correlationId,
47+
});
48+
3649
return {
3750
statusCode: 303,
3851
headers: {
39-
Location: await getLetterDataUrl(
40-
commonIds.value.supplierId,
41-
letterId,
42-
deps,
43-
),
52+
Location: presignedUrl,
4453
},
4554
body: "",
4655
};

lambdas/api-handler/src/handlers/get-letter.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ export default function createGetLetterHandler(
4646
description: "Letter successfully fetched by id",
4747
supplierId: commonIds.value.supplierId,
4848
letterId,
49+
correlationId: commonIds.value.correlationId,
4950
});
5051

5152
return {

lambdas/api-handler/src/handlers/get-letters.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ export default function createGetLettersHandler(
121121
limitNumber,
122122
status,
123123
lettersCount: letters.length,
124+
correlationId: commonIds.value.correlationId,
124125
});
125126

126127
return {

lambdas/api-handler/src/handlers/get-status.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ export default function createGetStatusHandler(
2626
body: JSON.stringify({ code: 200 }, null, 2),
2727
};
2828
} catch (error) {
29-
deps.logger.error(
30-
{ err: error },
31-
"Status endpoint error, services not available",
32-
);
29+
deps.logger.error({
30+
err: error,
31+
description: "Status endpoint error, services not available",
32+
});
3333
return {
3434
statusCode: 500,
3535
body: JSON.stringify({ code: 500 }, null, 2),

lambdas/api-handler/src/handlers/letter-status-update.ts

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,20 @@ export default function createLetterStatusUpdateHandler(
1717
await deps.letterRepo.updateLetterStatus(
1818
mapToUpdateLetter(letterToUpdate),
1919
);
20+
deps.logger.info({
21+
description: "Updated letter status",
22+
letterId: letterToUpdate.id,
23+
messageId: message.messageId,
24+
correlationId: message.messageAttributes.CorrelationId.stringValue,
25+
});
2026
} catch (error) {
21-
deps.logger.error(
22-
{
23-
err: error,
24-
messageId: message.messageId,
25-
correlationId: message.messageAttributes.CorrelationId.stringValue,
26-
messageBody: message.body,
27-
},
28-
"Error processing letter status update",
29-
);
27+
deps.logger.error({
28+
description: "Error processing letter status update",
29+
err: error,
30+
messageId: message.messageId,
31+
correlationId: message.messageAttributes.CorrelationId.stringValue,
32+
messageBody: message.body,
33+
});
3034
}
3135
});
3236

lambdas/api-handler/src/handlers/post-mi.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,12 @@ export default function createPostMIHandler(
5353
deps.miRepo,
5454
);
5555

56+
deps.logger.info({
57+
description: "Posted management information",
58+
supplierId: commonIds.value.supplierId,
59+
correlationId: commonIds.value.correlationId,
60+
});
61+
5662
return {
5763
statusCode: 201,
5864
body: JSON.stringify(result, null, 2),

lambdas/api-handler/src/mappers/error-mapper.ts

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -72,38 +72,33 @@ export function logAndMapToApiError(
7272
logger: Logger,
7373
): ApiError {
7474
if (error instanceof ValidationError) {
75-
logger.info(
76-
{ err: error },
77-
`Validation error correlationId=${correlationId}`,
78-
);
75+
logger.info({ description: "Validation error", err: error, correlationId });
7976
return mapToApiError(
8077
ApiErrorCode.InvalidRequest,
8178
error.detail,
8279
correlationId,
8380
);
8481
}
8582
if (error instanceof NotFoundError) {
86-
logger.info(
87-
{ err: error },
88-
`Not found error correlationId=${correlationId}`,
89-
);
83+
logger.info({ description: "Not found error", err: error, correlationId });
9084
return mapToApiError(ApiErrorCode.NotFound, error.detail, correlationId);
9185
}
9286
if (error instanceof Error) {
93-
logger.error(
94-
{ err: error },
95-
`Internal server error correlationId=${correlationId}`,
96-
);
87+
logger.error({
88+
description: "Internal server error",
89+
err: error,
90+
correlationId,
91+
});
9792
return mapToApiError(
9893
ApiErrorCode.InternalServerError,
9994
"Unexpected error",
10095
correlationId,
10196
);
10297
}
103-
logger.error(
104-
{ err: error },
105-
`Internal server error (non-Error thrown) correlationId=${correlationId}`,
106-
);
98+
logger.error({
99+
description: "Internal server error (non-Error thrown)",
100+
correlationId,
101+
});
107102
return mapToApiError(
108103
ApiErrorCode.InternalServerError,
109104
"Unexpected error",

lambdas/api-handler/src/services/__tests__/letter-operations.test.ts

Lines changed: 43 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -205,14 +205,17 @@ describe("enqueueLetterUpdateRequests function", () => {
205205
jest.clearAllMocks();
206206
});
207207

208-
it("should update the letter status successfully", async () => {
209-
const sqsClient = { send: jest.fn() } as unknown as SQSClient;
210-
const logger = { error: jest.fn() } as unknown as pino.Logger;
211-
const env = {
212-
QUEUE_URL: "sqsUrl",
213-
};
214-
const deps: Deps = { sqsClient, logger, env } as Deps;
208+
const sqsClient = { send: jest.fn() } as unknown as SQSClient;
209+
const logger = {
210+
info: jest.fn(),
211+
error: jest.fn(),
212+
} as unknown as pino.Logger;
213+
const env = {
214+
QUEUE_URL: "sqsUrl",
215+
};
216+
const deps: Deps = { sqsClient, logger, env } as Deps;
215217

218+
it("should update the letter status successfully", async () => {
216219
const updateLetterCommands = Array.from({ length: 25 }, (_, i) =>
217220
makeUpdateLetterCommand(i),
218221
);
@@ -256,22 +259,34 @@ describe("enqueueLetterUpdateRequests function", () => {
256259
expect(thirdInput.Entries[0].Id).toBe("2-0");
257260
});
258261

262+
it("should log when SendMessageBatch returns Successful entries", async () => {
263+
(sqsClient.send as jest.Mock).mockResolvedValue({
264+
Successful: [{ MessageId: "msg-001" }, { MessageId: "msg-002" }],
265+
Failed: [],
266+
});
267+
const updateLetterCommands = [makeUpdateLetterCommand(0)];
268+
269+
await enqueueLetterUpdateRequests(
270+
updateLetterCommands,
271+
"correlationId1",
272+
deps,
273+
);
274+
275+
expect(deps.logger.info).toHaveBeenCalledWith({
276+
description: "Enqueued letter updates",
277+
correlationId: "correlationId1",
278+
messageIds: ["msg-001", "msg-002"],
279+
});
280+
});
281+
259282
it("should log error when SendMessageBatch returns Failed entries", async () => {
260-
const sqsClient = {
261-
send: jest
262-
.fn()
263-
.mockResolvedValueOnce({ Failed: [] }) // first batch succeeds
264-
.mockResolvedValueOnce({
265-
Failed: [
266-
{ Id: "1-1", SenderFault: false, Code: "Err", Message: "failed" },
267-
],
268-
}),
269-
} as unknown as SQSClient;
270-
const logger = { error: jest.fn() } as unknown as pino.Logger;
271-
const env = {
272-
QUEUE_URL: "sqsUrl",
273-
};
274-
const deps: Deps = { sqsClient, logger, env } as Deps;
283+
(sqsClient.send as jest.Mock)
284+
.mockResolvedValueOnce({ Failed: [] }) // first batch succeeds
285+
.mockResolvedValueOnce({
286+
Failed: [
287+
{ Id: "1-1", SenderFault: false, Code: "Err", Message: "failed" },
288+
],
289+
});
275290

276291
const updateLetterCommands = Array.from({ length: 12 }, (_, i) =>
277292
makeUpdateLetterCommand(i),
@@ -296,20 +311,12 @@ describe("enqueueLetterUpdateRequests function", () => {
296311
});
297312

298313
it("should log error if enqueueing fails", async () => {
299-
const sqsClient = {
300-
send: jest
301-
.fn()
302-
.mockResolvedValueOnce({ Failed: [] }) // batch 0
303-
.mockImplementationOnce(() => {
304-
throw new Error("some failure");
305-
}) // batch 1
306-
.mockResolvedValueOnce({ Failed: [] }), // batch 2
307-
} as unknown as SQSClient;
308-
const logger = { error: jest.fn() } as unknown as pino.Logger;
309-
const env = {
310-
QUEUE_URL: "sqsUrl",
311-
};
312-
const deps: Deps = { sqsClient, logger, env } as Deps;
314+
(sqsClient.send as jest.Mock)
315+
.mockResolvedValueOnce({ Failed: [] }) // batch 0
316+
.mockImplementationOnce(() => {
317+
throw new Error("some failure");
318+
}) // batch 1
319+
.mockResolvedValueOnce({ Failed: [] });
313320

314321
const lettersToUpdate = Array.from({ length: 21 }, (_, i) =>
315322
makeUpdateLetterCommand(i),

lambdas/api-handler/src/services/letter-operations.ts

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -123,20 +123,26 @@ export async function enqueueLetterUpdateRequests(
123123

124124
try {
125125
const result = await deps.sqsClient.send(cmd);
126+
if (result.Successful && result.Successful.length > 0) {
127+
deps.logger.info({
128+
description: "Enqueued letter updates",
129+
correlationId,
130+
messageIds: result.Successful.map((entry) => entry.MessageId),
131+
});
132+
}
126133
if (result.Failed && result.Failed.length > 0) {
127-
deps.logger.error(
128-
{ failed: result.Failed },
129-
"Some batch entries failed",
130-
);
134+
deps.logger.error({
135+
failed: result.Failed,
136+
description: "Some batch entries failed",
137+
correlationId,
138+
});
131139
}
132140
} catch (error) {
133-
deps.logger.error(
134-
{
135-
err: error,
136-
correlationId,
137-
},
138-
"Error enqueuing letter status updates",
139-
);
141+
deps.logger.error({
142+
err: error,
143+
description: "Error enqueuing letter status updates",
144+
correlationId,
145+
});
140146
}
141147
}),
142148
);

0 commit comments

Comments
 (0)