Skip to content

Commit c63c423

Browse files
committed
Switch letter_status_update lambda to use eventsub SNS topic
1 parent 256710a commit c63c423

21 files changed

Lines changed: 217 additions & 167 deletions

File tree

.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+
"typescript.tsdk": "node_modules/typescript/lib"
1415
}

infrastructure/terraform/components/api/module_lambda_letter_status_update.tf

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,10 @@ module "letter_status_update" {
3434
log_destination_arn = local.destination_arn
3535
log_subscription_role_arn = local.acct.log_subscription_role_arn
3636

37-
lambda_env_vars = merge(local.common_lambda_env_vars, {})
37+
lambda_env_vars = merge(local.common_lambda_env_vars, {
38+
SNS_TOPIC_ARN = "${module.eventsub.sns_topic.arn}",
39+
EVENT_SOURCE = "/data-plane/supplier-api/${var.group}/${var.environment}/letters"
40+
})
3841
}
3942

4043
data "aws_iam_policy_document" "letter_status_update" {
@@ -59,7 +62,6 @@ data "aws_iam_policy_document" "letter_status_update" {
5962
actions = [
6063
"dynamodb:GetItem",
6164
"dynamodb:Query",
62-
"dynamodb:UpdateItem",
6365
]
6466

6567
resources = [
@@ -68,18 +70,15 @@ data "aws_iam_policy_document" "letter_status_update" {
6870
}
6971

7072
statement {
71-
sid = "AllowQueueAccess"
73+
sid = "AllowSNSPublish"
7274
effect = "Allow"
7375

7476
actions = [
75-
"sqs:ReceiveMessage",
76-
"sqs:DeleteMessage",
77-
"sqs:GetQueueAttributes",
78-
"sqs:ChangeMessageVisibility"
77+
"sns:Publish"
7978
]
8079

8180
resources = [
82-
module.letter_status_updates_queue.sqs_queue_arn
81+
module.eventsub.sns_topic.arn
8382
]
8483
}
8584
}

internal/events/jest.config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export const baseJestConfig: Config = {
2424
},
2525
},
2626

27-
coveragePathIgnorePatterns: ["/__tests__/"],
27+
coveragePathIgnorePatterns: ["/src/index.ts$", "/__tests__/"],
2828
transform: { "^.+\\.ts$": "ts-jest" },
2929
testPathIgnorePatterns: [".build"],
3030
testMatch: ["**/?(*.)+(spec|test).[jt]s?(x)"],

internal/events/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
"dependencies": {
33
"@asyncapi/bundler": "^0.6.4",
4+
"@internal/datastore": "*",
45
"zod": "^4.1.11"
56
},
67
"description": "Schemas for NHS Notify Supplier API events",

lambdas/letter-updates-transformer/src/mappers/__tests__/letter-mapper.test.ts renamed to internal/events/src/events/__tests__/letter-mapper.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { $LetterEvent } from "@nhsdigital/nhs-notify-event-schemas-supplier-api/src";
2-
import { Letter } from "@internal/datastore";
3-
import mapLetterToCloudEvent from "../letter-mapper";
2+
import { Letter } from "internal/datastore/src/types";
3+
import { mapLetterToCloudEvent } from "../letter-mapper";
44

55
describe("letter-mapper", () => {
66
it("maps a letter to a letter event", async () => {

lambdas/letter-updates-transformer/src/mappers/letter-mapper.ts renamed to internal/events/src/events/letter-mapper.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
import { LetterEvent } from "@nhsdigital/nhs-notify-event-schemas-supplier-api/src";
21
import { randomBytes, randomUUID } from "node:crypto";
32
import eventSchemaPackage from "@nhsdigital/nhs-notify-event-schemas-supplier-api/package.json";
4-
import { LetterForEventPub } from "../types";
3+
import { Letter } from "internal/datastore/src/types";
4+
import { LetterEvent } from "./letter-events";
55

6-
export default function mapLetterToCloudEvent(
7-
letter: LetterForEventPub,
6+
// eslint-disable-next-line import-x/prefer-default-export
7+
export function mapLetterToCloudEvent(
8+
letter: Letter,
89
source: string,
910
): LetterEvent {
1011
const eventId = randomUUID();

internal/events/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ export { default as DomainBase } from "./domain/domain-base";
44
export * from "./events/event-envelope";
55
export * from "./events/letter-events";
66
export * from "./events/mi-events";
7+
export * from "./events/letter-mapper";

internal/events/tsconfig.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
"declaration": true,
44
"isolatedModules": true,
55
"module": "commonjs",
6-
"outDir": "dist",
7-
"resolveJsonModule": true
6+
"outDir": "dist"
87
},
98
"exclude": [
109
"node_modules",

lambdas/api-handler/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22
"dependencies": {
33
"@aws-sdk/client-dynamodb": "^3.925.0",
44
"@aws-sdk/client-s3": "^3.925.0",
5+
"@aws-sdk/client-sns": "^3.925.0",
56
"@aws-sdk/client-sqs": "^3.925.0",
67
"@aws-sdk/lib-dynamodb": "^3.925.0",
78
"@aws-sdk/s3-request-presigner": "^3.925.0",
89
"@internal/datastore": "*",
910
"@internal/helpers": "*",
11+
"@nhsdigital/nhs-notify-event-schemas-supplier-api": "*",
1012
"aws-lambda": "^1.0.7",
1113
"esbuild": "^0.25.11",
1214
"pino": "^9.7.0",

lambdas/api-handler/src/config/__tests__/env.test.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ describe("lambdaEnv", () => {
2525
process.env.DOWNLOAD_URL_TTL_SECONDS = "60";
2626
process.env.MAX_LIMIT = "2500";
2727
process.env.QUEUE_URL = "url";
28+
process.env.EVENT_SOURCE = "supplier-api";
29+
process.env.SNS_TOPIC_ARN = "sns-topic.arn";
2830

2931
const { envVars } = require("../env");
3032

@@ -38,6 +40,8 @@ describe("lambdaEnv", () => {
3840
DOWNLOAD_URL_TTL_SECONDS: 60,
3941
MAX_LIMIT: 2500,
4042
QUEUE_URL: "url",
43+
EVENT_SOURCE: "supplier-api",
44+
SNS_TOPIC_ARN: "sns-topic.arn",
4145
});
4246
});
4347

@@ -61,6 +65,8 @@ describe("lambdaEnv", () => {
6165
process.env.LETTER_TTL_HOURS = "12960";
6266
process.env.MI_TTL_HOURS = "2160";
6367
process.env.DOWNLOAD_URL_TTL_SECONDS = "60";
68+
process.env.EVENT_SOURCE = "supplier-api";
69+
process.env.SNS_TOPIC_ARN = "sns-topic.arn";
6470

6571
const { envVars } = require("../env");
6672

@@ -73,6 +79,8 @@ describe("lambdaEnv", () => {
7379
MI_TTL_HOURS: 2160,
7480
DOWNLOAD_URL_TTL_SECONDS: 60,
7581
MAX_LIMIT: undefined,
82+
EVENT_SOURCE: "supplier-api",
83+
SNS_TOPIC_ARN: "sns-topic.arn",
7684
});
7785
});
7886
});

0 commit comments

Comments
 (0)