Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 2 additions & 0 deletions infrastructure/terraform/modules/backend-api/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ No requirements.
| <a name="module_delete_template_lambda"></a> [delete\_template\_lambda](#module\_delete\_template\_lambda) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
| <a name="module_generate_letter_proof_lambda"></a> [generate\_letter\_proof\_lambda](#module\_generate\_letter\_proof\_lambda) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/3.0.6/terraform-lambda.zip | n/a |
| <a name="module_get_client_lambda"></a> [get\_client\_lambda](#module\_get\_client\_lambda) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
| <a name="module_get_contact_details_lambda"></a> [get\_contact\_details\_lambda](#module\_get\_contact\_details\_lambda) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/3.1.6/terraform-lambda.zip | n/a |
| <a name="module_get_letter_variant_lambda"></a> [get\_letter\_variant\_lambda](#module\_get\_letter\_variant\_lambda) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/3.0.6/terraform-lambda.zip | n/a |
| <a name="module_get_routing_config_lambda"></a> [get\_routing\_config\_lambda](#module\_get\_routing\_config\_lambda) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
| <a name="module_get_routing_configs_by_template_id_lambda"></a> [get\_routing\_configs\_by\_template\_id\_lambda](#module\_get\_routing\_configs\_by\_template\_id\_lambda) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
Expand All @@ -68,6 +69,7 @@ No requirements.
| <a name="module_lambda_sftp_poll"></a> [lambda\_sftp\_poll](#module\_lambda\_sftp\_poll) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
| <a name="module_lambda_sftp_request_proof"></a> [lambda\_sftp\_request\_proof](#module\_lambda\_sftp\_request\_proof) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
| <a name="module_lambda_validate_letter_template_files"></a> [lambda\_validate\_letter\_template\_files](#module\_lambda\_validate\_letter\_template\_files) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
| <a name="module_list_contact_details_lambda"></a> [list\_contact\_details\_lambda](#module\_list\_contact\_details\_lambda) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/3.1.6/terraform-lambda.zip | n/a |
| <a name="module_list_routing_configs_lambda"></a> [list\_routing\_configs\_lambda](#module\_list\_routing\_configs\_lambda) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
| <a name="module_list_template_lambda"></a> [list\_template\_lambda](#module\_list\_template\_lambda) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
| <a name="module_patch_template_lambda"></a> [patch\_template\_lambda](#module\_patch\_template\_lambda) | https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/v2.0.29/terraform-lambda.zip | n/a |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,11 +60,13 @@ data "aws_iam_policy_document" "api_gateway_execution_policy" {
module.delete_template_lambda.function_arn,
module.generate_letter_proof_lambda.function_arn,
module.get_client_lambda.function_arn,
module.get_contact_details_lambda.function_arn,
module.get_letter_variant_lambda.function_arn,
module.get_routing_config_lambda.function_arn,
module.get_routing_configs_by_template_id_lambda.function_arn,
module.get_template_lambda.function_arn,
module.get_template_letter_variants_lambda.function_arn,
module.list_contact_details_lambda.function_arn,
module.list_routing_configs_lambda.function_arn,
module.list_template_lambda.function_arn,
module.patch_template_lambda.function_arn,
Expand Down
2 changes: 2 additions & 0 deletions infrastructure/terraform/modules/backend-api/locals.tf
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,13 @@ locals {
DELETE_TEMPLATE_LAMBDA_ARN = module.delete_template_lambda.function_arn
GENERATE_LETTER_PROOF_LAMBDA_ARN = module.generate_letter_proof_lambda.function_arn
GET_CLIENT_LAMBDA_ARN = module.get_client_lambda.function_arn
GET_CONTACT_DETAILS_LAMBDA_ARN = module.get_contact_details_lambda.function_arn
GET_LETTER_VARIANT_LAMBDA_ARN = module.get_letter_variant_lambda.function_arn
GET_ROUTING_CONFIG_LAMBDA_ARN = module.get_routing_config_lambda.function_arn
GET_ROUTING_CONFIGS_BY_TEMPLATE_ID_LAMBDA_ARN = module.get_routing_configs_by_template_id_lambda.function_arn
GET_TEMPLATE_LAMBDA_ARN = module.get_template_lambda.function_arn
GET_TEMPLATE_LETTER_VARIANTS_LAMBDA_ARN = module.get_template_letter_variants_lambda.function_arn
LIST_CONTACT_DETAILS_LAMBDA_ARN = module.list_contact_details_lambda.function_arn
LIST_ROUTING_CONFIGS_LAMBDA_ARN = module.list_routing_configs_lambda.function_arn
LIST_TEMPLATES_LAMBDA_ARN = module.list_template_lambda.function_arn
PATCH_TEMPLATE_LAMBDA_ARN = module.patch_template_lambda.function_arn
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
module "get_contact_details_lambda" {
source = "https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/3.1.6/terraform-lambda.zip"

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

kms_key_arn = var.kms_key_arn

function_name = "get-contact-details"

function_module_name = "get-contact-details"
handler_function_name = "handler"
description = "Retrieve contact details by ID"

memory = 2048
timeout = 20
runtime = "nodejs22.x"

log_retention_in_days = var.log_retention_in_days
iam_policy_document = {
body = data.aws_iam_policy_document.get_contact_details.json
}

lambda_env_vars = local.backend_lambda_environment_variables
function_s3_bucket = var.function_s3_bucket
function_code_base_path = local.lambdas_dir
function_code_dir = "backend-api/dist/get-contact-details"

send_to_firehose = var.send_to_firehose
log_destination_arn = var.log_destination_arn
log_subscription_role_arn = var.log_subscription_role_arn
}

data "aws_iam_policy_document" "get_contact_details" {
statement {
sid = "AllowContactDetailsRead"
effect = "Allow"

actions = [
"dynamodb:Query"
]

resources = [
"${aws_dynamodb_table.contact_details.arn}/index/ById",
]
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
module "list_contact_details_lambda" {
source = "https://github.com/NHSDigital/nhs-notify-shared-modules/releases/download/3.1.6/terraform-lambda.zip"

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

kms_key_arn = var.kms_key_arn

function_name = "list-contact-details"

function_module_name = "list-contact-details"
handler_function_name = "handler"
description = "API endpoint for retrieving a list of contact details for the authenticated user, filterable by status and type"

memory = 2048
timeout = 20
runtime = "nodejs22.x"

log_retention_in_days = var.log_retention_in_days
iam_policy_document = {
body = data.aws_iam_policy_document.list_contact_details.json
}

lambda_env_vars = local.backend_lambda_environment_variables
function_s3_bucket = var.function_s3_bucket
function_code_base_path = local.lambdas_dir
function_code_dir = "backend-api/dist/list-contact-details"

send_to_firehose = var.send_to_firehose
log_destination_arn = var.log_destination_arn
log_subscription_role_arn = var.log_subscription_role_arn
}

data "aws_iam_policy_document" "list_contact_details" {
statement {
sid = "AllowContactDetailsRead"
effect = "Allow"

actions = [
"dynamodb:Query"
]

resources = [aws_dynamodb_table.contact_details.arn]
}
}
154 changes: 153 additions & 1 deletion infrastructure/terraform/modules/backend-api/spec.tmpl.json
Original file line number Diff line number Diff line change
Expand Up @@ -488,7 +488,6 @@
}
},
"required": [
"clientId",
"id",
"status"
],
Expand Down Expand Up @@ -551,6 +550,24 @@
],
"type": "object"
},
"ContactDetailSuccessList": {
"properties": {
"data": {
"items": {
"$ref": "#/components/schemas/ContactDetail"
},
"type": "array"
},
"statusCode": {
"type": "integer"
}
},
"required": [
"data",
"statusCode"
],
"type": "object"
},
"ContactDetailType": {
"enum": [
"EMAIL",
Expand Down Expand Up @@ -1580,6 +1597,76 @@
}
},
"/v1/contact-details": {
"get": {
"description": "Get a list of contact details for the authenticated user, filterable by status and type",
"parameters": [
{
"description": "Filter by contact detail status",
"in": "query",
"name": "status",
"schema": {
"$ref": "#/components/schemas/ContactDetailStatus"
}
},
{
"description": "Filter by contact detail type",
"in": "query",
"name": "type",
"schema": {
"$ref": "#/components/schemas/ContactDetailType"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ContactDetailSuccessList"
}
}
},
"description": "List of contact details",
"headers": {
"Content-Type": {
"schema": {
"type": "string"
}
}
}
},
"default": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Failure"
}
}
},
"description": "Error"
}
},
"security": [
{
"authorizer": []
}
],
"summary": "Get a list of contact details for the authenticated user, filterable by status and type",
"x-amazon-apigateway-integration": {
"contentHandling": "CONVERT_TO_TEXT",
"credentials": "${APIG_EXECUTION_ROLE_ARN}",
"httpMethod": "POST",
"passthroughBehavior": "WHEN_NO_TEMPLATES",
"responses": {
".*": {
"statusCode": "200"
}
},
"timeoutInMillis": 29000,
"type": "AWS_PROXY",
"uri": "arn:aws:apigateway:${AWS_REGION}:lambda:path/2015-03-31/functions/${LIST_CONTACT_DETAILS_LAMBDA_ARN}/invocations"
}
},
"post": {
"description": "Add new unverified contact details and send an OTP for verification",
"requestBody": {
Expand Down Expand Up @@ -1642,6 +1729,71 @@
}
}
},
"/v1/contact-details/{contactDetailId}": {
"get": {
"description": "Retrieve contact details by ID",
"parameters": [
{
"description": "ID of the contact details",
"in": "path",
"name": "contactDetailId",
"required": true,
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ContactDetailSuccess"
}
}
},
"description": "Returned contact detail",
"headers": {
"Content-Type": {
"schema": {
"type": "string"
}
}
}
},
"default": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Failure"
}
}
},
"description": "Error"
}
},
"security": [
{
"authorizer": []
}
],
"summary": "Retrieve contact details by ID",
"x-amazon-apigateway-integration": {
"contentHandling": "CONVERT_TO_TEXT",
"credentials": "${APIG_EXECUTION_ROLE_ARN}",
"httpMethod": "POST",
"passthroughBehavior": "WHEN_NO_TEMPLATES",
"responses": {
".*": {
"statusCode": "200"
}
},
"timeoutInMillis": 29000,
"type": "AWS_PROXY",
"uri": "arn:aws:apigateway:${AWS_REGION}:lambda:path/2015-03-31/functions/${GET_CONTACT_DETAILS_LAMBDA_ARN}/invocations"
}
}
},
"/v1/docx-letter-template": {
"post": {
"description": "Create a DOCX letter template",
Expand Down
16 changes: 16 additions & 0 deletions lambdas/backend-api/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -301,4 +301,20 @@ curl -X POST --location "${APIG_STAGE}/v1/contact-details" \
--data '{ "type": "SMS", "value": "07890123456" }'
```

### GET - /v1/contact-details - Retrieve a list of contact details for the authenticated user, filterable by status and type

```bash
curl -X GET --location "${APIG_STAGE}/v1/contact-details?type=EMAIL&status=VERIFIED" \
--header "Accept: application/json" \
--header "Authorization: $SANDBOX_TOKEN" \
```

### GET - /v1/contact-details/:contactDetailId - Retrieve contact details by ID

```bash
curl -X GET --location "${APIG_STAGE}/v1/contact-details/${CONTACT_DETAIL_ID}" \
--header "Accept: application/json" \
--header "Authorization: $SANDBOX_TOKEN" \
```

<!-- vale on -->
2 changes: 2 additions & 0 deletions lambdas/backend-api/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,14 @@ npx esbuild \
src/delete-routing-config.ts \
src/forward-initial-render-request.ts \
src/get-client.ts \
src/get-contact-details.ts \
src/get-letter-variant.ts \
src/get-routing-config.ts \
src/get-routing-configs-by-template-id.ts \
src/get-template-letter-variants.ts \
src/get.ts \
src/generate-letter-proof.ts \
src/list-contact-details.ts \
src/list-routing-configs.ts \
src/list.ts \
src/patch-template.ts \
Expand Down
Loading
Loading