Skip to content

Commit cd571a2

Browse files
CCM-14318: Endpoints fetching letters return 500 instead of 404 when letter not found for supplier (#485)
* Refactor handling of letter not found * fix tests * fix another test * remove e2e test 500 not found * fix import * try * fix * remove regex from vale accepted * lint and editor
1 parent dd1812d commit cd571a2

19 files changed

Lines changed: 54 additions & 94 deletions

File tree

.github/PULL_REQUEST_TEMPLATE.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@
2727
- [ ] This PR is a result of pair or mob programming
2828
<!-- - [ ] If I have used the 'skip-trivy-package' label I have done so responsibly and in the knowledge that this is being fixed as part of a separate ticket/PR. TODO - Re-visit Trivy usage https://nhsd-jira.digital.nhs.uk/browse/CCM-15549 -->
2929

30+
## DT3-Specific Checklist
31+
32+
<!-- Go over all the following points, and put an `x` in all the boxes that apply. -->
33+
34+
- [ ] If I have added a new resource (SQS, Lambda, Gateway, DDB table, etc), I have created the appropriate alarms
35+
3036
---
3137

3238
## Sensitive Information Declaration

.vscode/settings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@
1010
"**/Thumbs.db": true,
1111
".github": false,
1212
".vscode": false
13-
}
13+
},
14+
"js/ts.tsdk.path": "node_modules/typescript/lib"
1415
}

internal/datastore/src/__test__/letter-queue-repository.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ import {
88
} from "./db";
99
import LetterQueueRepository from "../letter-queue-repository";
1010
import { InsertPendingLetter } from "../types";
11-
import { LetterAlreadyExistsError } from "../letter-already-exists-error";
11+
import LetterAlreadyExistsError from "../errors/letter-already-exists-error";
1212
import { createTestLogger } from "./logs";
13-
import { LetterDoesNotExistError } from "../letter-does-not-exist-error";
13+
import LetterNotFoundError from "../errors/letter-not-found-error";
1414

1515
function createLetter(
1616
overrides: Partial<InsertPendingLetter> = {},
@@ -133,7 +133,7 @@ describe("LetterQueueRepository", () => {
133133
it("throws an error when the letter does not exist", async () => {
134134
await expect(
135135
letterQueueRepository.deleteLetter("supplier1", "letter1"),
136-
).rejects.toThrow(LetterDoesNotExistError);
136+
).rejects.toThrow(LetterNotFoundError);
137137
});
138138

139139
it("rethrows errors from DynamoDB when deleting a letter", async () => {

internal/datastore/src/__test__/letter-repository.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {
88
import { LetterRepository } from "../letter-repository";
99
import { InsertLetter, Letter, UpdateLetter } from "../types";
1010
import { createTestLogger } from "./logs";
11-
import { LetterAlreadyExistsError } from "../letter-already-exists-error";
11+
import LetterAlreadyExistsError from "../errors/letter-already-exists-error";
1212

1313
function createLetter(
1414
supplierId: string,
@@ -140,7 +140,7 @@ describe("LetterRepository", () => {
140140
await expect(
141141
letterRepository.getLetterById("supplier1", "letter1"),
142142
).rejects.toThrow(
143-
"Letter with id letter1 not found for supplier supplier1",
143+
"Letter not found: supplierId=supplier1, letterId=letter1",
144144
);
145145
});
146146

internal/datastore/src/letter-already-exists-error.ts renamed to internal/datastore/src/errors/letter-already-exists-error.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
/**
22
* Error thrown when attempting to create a letter that already exists in the database.
33
*/
4-
// eslint-disable-next-line import-x/prefer-default-export
5-
export class LetterAlreadyExistsError extends Error {
4+
export default class LetterAlreadyExistsError extends Error {
65
constructor(
76
public readonly supplierId: string,
87
public readonly letterId: string,
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/**
2+
* Error thrown when a letter is not found in the database.
3+
*/
4+
export default class LetterNotFoundError extends Error {
5+
constructor(
6+
public readonly supplierId: string,
7+
public readonly letterId: string,
8+
) {
9+
super(`Letter not found: supplierId=${supplierId}, letterId=${letterId}`);
10+
this.name = "LetterNotFoundError";
11+
}
12+
}

internal/datastore/src/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
export * from "./types";
2-
export * from "./letter-already-exists-error";
3-
export * from "./letter-does-not-exist-error";
42
export * from "./mi-repository";
53
export * from "./letter-repository";
64
export * from "./supplier-repository";
75
export * from "./supplier-config-repository";
86
export { default as LetterQueueRepository } from "./letter-queue-repository";
97
export { default as DBHealthcheck } from "./healthcheck";
8+
export { default as LetterAlreadyExistsError } from "./errors/letter-already-exists-error";
9+
export { default as LetterNotFoundError } from "./errors/letter-not-found-error";

internal/datastore/src/letter-does-not-exist-error.ts

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

internal/datastore/src/letter-queue-repository.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ import {
1313
PendingLetterBase,
1414
PendingLetterSchema,
1515
} from "./types";
16-
import { LetterAlreadyExistsError } from "./letter-already-exists-error";
17-
import { LetterDoesNotExistError } from "./letter-does-not-exist-error";
16+
import LetterAlreadyExistsError from "./errors/letter-already-exists-error";
17+
import LetterNotFoundError from "./errors/letter-not-found-error";
1818

1919
type LetterQueueRepositoryConfig = {
2020
letterQueueTableName: string;
@@ -87,7 +87,7 @@ export default class LetterQueueRepository {
8787
error instanceof Error &&
8888
error.name === "ConditionalCheckFailedException"
8989
) {
90-
throw new LetterDoesNotExistError(supplierId, letterId);
90+
throw new LetterNotFoundError(supplierId, letterId);
9191
}
9292
throw error;
9393
}

internal/datastore/src/letter-repository.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import {
99
import { ConditionalCheckFailedException } from "@aws-sdk/client-dynamodb";
1010
import { Logger } from "pino";
1111
import { InsertLetter, Letter, LetterSchema, UpdateLetter } from "./types";
12-
import { LetterAlreadyExistsError } from "./letter-already-exists-error";
12+
import LetterNotFoundError from "./errors/letter-not-found-error";
13+
import LetterAlreadyExistsError from "./errors/letter-already-exists-error";
1314

1415
export type PagingOptions = Partial<{
1516
exclusiveStartKey: Record<string, any>;
@@ -103,9 +104,7 @@ export class LetterRepository {
103104
);
104105

105106
if (!result.Item) {
106-
throw new Error(
107-
`Letter with id ${letterId} not found for supplier ${supplierId}`,
108-
);
107+
throw new LetterNotFoundError(supplierId, letterId);
109108
}
110109
return LetterSchema.parse(result.Item);
111110
}

0 commit comments

Comments
 (0)