From 620e4c997fb5357e447481c07ee3523bbceb38f6 Mon Sep 17 00:00:00 2001 From: Daniel Yip Date: Tue, 3 Feb 2026 12:06:19 +0000 Subject: [PATCH 1/2] Updated READMEs and removed obsolete devtools --- .gitignore | 1 - README.md | 77 ++--- lambdas/delta_backend/README.md | 2 +- lambdas/id_sync/README.md | 4 +- lambdas/recordforwarder/README.md | 10 +- sonar-project.properties | 2 +- utilities/devtools/.gitignore | 4 - utilities/devtools/.terraform.lock.hcl | 10 - utilities/devtools/Makefile | 20 -- utilities/devtools/README.md | 150 ---------- utilities/devtools/__init__.py | 0 utilities/devtools/dynamodb.tf | 63 ---- utilities/devtools/generate_data.py | 93 ------ utilities/devtools/img/relational-model.png | Bin 140896 -> 0 bytes utilities/devtools/localstack-compose.yml | 15 - utilities/devtools/pytest.ini | 6 - utilities/devtools/requirements.txt | 2 - utilities/devtools/sample_event.json | 302 -------------------- utilities/devtools/sample_imms.json | 119 -------- utilities/devtools/seed.py | 66 ----- 20 files changed, 52 insertions(+), 894 deletions(-) delete mode 100644 utilities/devtools/.gitignore delete mode 100644 utilities/devtools/.terraform.lock.hcl delete mode 100644 utilities/devtools/Makefile delete mode 100644 utilities/devtools/README.md delete mode 100644 utilities/devtools/__init__.py delete mode 100644 utilities/devtools/dynamodb.tf delete mode 100644 utilities/devtools/generate_data.py delete mode 100644 utilities/devtools/img/relational-model.png delete mode 100644 utilities/devtools/localstack-compose.yml delete mode 100644 utilities/devtools/pytest.ini delete mode 100644 utilities/devtools/requirements.txt delete mode 100644 utilities/devtools/sample_event.json delete mode 100644 utilities/devtools/sample_imms.json delete mode 100644 utilities/devtools/seed.py diff --git a/.gitignore b/.gitignore index 7879dae0e2..ce9a5b041f 100644 --- a/.gitignore +++ b/.gitignore @@ -29,7 +29,6 @@ openapi.json **/.vscode/**/* !**/.vscode/settings.json.default -devtools/volume/ **/.coverage **/test-results.xml allure-results/ diff --git a/README.md b/README.md index 49c1fc70c4..ad01f7caf8 100644 --- a/README.md +++ b/README.md @@ -14,39 +14,49 @@ See https://nhsd-confluence.digital.nhs.uk/display/APM/Glossary. **Note:** Each Lambda has its own `README.md` file for detailed documentation. For non-Lambda-specific folders, refer to `README.specification.md`. -### Lambdas - -| Folder | Description | -| ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | -| `backend` | **Imms API** – Handles CRUD operations for the Immunisation API. | -| `delta_backend` | **Imms Sync** – Lambda function that reacts to events in the Immunisation database. | -| `ack_backend` | **Imms Batch** – Generates the final Business Acknowledgment (BUSACK) file from processed messages and writes it to the designated S3 location. | -| `filenameprocessor` | **Imms Batch** – Processes batch file names. | -| `mesh_processor` | **Imms Batch** – MESH-specific batch processing functionality. | -| `recordprocessor` | **Imms Batch** – Handles batch record processing. | -| `redis_sync` | **Imms Redis** – Handles sync s3 to REDIS. | -| `id_sync` | **Imms Redis** – Handles sync SQS to IEDS. | -| `shared` | **Imms Redis** – Not a lambda but Shared Code for lambdas | +### Lambdas (compute microservices) + +| Folder | Description | +| ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ack_backend` | **Imms Batch** – Generates the final Business Acknowledgment (BUSACK) file from processed messages and writes it to the designated destination. | +| `backend` | **Imms API** – Handles CRUD operations for the Immunisation API. | +| `batch_processor_filter` | **Imms Batch** – Controller function that consumes from a queue and forwards file event for processing if filter conditions are met. | +| `delta_backend` | **Imms Sync** – Lambda function that reacts to events in the Immunisation Event Data Store (IEDS). | +| `filenameprocessor` | **Imms Batch** – Validates and processes new batch file events. | +| `id_sync` | **Imms Cross-cutting** – Handles [MNS](https://digital.nhs.uk/developer/api-catalogue/multicast-notification-service) NHS Number Change events and applies updates to affected records. | +| `mesh_processor` | **Imms Batch** – Triggered when new files our received via MESH. Moves them into the Imms Batch processing system. | +| `mns_subscription` | **Imms Cross-cutting** – Simple helper Lambda which sets up our required MNS subscription. Used in pipelines in DEV. | +| `recordforwarder` | **Imms Batch** – Consumes from the stream and applies the processed batch file row operations (CUD) to IEDS. | +| `recordprocessor` | **Imms Batch** – ECS Task - **not** a Lambda function - responsible for processing batch file rows and forwarding to the stream. | +| `redis_sync` | **Imms Cross-cutting** – Handles config file updates. E.g. disease mapping or permission files. | +| `shared` | **Imms Cross-cutting** – Shared `common` code that can be shared by other Lambda functions. This is not a standalone Lambda. | --- ### Pipelines -| Folder | Description | -| ------- | ------------------------------------------- | -| `azure` | Pipeline definition and orchestration code. | +Due to the timing of the project's inception, Azure pipelines have been inherited from the API Management team for deploying +the Apigee proxy and sandbox. The new way to manage and deploy said resources is [Proxygen](https://digital.nhs.uk/developer/api-catalogue/proxy-generator). + +In future a migration plan will be provided by the API Management team so we can move to the new process and use purely +GitHub Actions for our entire pipeline + +| Folder | Description | +| --------- | ------------------------------------------------------------------------------------------------------------------------------- | +| `azure` | Pipeline definition and orchestration code concerned purely with the management and deployment of the Apigee proxy and sandbox. | +| `.github` | Pipeline definition and orchestration code for deploying and testing our backend project. | --- ### Infrastructure -| Folder | Description | -| ---------------------- | ------------------------------------------------------------------------------------------------------ | -| `account` | Base infrastructure components. | -| `grafana` | Terraform configuration for Grafana, built on top of core infra. | -| `instance` | Core Terraform infrastructure code. This is run in each PR and sets up lambdas associated with the PR. | -| `terraform_aws_backup` | Streamlined backup processing with AWS. | -| `proxies` | Apigee API proxy definitions. | +| Folder | Description | +| ---------------------- | ---------------------------------------------------------------- | +| `account` | Base infrastructure components deployed on a per account basis. | +| `grafana` | Terraform configuration for Grafana, built on top of core infra. | +| `instance` | Core Terraform app infrastructure. | +| `terraform_aws_backup` | Streamlined backup processing with AWS. | +| `proxies` | Apigee API proxy definitions. | --- @@ -60,13 +70,12 @@ See https://nhsd-confluence.digital.nhs.uk/display/APM/Glossary. ### Utilities -| Folder | Description | -| ---------------- | ------------------------------------------------------------- | -| `devtools` | Helper tools and utilities for local development | -| `quality_checks` | Dependencies for linting and formatting Python code | -| `scripts` | Standalone or reusable scripts for development and automation | -| `specification` | Specification files to document API and related definitions | -| `sandbox` | Simple sandbox API | +| Folder | Description | +| ------------------- | ------------------------------------------------------------- | +| `quality_checks` | Dependencies for linting and formatting Python code | +| `utilities/scripts` | Standalone or reusable scripts for development and automation | +| `specification` | Specification files to document API and related definitions | +| `sandbox` | Simple sandbox API | --- @@ -268,11 +277,3 @@ run a different set of tests. To do this: Please note that this project requires that all commits are verified using a GPG key. To set up a GPG key please follow the instructions specified here: https://docs.github.com/en/authentication/managing-commit-signature-verification - -## AWS configuration: Getting credentials for AWS federated user account - -In the 'Access keys' popup menu under AWS Access Portal: - -**NOTE** that AWS's 'Recommended' method of getting credentials **(AWS IAM Identity Center credentials)** will break mocking in unit tests; specifically any tests calling `dynamodb_client.create_table()` will fail with `botocore.errorfactory.ResourceInUseException: Table already exists`. - -Instead, use **Option 2 (Add a profile to your AWS credentials file)**. diff --git a/lambdas/delta_backend/README.md b/lambdas/delta_backend/README.md index a2ae4da482..5745590f94 100644 --- a/lambdas/delta_backend/README.md +++ b/lambdas/delta_backend/README.md @@ -8,7 +8,7 @@ This project is designed to convert FHIR-compliant JSON data (e.g., Immunization | File Name | What It Does | | --------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | -| **`converter.py`** | 🧠 The main brain — applies the schema, runs conversions, handles errors. | +| **`converter.py`** | The main brain — applies the schema, runs conversions, handles errors. | | **`conversion_layout.py`** | A plain Python list that defines which fields you want, and how they should be formatted (e.g. date format, renaming rules). | | **`delta.py`** | Holds the function called by AWS Lambda | | **`extractor.py`** | Tailored functionality to extract target fields from immunization record received by the delta handler. | diff --git a/lambdas/id_sync/README.md b/lambdas/id_sync/README.md index cdb5da7891..9398bfa566 100644 --- a/lambdas/id_sync/README.md +++ b/lambdas/id_sync/README.md @@ -2,12 +2,12 @@ ## Overview -**Id Sync** is an AWS Lambda function designed to trigger from SQS. It receives a list of NHS Numbers and checks for changes in PDS. If change found, it updates the Events Table.. +**Id Sync** is an AWS Lambda function designed to trigger from SQS. It receives a list of NHS Numbers and checks for changes in PDS. If change found, it updates the Events Table. ## Features - **SQS Event Driven:** Automatically triggered by SQS event. -- **DynamoDb Integration:** Reviews contents of DynbamoDb Events table and updates where required.. +- **DynamoDb Integration:** Reviews contents of DynamoDb Events table and updates where required. - **Logging:** Provides detailed logging for monitoring and troubleshooting. ## How It Works diff --git a/lambdas/recordforwarder/README.md b/lambdas/recordforwarder/README.md index d537ac6954..e68abcf609 100644 --- a/lambdas/recordforwarder/README.md +++ b/lambdas/recordforwarder/README.md @@ -1,6 +1,14 @@ # About -This document describes the environment setup for the recordforwarder Lambda. +This document describes the purpose and environment setup for the recordforwarder Lambda. + +## Overview + +The Record Forwarder Lambda consumes from an AWS Kinesis Stream, and is responsible for applying updates to the Immunisation +Event Data Store. It will receive up to 100 records per batch. Each record will have been processed and formatted as a +FHIR Immunization by the ECS Record Processor in the prior batch step. + +The Record Forwarded Lambda will then execute the requested operation (Create, Update or Delete) on the given record. ## Setting up the recordforwarder lambda diff --git a/sonar-project.properties b/sonar-project.properties index 6e7479ae02..0c41e33275 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -3,7 +3,7 @@ sonar.projectKey=NHSDigital_immunisation-fhir-api sonar.organization=nhsdigital sonar.host.url=https://sonarcloud.io sonar.python.version=3.11 -sonar.exclusions=**/devtools/**,**/proxies/**,**/utilities/scripts/**,**/infrastructure/account/**,**/infrastructure/instance/**,**/infrastructure/grafana/**,**/terraform_aws_backup/**,**/tests/** +sonar.exclusions=**/proxies/**,**/utilities/scripts/**,**/infrastructure/account/**,**/infrastructure/instance/**,**/infrastructure/grafana/**,**/terraform_aws_backup/**,**/tests/** sonar.coverage.exclusions=lambdas/shared/src/common/models/batch_constants.py sonar.python.coverage.reportPaths=backend-coverage.xml,delta-coverage.xml,ack-lambda-coverage.xml,filenameprocessor-coverage.xml,recordforwarder-coverage.xml,recordprocessor-coverage.xml,mesh_processor-coverage.xml,redis_sync-coverage.xml,mns_subscription-coverage.xml,id_sync-coverage.xml,shared-coverage.xml,batchprocessorfilter-coverage.xml sonar.cpd.exclusions=**/Dockerfile diff --git a/utilities/devtools/.gitignore b/utilities/devtools/.gitignore deleted file mode 100644 index f9dd0525f7..0000000000 --- a/utilities/devtools/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -docker -*.iml -sample_data -test_* diff --git a/utilities/devtools/.terraform.lock.hcl b/utilities/devtools/.terraform.lock.hcl deleted file mode 100644 index f301f9b2c3..0000000000 --- a/utilities/devtools/.terraform.lock.hcl +++ /dev/null @@ -1,10 +0,0 @@ -# This file is maintained automatically by "terraform init". -# Manual edits may be lost in future updates. - -provider "registry.terraform.io/hashicorp/aws" { - version = "5.22.0" - constraints = "~> 5.0" - hashes = [ - "h1:XuU3tsGzElMt4Ti8SsM05pFllNMwSC4ScUxcfsOS140=", - ] -} diff --git a/utilities/devtools/Makefile b/utilities/devtools/Makefile deleted file mode 100644 index ff559dbc92..0000000000 --- a/utilities/devtools/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -test: - python -m unittest - -init: - terraform init -apply: - terraform apply -auto-approve - -delete-table: - aws dynamodb delete-table --no-cli-pager --table-name imms-default-imms-events --region us-east-1 --endpoint-url http://localhost:4566 || true -gen_data: - python generate_data.py -seed: delete-table apply gen_data - # seed database with the latest file that was added to the sample_data directory - python seed.py sample_data/$(shell ls -t sample_data | head -n1) - -localstack: - docker run -d --rm -it -p 4566:4566 -p 4510-4559:4510-4559 localstack/localstack:latest - -.PHONY: test test-debug localstack apply init diff --git a/utilities/devtools/README.md b/utilities/devtools/README.md deleted file mode 100644 index 0c78e979e7..0000000000 --- a/utilities/devtools/README.md +++ /dev/null @@ -1,150 +0,0 @@ -# Devtools - Localstack - -## About - -LocalStack is a fully functional local cloud service emulator that allows developers to run AWS services locally without connecting to the actual AWS cloud. It is especially useful for testing, development, and CI/CD pipelines where real AWS resources are not needed or too costly. - -## Setup: - -1. Install aws cli & awslocal (for localstack) for local testing of the infrastructure, might need to install unzip. AWSLocal is a wrapper for aws that simplifies interaction with LocalStack. - - ``` - curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" - unzip awscliv2.zip - sudo ./aws/install - - pip install awscli-local - ``` - -2. Install terraform by following the instructions from `https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli` - -3. Navigate to `devtools`. -4. Create a virtual environment in devtools: `python -m venv .venv`. -5. Activate virtual environment: `source .venv/bin/activate`. You should see a `(.venv)` as a prefix in your terminal. -6. Upgrade pip in the new environment: `pip install --upgrade pip`. -7. Run `pip install -r requirements.txt` to install packages. -8. Run `make localstack` to setup localstack to run in docker. -9. Run `make init` or `terraform init`. If you get an error about failing to install providers, then remove the `.terraform.lock.hcl` and try again. -10. Run `make seed` to create a dynamodb table in localstack and add some data into it. -11. Run the following command to get a list of 10 items from dynamodb from localstack: - ``` - awslocal dynamodb query \ - --table-name imms-default-imms-events \ - --key-condition-expression "PK = :pk" \ - --expression-attribute-values '{":pk": {"S": "Immunization#e3e70682-c209-4cac-629f-6fbed82c07cd"}}'. - ``` -12. If you want to delete the table run `terraform apply -destroy` - -## Interacting with localstack - -The idea with localstack in regards to our project is to have a dynamodb table or an s3 bucket to interact with. We can't setup all the infrastructure on localstack because of the high complexity and lack of certain features such as AWS networking and IAM enforcement. - -1. Check if localstack is running in docker by calling: `docker ps`. The output should display a running container with the image localstack/localstack -2. Ensure that you have a dynamodb table set up and some data inside the table provided by the `make seed` command. -3. You can install dynamodb-admin which is npm web app that connects to localstack, to set it up: - - ``` - npm install -g dynamodb-admin - - export DYNAMO_ENDPOINT=http://localhost:4566 - export AWS_REGION=us-east-1 - - dynamodb-admin - - # Navigate to the url provided, typically: http://localhost:8001/ where you should see the table imms-default-imms-events - ``` - -4. To interact with the code there are 2 options. You can either persist the application lambda via docker or you can directly run / debug the code directly in vscode. Please note some modifications are needed to configure the code to run successfuly. - - 4.1 To run it via vs code, we can try the get_imms_handler, but first we should ensure that the request is correct so ensure that `event` has the folowing details. Note: that we are trying to retrieve the following immunisation record form the sample data `e3e70682-c209-4cac-629f-6fbed82c07cd` hence why we hardcoded the `VaccineTypePermissions`. - - ``` - event = { - "pathParameters": {"id": args.id}, - "headers": { - "Content-Type": "application/x-www-form-urlencoded", - "AuthenticationType": "ApplicationRestricted", - "Permissions": (",".join([Permission.READ])), - "VaccineTypePermissions": "covidcode2:read" - }, - } - ``` - - 4.2 If you want to run it via docker make the following changes in the lambda.Dockerfile: - - Set the dynamo db table name env variable to `imms-default-imms-events` - - Add `ENV DYNAMODB_TABLE_NAME=imms-default-imms-events` into the base section of the file - - Add the following line at the end in the lambda.Dockerfile: `CMD ["get_status_handler.get_status_handler"]` - - Test by sending a request via Postman to `http://localhost:8080/2015-03-31/functions/function/invocations` and add the event data into the body section. - -## Access Pattern - -We receive Immunisation Events in json format via our API. Each message contains inlined resources i.e. it doesn't -contain a reference/link to a preexisting resource. For example, a vaccination event contains the full patient resource -embedded in it. This means our backend doesn't assume Patient as a separate resource but rather, part of the message -itself. This is the same for other resources included in the resource like address, location etc. - -- **Creating an event:** Add the entire message in an attribute so, it can be retrieved. This attribute has the entire - original message with no changes. The event-id must be contained in the message itself. Our backend won't create the - id. **This is our main index.** and it doesn't contain any sort-key -- **Retrieve an event:** The simplest form is by id; `GET /event/{id}`. This access pattern should always result in - either one resource or none -- **Search:** This pattern can be broken down into two main categories. Queries that retrieve events with a known - patient and, queries that retrieve events with particular set of search criteria. - -### Patient - -One index is dedicated to search patient. This will satisfy -the `/event?NhsNumber=1234567,dateOfBirth=01/01/1970,diseaseTypeFilter=covid|flu|mmr|hpv|polio` endpoint. -The `NhsNumber` is our PK and the SK has `##` format. \*\*This means, in order to -filter based on `diseaseType`, `dateOfBirth` must be known. We can filter based on only `nhsNumber` and `diseaseType` -but that requires an attribute filter. - -**Q:** Do we need to retrieve events based on only NHS number and Disease Type? i.e. is this a valid -request? `GET /event?NhsNumber=1234567,diseaseTypeFilter=covid` -**Q:** What is LocalPatient? In our sample data we have both ID and System values, but we don't have any access pattern -for it. - -### Vaccination - -The provided object relational model, has a few highlighted fields related to vaccination but, we don't have any search -criteria for them. We can create one or more indices to address different search requests but, we need to know in -advance what they are. - -For example, one access pattern can be `PK: DiseaseType` and `SK: ##`. This will -be similar to the patient access pattern. - -**Q:** What are search criteria for vaccination related fields? - -## Field mappings - -Given the relational model (below image) and `sample_event.json` below is our field mappings for highlighted fields: -![img](img/relational-model.png) - -- `UNIQUE_ID -> $["identifier"][0]["value"]` -- `UNIQUE_ID_URI -> $["identifier"][0]["system"]` -- `ACTION_FLAG -> ?????` -- `VACCINATION_PROCEDURE_CODE -> $["extension"][0]["valueCodeableConcept"]["coding"][0]["code"]` -- `VACCINATION_PRODUCT_CODE -> $["vaccineCode"]["coding"][0]["code"]` -- `DISEASE_TYPE -> $["protocolApplied"][0]["targetDisease"][0]["coding"][0]["code"]` -- `LOCAL_PATIENT_ID -> $["contained"][0]["item"][3]["answer"][0]["valueCoding"]["code"]` -- `LOCAL_PATIENT_TYPE_URI -> $["contained"][0]["item"][3]["answer"][0]["valueCoding"]["system"]` - -TODO: write the rest of the mappings. - -**Q**: What does this -mean: [[first point in Overview]](https://nhsd-confluence.digital.nhs.uk/display/Vacc/Immunisation+FHIR+API+-+IEDS+Data+Model) - -> This data model must include backwards compatibility with the legacy CSV process to account for business continuity - -## Error Scenarios - -We assume all error responses will be of type `OperationOutcome`. We can break down scenarios in three categories. One -group is errors that are generated and dealt with in the Proxy before reaching to our backend. -Authentication/authorisation errors belong to this group. - -A second group is related to both fine and coarse validation errors. - -- **Q:** What is expected in the response message? A detailed diagnostics of the validation or just a generic error? - -The third group is anything related to the backend itself. `404` and, catch-all exceptions in the source code (like -malformed json for example) diff --git a/utilities/devtools/__init__.py b/utilities/devtools/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/utilities/devtools/dynamodb.tf b/utilities/devtools/dynamodb.tf deleted file mode 100644 index aca0b4ae8d..0000000000 --- a/utilities/devtools/dynamodb.tf +++ /dev/null @@ -1,63 +0,0 @@ -terraform { - required_providers { - aws = { - source = "hashicorp/aws" - version = "~> 5" - } - } - backend "local" { - path = ".terraform/local.tfstate" - } -} - -provider "aws" { - region = "us-east-1" - skip_region_validation = true - - endpoints { - sts = "http://localhost:4566" - dynamodb = "http://localhost:4566" - } -} - -locals { - short_prefix = "imms-default" -} - -resource "aws_dynamodb_table" "events-dynamodb-table" { - name = "${local.short_prefix}-imms-events" - billing_mode = "PAY_PER_REQUEST" - hash_key = "PK" - stream_enabled = true - stream_view_type = "NEW_IMAGE" - - attribute { - name = "PK" - type = "S" - } - attribute { - name = "PatientPK" - type = "S" - } - attribute { - name = "PatientSK" - type = "S" - } - attribute { - name = "IdentifierPK" - type = "S" - } - - global_secondary_index { - name = "PatientGSI" - hash_key = "PatientPK" - range_key = "PatientSK" - projection_type = "ALL" - } - - global_secondary_index { - name = "IdentifierGSI" - hash_key = "IdentifierPK" - projection_type = "ALL" - } -} diff --git a/utilities/devtools/generate_data.py b/utilities/devtools/generate_data.py deleted file mode 100644 index 25562aab07..0000000000 --- a/utilities/devtools/generate_data.py +++ /dev/null @@ -1,93 +0,0 @@ -import copy -import json -import os -import random -import uuid -from datetime import datetime - -# generate reproducible random UUIDs -rd = random.Random() -rd.seed(0) - - -def make_rand_id(): - return uuid.UUID(int=rd.getrandbits(128)) - - -patient_pool = [ - {"nhs_number": "9999999999"}, - {"nhs_number": "1111111111"}, - {"nhs_number": "1212233445"}, -] -suppliers = [ - "https://supplierABC/ODSCode145", - "https://supplierSDF/ODSCode123", - "https://supplierXYZ/ODSCode735", -] -disease_type = ["covid", "flu", "mmr", "hpv", "polio"] -vaccine_code = [ - "covidCode1", - "covidCode2", - "fluCode1", - "fluCode2", - "fluCode3", - "mmrCode1", - "mmrCode2", - "hpvCode1", - "polioCode1", -] -vaccine_procedure = [ - "vac_procedure-oral", - "vac_procedure-injection", - "vac_procedure-123", -] -local_patient_pool = [ - {"code": "ACME-Patient12345", "system": "https://supplierABC/identifiers/patient"}, - {"code": "ACME-Patient23455", "system": "https://supplierCSB/identifiers/patient"}, - {"code": "ACME-Patient35623", "system": "https://supplierXYZ/identifiers/patient"}, -] -action_flag = ["flagA", "flagB"] - - -def pick_rand(pool): - idx = random.randint(0, len(pool) - 1) - return pool[idx] - - -def generate_immunization(num): - with open("sample_imms.json", "r") as template: - imms = json.loads(template.read()) - - all_imms = [] - for _ in range(num): - _imms = copy.deepcopy(imms) - # ID - _imms["id"] = str(make_rand_id()) - _imms["identifier"][0]["system"] = pick_rand(suppliers) - _imms["identifier"][0]["value"] = str(make_rand_id()) - # Patient - patient = pick_rand(patient_pool) - _imms["patient"]["identifier"]["value"] = patient["nhs_number"] - # Vaccination - _imms["protocolApplied"][0]["targetDisease"][0]["coding"][0]["code"] = pick_rand(vaccine_code) - _imms["vaccineCode"]["coding"][0]["code"] = pick_rand(vaccine_code) - - all_imms.append(_imms) - - return all_imms - - -def write(_data, resource_type): - path = "sample_data" - if not os.path.exists(path): - os.makedirs(path) - - name = f"{datetime.today().strftime('%Y-%m-%dT%H:%M:%S')}_{resource_type}-{len(_data)}.json" - with open(f"{path}/{name}", "w") as sample_file: - json_events = json.dumps(_data, indent=2) - sample_file.write(json_events) - - -if __name__ == "__main__": - imms = generate_immunization(30) - write(imms, resource_type="immunization") diff --git a/utilities/devtools/img/relational-model.png b/utilities/devtools/img/relational-model.png deleted file mode 100644 index 8659d551414d70702211d1a21b3391c2de19c2f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140896 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 H8@K--p4it- diff --git a/utilities/devtools/localstack-compose.yml b/utilities/devtools/localstack-compose.yml deleted file mode 100644 index 5235e24e87..0000000000 --- a/utilities/devtools/localstack-compose.yml +++ /dev/null @@ -1,15 +0,0 @@ -version: "3.8" - -services: - localstack: - container_name: "localstack_main" - image: localstack/localstack:latest - environment: - - SERVICES=s3,dynamodb,sts - - DEFAULT_REGION=eu-west-2 - - DEBUG=1 - - PERSISTENCE=1 - ports: - - "4566:4566" - volumes: - - "${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack" diff --git a/utilities/devtools/pytest.ini b/utilities/devtools/pytest.ini deleted file mode 100644 index 0da43c35a4..0000000000 --- a/utilities/devtools/pytest.ini +++ /dev/null @@ -1,6 +0,0 @@ -[pytest] -;python_files = test_*.py -norecursedirs = .venv .eggs docker sample_data build dist utils -markers = - query: query - debug: debug diff --git a/utilities/devtools/requirements.txt b/utilities/devtools/requirements.txt deleted file mode 100644 index 7ae26195bc..0000000000 --- a/utilities/devtools/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -boto3 -pytest diff --git a/utilities/devtools/sample_event.json b/utilities/devtools/sample_event.json deleted file mode 100644 index 041b48ad27..0000000000 --- a/utilities/devtools/sample_event.json +++ /dev/null @@ -1,302 +0,0 @@ -{ - "resourceType": "Immunization", - "contained": [ - { - "resourceType": "QuestionnaireResponse", - "questionnaire": "Questionnaire/1", - "status": "completed", - "item": [ - { - "linkId": "SiteCode", - "answer": [ - { - "valueCoding": { - "system": "snomed", - "code": "M242ND" - } - } - ] - }, - { - "linkId": "SiteName", - "answer": [ - { - "valueCoding": { - "code": "dummy" - } - } - ] - }, - { - "linkId": "NhsNumberStatus", - "answer": [ - { - "valueCoding": { - "code": "snomed", - "display": "test description" - } - } - ] - }, - { - "linkId": "LocalPatient", - "answer": [ - { - "valueCoding": { - "system": "https://supplierABC/identifiers/patient", - "code": "ACME-patient123456" - } - } - ] - }, - { - "linkId": "Consent", - "answer": [ - { - "valueCoding": { - "code": "snomed", - "display": "free text" - } - } - ] - }, - { - "linkId": "CareSetting", - "answer": [ - { - "valueCoding": { - "code": "1127531000000102", - "display": "SNOMED-CT Term description Community health services (qualifier value)" - } - } - ] - }, - { - "linkId": "IpAddress", - "answer": [ - { - "valueCoding": { - "code": "1.0.0.0" - } - } - ] - }, - { - "linkId": "UserId", - "answer": [ - { - "valueCoding": { - "code": "test123" - } - } - ] - }, - { - "linkId": "UserName", - "answer": [ - { - "valueCoding": { - "code": "test" - } - } - ] - }, - { - "linkId": "UserEmail", - "answer": [ - { - "valueCoding": { - "code": "test@gmail.com" - } - } - ] - }, - { - "linkId": "SubmittedTimeStamp", - "answer": [ - { - "valueCoding": { - "code": "2020-12-14T10:08:15" - } - } - ] - }, - { - "linkId": "ReduceValidation", - "answer": [ - { - "valueCoding": { - "code": "TRUE", - "display": "test" - } - } - ] - } - ] - } - ], - "extension": [ - { - "url": "https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-VaccinationProcedure", - "valueCodeableConcept": { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "snomed", - "display": "snomed" - } - ] - } - }, - { - "url": "https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-VaccinationSituation", - "valueCodeableConcept": { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "snomed", - "display": "snomed" - } - ] - } - } - ], - "identifier": [ - { - "system": "https://supplierABC/ODSCode", - "value": "e045626e-4dc5-4df3-bc35-da25263f901e" - } - ], - "status": "completed", - "statusReason": { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "snomed", - "display": "snomed" - } - ] - }, - "vaccineCode": { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "snomed", - "display": "snomed" - } - ] - }, - "lotNumber": "AAJN11K", - "expirationDate": "2020-05-06", - "patient": { - "resourceType": "Patient", - "identifier": [ - { - "system": "https//fhir.nhs.uk/Id/nhs-number", - "value": "1234567891" - } - ], - "name": [ - { - "family": "test", - "given": ["test"] - } - ], - "gender": "1", - "birthDate": "1999-10-03", - "address": [ - { - "postalCode": "LS1 5HT" - } - ] - }, - "occurrenceDateTime": "2020-12-14T10:08:15+00:00", - "primarySource": true, - "location": { - "identifier": { - "system": "https://fhir.nhs.uk/Id/ods-organization-code", - "value": "B0C4P" - }, - "resourceType": "Location" - }, - "site": { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "LA", - "display": "left arm" - } - ] - }, - "route": { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "IM", - "display": "injection, intramuscular" - } - ] - }, - "doseQuantity": { - "value": 5, - "unit": "mg", - "system": "http://unitsofmeasure.org", - "code": "snomed" - }, - "protocolApplied": [ - { - "targetDisease": [ - { - "coding": [ - { - "code": "40468003" - } - ] - } - ], - "doseNumber": "5" - } - ], - "reportOrigin": { - "text": "sample" - }, - "reasonCode": [ - { - "coding": [ - { - "code": "snomed", - "display": "test" - } - ] - } - ], - "recorded": "2010-05-06", - "manufacturer": { - "resourceType": "Organization", - "name": "org" - }, - "performer": { - "actor": { - "resourceType": "Practitioner", - "identifier": [ - { - "type": { - "coding": [ - { - "display": "GP" - } - ] - }, - "system": "https://fhir.hl7.org.uk/Id/gmc-number", - "value": "OP" - } - ], - "name": [ - { - "family": "test", - "given": ["test"] - } - ] - } - } -} diff --git a/utilities/devtools/sample_imms.json b/utilities/devtools/sample_imms.json deleted file mode 100644 index 7ede1d5ac6..0000000000 --- a/utilities/devtools/sample_imms.json +++ /dev/null @@ -1,119 +0,0 @@ -{ - "id": "d11c69d8-7a50-4a54-a848-7648121e9953", - "resourceType": "Immunization", - "extension": [ - { - "url": "https://fhir.hl7.org.uk/StructureDefinition/Extension-UKCore-VaccinationProcedure", - "valueCodeableConcept": { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "1324681000000101", - "display": "Administration of first dose of severe acute respiratory syndrome coronavirus 2 vaccine (procedure)" - } - ] - } - } - ], - "identifier": [ - { - "use": "secondary", - "system": "https://supplierABC/identifiers/vacc", - "value": "1324761000000100" - } - ], - "status": "completed", - "vaccineCode": { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "39114911000001105", - "display": "COVID-19 Vaccine AstraZeneca (ChAdOx1 S [recombinant]) 5x10,000,000,000 viral particles/0.5ml dose solution for injection multidose vials (AstraZeneca UK Ltd) (product)" - } - ] - }, - "patient": { - "reference": "urn:uuid:124fcb63-669c-4a3c-af2b-caf55de167ec", - "type": "Patient", - "identifier": { - "system": "https://fhir.nhs.uk/Id/nhs-number", - "value": "9000000009" - } - }, - "occurrenceDateTime": "2020-12-10T13:00:08.476000+00:00", - "recorded": "2020-12-10T00:00:00+00:00", - "primarySource": true, - "manufacturer": { - "display": "AstraZeneca Ltd" - }, - "lotNumber": "R04X", - "expirationDate": "2021-04-29", - "site": { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "368208006", - "display": "Left upper arm structure (body structure)" - } - ] - }, - "route": { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "78421000", - "display": "Intramuscular route (qualifier value)" - } - ] - }, - "doseQuantity": { - "system": "http://snomed.info/sct", - "value": 1, - "unit": "pre-filled disposable injection", - "code": "3318611000001103" - }, - "performer": [ - { - "actor": { - "type": "Organization", - "identifier": { - "system": "https://fhir.nhs.uk/Id/ods-organization-code", - "value": "RX809" - }, - "display": "TEST-SITE" - } - } - ], - "reasonCode": [ - { - "coding": [ - { - "system": "http://snomed.info/sct", - "code": "443684005", - "display": "Disease outbreak (event)" - } - ] - } - ], - "protocolApplied": [ - { - "doseNumberPositiveInt": 1, - "targetDisease": [ - { - "coding": [ - { - "code": "443684005", - "display": "Disease outbreak (event)" - } - ] - } - ] - } - ], - "location": { - "identifier": { - "system": "urn:iso:std:iso:3166", - "value": "GB" - } - } -} diff --git a/utilities/devtools/seed.py b/utilities/devtools/seed.py deleted file mode 100644 index 29c1899cfe..0000000000 --- a/utilities/devtools/seed.py +++ /dev/null @@ -1,66 +0,0 @@ -import json -import sys - -import boto3 - -sample_file = "sample_data/2023-11-29T19:04:37_immunisation-30.json" - -dynamodb_url = "http://localhost:4566" -table_name = "imms-default-imms-events" - - -class DynamoTable: - def __init__(self, endpoint_url, _table_name): - db = boto3.resource("dynamodb", endpoint_url=endpoint_url, region_name="us-east-1") - self.table = db.Table(_table_name) - - def create_immunization(self, immunization): - # When seeding, we preserve the original ID, instead of creating new one - new_id = immunization["id"] - patient_id = immunization["patient"]["identifier"]["value"] - disease_type = immunization["protocolApplied"][0]["targetDisease"][0]["coding"][0]["code"] - - patient_sk = f"{disease_type}#{new_id}" - - response = self.table.put_item( - Item={ - "PK": self._make_immunization_pk(new_id), - "Resource": json.dumps(immunization), - "PatientPK": self._make_patient_pk(patient_id), - "PatientSK": patient_sk, - "Version": 1, - } - ) - - if response["ResponseMetadata"]["HTTPStatusCode"] == 200: - return immunization - else: - raise Exception("Non-200 response from dynamodb") - - @staticmethod - def _make_immunization_pk(_id: str): - return f"Immunization#{_id}" - - @staticmethod - def _make_patient_pk(_id: str): - return f"Patient#{_id}" - - -def seed_immunization(table, _sample_file): - with open(_sample_file, "r") as raw_data: - imms_list = json.loads(raw_data.read()) - - for imms in imms_list: - table.create_immunization(imms) - - print(f"{len(imms_list)} resources added successfully") - - -if __name__ == "__main__": - _table = DynamoTable(dynamodb_url, table_name) - - seed_file = sample_file - if len(sys.argv) > 1: - seed_file = sys.argv[1] - - seed_immunization(_table, seed_file) From 5e26017d423dacc8287ccfc11f91a79c3118810b Mon Sep 17 00:00:00 2001 From: Daniel Yip Date: Tue, 3 Feb 2026 14:27:17 +0000 Subject: [PATCH 2/2] PR comments --- README.md | 4 ++-- lambdas/delta_backend/README.md | 2 +- lambdas/recordforwarder/README.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ad01f7caf8..3f9695142b 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ See https://nhsd-confluence.digital.nhs.uk/display/APM/Glossary. | `delta_backend` | **Imms Sync** – Lambda function that reacts to events in the Immunisation Event Data Store (IEDS). | | `filenameprocessor` | **Imms Batch** – Validates and processes new batch file events. | | `id_sync` | **Imms Cross-cutting** – Handles [MNS](https://digital.nhs.uk/developer/api-catalogue/multicast-notification-service) NHS Number Change events and applies updates to affected records. | -| `mesh_processor` | **Imms Batch** – Triggered when new files our received via MESH. Moves them into the Imms Batch processing system. | +| `mesh_processor` | **Imms Batch** – Triggered when new files are received via MESH. Moves them into the Imms Batch processing system. | | `mns_subscription` | **Imms Cross-cutting** – Simple helper Lambda which sets up our required MNS subscription. Used in pipelines in DEV. | | `recordforwarder` | **Imms Batch** – Consumes from the stream and applies the processed batch file row operations (CUD) to IEDS. | | `recordprocessor` | **Imms Batch** – ECS Task - **not** a Lambda function - responsible for processing batch file rows and forwarding to the stream. | @@ -39,7 +39,7 @@ Due to the timing of the project's inception, Azure pipelines have been inherite the Apigee proxy and sandbox. The new way to manage and deploy said resources is [Proxygen](https://digital.nhs.uk/developer/api-catalogue/proxy-generator). In future a migration plan will be provided by the API Management team so we can move to the new process and use purely -GitHub Actions for our entire pipeline +GitHub Actions for our entire pipeline. | Folder | Description | | --------- | ------------------------------------------------------------------------------------------------------------------------------- | diff --git a/lambdas/delta_backend/README.md b/lambdas/delta_backend/README.md index 5745590f94..51b9451699 100644 --- a/lambdas/delta_backend/README.md +++ b/lambdas/delta_backend/README.md @@ -10,7 +10,7 @@ This project is designed to convert FHIR-compliant JSON data (e.g., Immunization | --------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | | **`converter.py`** | The main brain — applies the schema, runs conversions, handles errors. | | **`conversion_layout.py`** | A plain Python list that defines which fields you want, and how they should be formatted (e.g. date format, renaming rules). | -| **`delta.py`** | Holds the function called by AWS Lambda | +| **`delta.py`** | Holds the function called by AWS Lambda. | | **`extractor.py`** | Tailored functionality to extract target fields from immunization record received by the delta handler. | | **`exception_messages.py`** | Holds reusable error messages and codes for clean debugging and validation feedback. | | **`log_firehose.py`** | Firehose logging functionality. | diff --git a/lambdas/recordforwarder/README.md b/lambdas/recordforwarder/README.md index e68abcf609..6f09f33c9e 100644 --- a/lambdas/recordforwarder/README.md +++ b/lambdas/recordforwarder/README.md @@ -8,7 +8,7 @@ The Record Forwarder Lambda consumes from an AWS Kinesis Stream, and is responsi Event Data Store. It will receive up to 100 records per batch. Each record will have been processed and formatted as a FHIR Immunization by the ECS Record Processor in the prior batch step. -The Record Forwarded Lambda will then execute the requested operation (Create, Update or Delete) on the given record. +The Record Forwarder Lambda will then execute the requested operation (Create, Update or Delete) on the given record. ## Setting up the recordforwarder lambda