Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
b96894d
CCM-13475: Send print events
simonlabarere Jan 13, 2026
b47da0a
CCM-12614: add github package manager authentication
Ian-Hodges Jan 12, 2026
d9a4b1a
CCM-12614: add github package manager authentication
Ian-Hodges Jan 12, 2026
883f871
CCM-13475: Github token fix attempt
simonlabarere Jan 13, 2026
f2e18ae
CCM-13475: Send print events
simonlabarere Jan 13, 2026
cd9ef30
CCM-13475: Send print events
simonlabarere Jan 13, 2026
874098a
CCM-13475: Send print events
simonlabarere Jan 13, 2026
a1ce01c
Merge branch 'main' into feature/CCM-13475_send_print_events
simonlabarere Jan 13, 2026
d3a28ec
CCM-13475: Send print events
simonlabarere Jan 15, 2026
cbe7ee4
CCM-14347: Send Print config
simonlabarere Jan 15, 2026
8533768
CCM-14347: Send Print config
simonlabarere Jan 15, 2026
e15f07c
CCM-14347: Send Print config
simonlabarere Jan 15, 2026
8f90c56
CCM-14347: Send Print config
simonlabarere Jan 15, 2026
1e6d3bf
CCM-14347: Send Print config
simonlabarere Jan 15, 2026
7658aa1
CCM-14347: Send Print config
simonlabarere Jan 15, 2026
fd24d89
CCM-14347: Send Print config
simonlabarere Jan 15, 2026
0d1807e
CCM-14347: Send Print config
simonlabarere Jan 15, 2026
1c3bbee
CCM-14347: Send Print config
simonlabarere Jan 15, 2026
4ba840b
Merge branch 'main' into feature/CCM-13475_send_print_events
lapenna-bjss Jan 28, 2026
abce4d7
CCM-13475: Remove package-lock.json file
lapenna-bjss Jan 28, 2026
39a0605
CCM-13475: Test
lapenna-bjss Jan 28, 2026
9fdee7a
CCM-13475: add input transformation
lapenna-bjss Jan 28, 2026
48d8a4c
CCM-13475: pin @nhsdigital/nhs-notify-event-schemas-supplier-api to 1…
lapenna-bjss Jan 29, 2026
47adec6
CCM-13475: add campaignId to letter prepared events
lapenna-bjss Jan 29, 2026
266f4e3
CCM-13475: fix linter error
lapenna-bjss Jan 29, 2026
afa5e89
CCM-13475: address comments
lapenna-bjss Feb 2, 2026
68c168d
Merge branch 'main' into feature/CCM-13475_send_print_events
lapenna-bjss Feb 2, 2026
7c876f9
CCM-13475: resolve fast-xml-parser security vulnerability
lapenna-bjss Feb 2, 2026
c161303
CCM-13475: Add eslint-disable sonarjs/hardcoded-secret-signatures in …
lapenna-bjss Feb 2, 2026
3aa0779
CCM-13475: Add max_receive_count to print-sender queue
lapenna-bjss Feb 2, 2026
6a07f96
CCM-13475: Revert package-lock.json changes in docs/
lapenna-bjss Feb 2, 2026
98357d3
CCM-13475: remove unused constant
lapenna-bjss Feb 9, 2026
d8cdf93
Merge branch 'main' into feature/CCM-13475_send_print_events
lapenna-bjss Feb 9, 2026
5a19130
Merge branch 'main' into feature/CCM-13475_send_print_events
lapenna-bjss Feb 10, 2026
e6eb58e
CCM-13475: add statement condition
lapenna-bjss Feb 10, 2026
0539218
CCM-13475: fix statement condition
lapenna-bjss Feb 10, 2026
bd36eda
CCM-13475: fix statement condition
lapenna-bjss Feb 11, 2026
0283e7d
Merge branch 'main' into feature/CCM-13475_send_print_events
lapenna-bjss Feb 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions infrastructure/terraform/components/dl/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ No requirements.
| <a name="input_apim_base_url"></a> [apim\_base\_url](#input\_apim\_base\_url) | The URL used to send requests to PDM | `string` | `"https://int.api.service.nhs.uk"` | no |
| <a name="input_apim_keygen_schedule"></a> [apim\_keygen\_schedule](#input\_apim\_keygen\_schedule) | Schedule to refresh key pairs if necessary | `string` | `"cron(0 14 * * ? *)"` | no |
| <a name="input_aws_account_id"></a> [aws\_account\_id](#input\_aws\_account\_id) | The AWS Account ID (numeric) | `string` | n/a | yes |
| <a name="input_aws_account_type"></a> [aws\_account\_type](#input\_aws\_account\_type) | The AWS Account Type | `string` | n/a | yes |
| <a name="input_component"></a> [component](#input\_component) | The variable encapsulating the name of this component | `string` | `"dl"` | no |
| <a name="input_core_notify_url"></a> [core\_notify\_url](#input\_core\_notify\_url) | The URL used to send requests to Notify | `string` | `"https://sandbox.api.service.nhs.uk"` | no |
| <a name="input_default_cloudwatch_event_bus_name"></a> [default\_cloudwatch\_event\_bus\_name](#input\_default\_cloudwatch\_event\_bus\_name) | The name of the default cloudwatch event bus. This is needed as GuardDuty Scan Result events are sent to the default bus | `string` | `"default"` | no |
Expand All @@ -22,6 +23,8 @@ No requirements.
| <a name="input_enable_mock_mesh"></a> [enable\_mock\_mesh](#input\_enable\_mock\_mesh) | Enable mock mesh access (dev only). Grants lambda permission to read mock-mesh prefix in non-pii bucket. | `bool` | `false` | no |
| <a name="input_enable_pdm_mock"></a> [enable\_pdm\_mock](#input\_enable\_pdm\_mock) | Flag indicating whether to deploy PDM mock API (should be false in production environments) | `bool` | `true` | no |
| <a name="input_environment"></a> [environment](#input\_environment) | The name of the tfscaffold environment | `string` | n/a | yes |
| <a name="input_eventpub_control_plane_bus_arn"></a> [eventpub\_control\_plane\_bus\_arn](#input\_eventpub\_control\_plane\_bus\_arn) | Event publisher control plane | `string` | n/a | yes |
| <a name="input_eventpub_data_plane_bus_arn"></a> [eventpub\_data\_plane\_bus\_arn](#input\_eventpub\_data\_plane\_bus\_arn) | Event publisher data plane | `string` | n/a | yes |
| <a name="input_force_destroy"></a> [force\_destroy](#input\_force\_destroy) | Flag to force deletion of S3 buckets | `bool` | `false` | no |
| <a name="input_force_lambda_code_deploy"></a> [force\_lambda\_code\_deploy](#input\_force\_lambda\_code\_deploy) | If the lambda package in s3 has the same commit id tag as the terraform build branch, the lambda will not update automatically. Set to True if making changes to Lambda code from on the same commit for example during development | `bool` | `false` | no |
| <a name="input_group"></a> [group](#input\_group) | The group variables are being inherited from (often synonmous with account short-name) | `string` | n/a | yes |
Expand All @@ -45,6 +48,7 @@ No requirements.
| Name | Source | Version |
|------|--------|---------|
| <a name="module_core_notifier"></a> [core\_notifier](#module\_core\_notifier) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
| <a name="module_eventpub"></a> [eventpub](#module\_eventpub) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.30/terraform-eventpub.zip | n/a |
| <a name="module_file_scanner"></a> [file\_scanner](#module\_file\_scanner) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
| <a name="module_kms"></a> [kms](#module\_kms) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.24/terraform-kms.zip | n/a |
| <a name="module_lambda_apim_key_generation"></a> [lambda\_apim\_key\_generation](#module\_lambda\_apim\_key\_generation) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
Expand All @@ -57,6 +61,7 @@ No requirements.
| <a name="module_pdm_poll"></a> [pdm\_poll](#module\_pdm\_poll) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
| <a name="module_pdm_uploader"></a> [pdm\_uploader](#module\_pdm\_uploader) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
| <a name="module_print_analyser"></a> [print\_analyser](#module\_print\_analyser) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
| <a name="module_print_sender"></a> [print\_sender](#module\_print\_sender) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
| <a name="module_print_status_handler"></a> [print\_status\_handler](#module\_print\_status\_handler) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
| <a name="module_report_event_transformer"></a> [report\_event\_transformer](#module\_report\_event\_transformer) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
| <a name="module_report_scheduler"></a> [report\_scheduler](#module\_report\_scheduler) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
Expand All @@ -76,6 +81,7 @@ No requirements.
| <a name="module_sqs_pdm_poll"></a> [sqs\_pdm\_poll](#module\_sqs\_pdm\_poll) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.30/terraform-sqs.zip | n/a |
| <a name="module_sqs_pdm_uploader"></a> [sqs\_pdm\_uploader](#module\_sqs\_pdm\_uploader) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.30/terraform-sqs.zip | n/a |
| <a name="module_sqs_print_analyser"></a> [sqs\_print\_analyser](#module\_sqs\_print\_analyser) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.30/terraform-sqs.zip | n/a |
| <a name="module_sqs_print_sender"></a> [sqs\_print\_sender](#module\_sqs\_print\_sender) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.30/terraform-sqs.zip | n/a |
| <a name="module_sqs_print_status_handler"></a> [sqs\_print\_status\_handler](#module\_sqs\_print\_status\_handler) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.30/terraform-sqs.zip | n/a |
| <a name="module_sqs_scanner"></a> [sqs\_scanner](#module\_sqs\_scanner) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.30/terraform-sqs.zip | n/a |
| <a name="module_sqs_ttl"></a> [sqs\_ttl](#module\_sqs\_ttl) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.30/terraform-sqs.zip | n/a |
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
resource "aws_cloudwatch_event_rule" "letter_prepared" {
name = "${local.csi}-letter-prepared"
description = "Letter prepared event rule"
event_bus_name = aws_cloudwatch_event_bus.main.name

event_pattern = jsonencode({
"detail" : {
"type" : [
"uk.nhs.notify.letter-rendering.letter-request.prepared.v1"
],
}
})
}

resource "aws_cloudwatch_event_target" "letter-prepared-main-bus-target" {
rule = aws_cloudwatch_event_rule.letter_prepared.name
arn = module.eventpub.sns_topic.arn
event_bus_name = aws_cloudwatch_event_bus.main.name

input_path = "$.detail"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
resource "aws_cloudwatch_event_rule" "pdf_analysed" {
name = "${local.csi}-pdf-analysed"
description = "PDF Analysed event rule"
event_bus_name = aws_cloudwatch_event_bus.main.name

event_pattern = jsonencode({
"detail" : {
"type" : [
"uk.nhs.notify.digital.letters.print.pdf.analysed.v1"
],
}
})
}

resource "aws_cloudwatch_event_target" "pdf-analysed-print-sender-target" {
rule = aws_cloudwatch_event_rule.pdf_analysed.name
arn = module.sqs_print_sender.sqs_queue_arn
event_bus_name = aws_cloudwatch_event_bus.main.name
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
resource "aws_lambda_event_source_mapping" "print_sender_lambda" {
event_source_arn = module.sqs_print_sender.sqs_queue_arn
function_name = module.print_sender.function_name
batch_size = var.queue_batch_size
maximum_batching_window_in_seconds = var.queue_batch_window_seconds

function_response_types = [
"ReportBatchItemFailures"
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
module "print_sender" {
source = "https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip"

function_name = "print-sender"
description = "A function to trigger letter prints"

aws_account_id = var.aws_account_id
component = local.component
environment = var.environment
project = var.project
region = var.region
group = var.group

log_retention_in_days = var.log_retention_in_days
kms_key_arn = module.kms.key_arn

iam_policy_document = {
body = data.aws_iam_policy_document.print_sender_lambda.json
}

function_s3_bucket = local.acct.s3_buckets["lambda_function_artefacts"]["id"]
function_code_base_path = local.aws_lambda_functions_dir_path
function_code_dir = "print-sender-lambda/dist"
function_include_common = true
handler_function_name = "handler"
runtime = "nodejs22.x"
memory = 128
timeout = 60
log_level = var.log_level

force_lambda_code_deploy = var.force_lambda_code_deploy
enable_lambda_insights = false

log_destination_arn = local.log_destination_arn
log_subscription_role_arn = local.acct.log_subscription_role_arn

lambda_env_vars = {
"EVENT_PUBLISHER_EVENT_BUS_ARN" = aws_cloudwatch_event_bus.main.arn
"EVENT_PUBLISHER_DLQ_URL" = module.sqs_event_publisher_errors.sqs_queue_url
"ENVIRONMENT" = var.environment
"ACCOUNT_TYPE" = var.aws_account_type
}
}

data "aws_iam_policy_document" "print_sender_lambda" {
statement {
sid = "PutEvents"
effect = "Allow"

actions = [
"events:PutEvents",
]

resources = [
aws_cloudwatch_event_bus.main.arn,
]
}

statement {
sid = "SQSPermissionsPrintSenderQueue"
effect = "Allow"

actions = [
"sqs:ReceiveMessage",
"sqs:DeleteMessage",
"sqs:GetQueueAttributes",
"sqs:GetQueueUrl",
]

resources = [
module.sqs_print_sender.sqs_queue_arn,
]
}

statement {
sid = "SQSPermissionsEventPublisherDLQ"
effect = "Allow"

actions = [
"sqs:SendMessage",
"sqs:SendMessageBatch",
]

resources = [
module.sqs_event_publisher_errors.sqs_queue_arn,
]
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
module "sqs_print_sender" {
source = "https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.30/terraform-sqs.zip"

aws_account_id = var.aws_account_id
component = local.component
environment = var.environment
project = var.project
region = var.region
name = "print-sender"

sqs_kms_key_arn = module.kms.key_arn

visibility_timeout_seconds = 60

create_dlq = true
max_receive_count = 1

sqs_policy_overload = data.aws_iam_policy_document.sqs_print_sender.json
}

data "aws_iam_policy_document" "sqs_print_sender" {
statement {
sid = "AllowEventBridgeToSendMessage"
effect = "Allow"

principals {
type = "Service"
identifiers = ["events.amazonaws.com"]
}

actions = [
"sqs:SendMessage"
]

resources = [
"arn:aws:sqs:${var.region}:${var.aws_account_id}:${local.csi}-print-sender-queue"
]

condition {
test = "ArnEquals"
variable = "aws:SourceArn"
values = [aws_cloudwatch_event_rule.pdf_analysed.arn]
}
}
}
61 changes: 61 additions & 0 deletions infrastructure/terraform/components/dl/modules_eventpub.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
module "eventpub" {
source = "https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.30/terraform-eventpub.zip"

name = "eventpub"

aws_account_id = var.aws_account_id
component = var.component
environment = var.environment
project = var.project
region = var.region
group = var.group

default_tags = local.default_tags

kms_key_arn = module.kms.key_arn
log_retention_in_days = var.log_retention_in_days
log_level = var.log_level

force_destroy = var.force_destroy

event_cache_buffer_interval = 500
enable_sns_delivery_logging = true
sns_success_logging_sample_percent = 0

event_cache_expiry_days = 30
enable_event_cache = true

data_plane_bus_arn = var.eventpub_data_plane_bus_arn
control_plane_bus_arn = var.eventpub_control_plane_bus_arn
}

resource "aws_sns_topic_policy" "eventbridge_publish" {
arn = module.eventpub.sns_topic.arn
policy = data.aws_iam_policy_document.sns_publish.json
}

data "aws_iam_policy_document" "sns_publish" {
statement {
sid = "AllowEventBridgePublish"
effect = "Allow"

principals {
type = "Service"
identifiers = ["events.amazonaws.com"]
}

actions = [
"sns:Publish"
]

resources = [
module.eventpub.sns_topic.arn
]

condition {
test = "ArnEquals"
variable = "aws:SourceArn"
values = [aws_cloudwatch_event_rule.letter_prepared.arn]
}
}
}
15 changes: 15 additions & 0 deletions infrastructure/terraform/components/dl/variables.tf
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,21 @@ variable "enable_pdm_mock" {
default = true
}

variable "aws_account_type" {
type = string
description = "The AWS Account Type"
}

variable "eventpub_control_plane_bus_arn" {
type = string
description = "Event publisher control plane"
}

variable "eventpub_data_plane_bus_arn" {
type = string
description = "Event publisher data plane"
}

variable "report_scheduler_schedule" {
type = string
description = "Schedule to trigger sender reports"
Expand Down
5 changes: 5 additions & 0 deletions lambdas/print-sender-lambda/jest.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { baseJestConfig } from '../../jest.config.base';

const config = baseJestConfig;

export default config;
24 changes: 24 additions & 0 deletions lambdas/print-sender-lambda/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{
"dependencies": {
"@nhsdigital/nhs-notify-event-schemas-letter-rendering": "^1.1.5",
"digital-letters-events": "^0.0.1",
"utils": "^0.0.1"
},
"devDependencies": {
"@tsconfig/node22": "^22.0.2",
"@types/aws-lambda": "^8.10.155",
"@types/jest": "^29.5.14",
"jest": "^29.7.0",
"typescript": "^5.9.3"
},
"name": "nhs-notify-digital-letters-print-sender-lambda",
"private": true,
"scripts": {
"lambda-build": "rm -rf dist && npx esbuild --bundle --minify --sourcemap --target=es2020 --platform=node --loader:.node=file --entry-names=[name] --outdir=dist src/index.ts",
"lint": "eslint .",
"lint:fix": "eslint . --fix",
"test:unit": "jest",
"typecheck": "tsc --noEmit"
},
"version": "0.0.1"
}
Loading
Loading