From 70de8483661156dc04b72363d3fb344fc3bf9278 Mon Sep 17 00:00:00 2001 From: warren Date: Thu, 29 May 2025 12:12:11 +0100 Subject: [PATCH 1/4] feat: Insomnia / Postman collections for manual testing --- compose.yaml | 5 + docs/insomnia/MAYS-DataService.yaml | 356 ++++++++++++++++++ docs/insomnia/Mesh_README.md | 97 +++++ docs/insomnia/environment_setup.png | Bin 0 -> 26901 bytes .../Functions/FileExtractFunction.cs | 4 +- 5 files changed, 460 insertions(+), 2 deletions(-) create mode 100644 docs/insomnia/MAYS-DataService.yaml create mode 100644 docs/insomnia/Mesh_README.md create mode 100644 docs/insomnia/environment_setup.png diff --git a/compose.yaml b/compose.yaml index ae785a8..32ae03b 100644 --- a/compose.yaml +++ b/compose.yaml @@ -70,6 +70,8 @@ services: condition: service_healthy db: condition: service_healthy + volumes: + - mesh-config-data:/azure-functions-host/Secrets/ networks: - backend @@ -141,3 +143,6 @@ volumes: db-data: name: db-data driver: local + mesh-config-data: + name: mesh-config-data + driver: local diff --git a/docs/insomnia/MAYS-DataService.yaml b/docs/insomnia/MAYS-DataService.yaml new file mode 100644 index 0000000..fcf1aaa --- /dev/null +++ b/docs/insomnia/MAYS-DataService.yaml @@ -0,0 +1,356 @@ +type: collection.insomnia.rest/5.0 +name: NHS +meta: + id: wrk_738dc23a04ea4e47a7d01738b72201ed + created: 1722434681694 + modified: 1722434681694 +collection: + - name: Select + meta: + id: fld_b916cc57ad9e4964828845e31c1745b0 + created: 1743004900191 + modified: 1747733900210 + sortKey: -1743004900191 + - name: DataService + meta: + id: fld_c3382c257b124dacbffd26e7db504bfb + created: 1747733934120 + modified: 1748516742640 + sortKey: -1747910487990 + children: + - url: "{{ _.mesh_sandbox_url }}/messageexchange/X26ABC1/outbox" + name: Mesh Request + meta: + id: req_a0ecb19c822d40839ae42678de382da1 + created: 1747992419775 + modified: 1748514832787 + isPrivate: false + sortKey: -1747992419925 + method: POST + body: + mimeType: application/octet-stream + fileName: + headers: + - name: Content-Type + value: text/csv + id: pair_2bb7b8cb72ca413c896900437eb49ffa + - name: User-Agent + value: HTTPie + id: pair_b4b6ec9c767a4a9ea5f37e82beb02b1a + - id: pair_20ab5ad1d55f4af487c182bfe3d6869f + name: Authorization + value: "{{meshAuthorisation}}" + disabled: false + - id: pair_0d5403dbd6794b00b45d73288e1a7f56 + name: Host + value: localhost:8700 + disabled: false + - id: pair_df1a308d1a0941a4881081e9fd14615b + name: Mex-Filename + value: test_episodes_20241009_latest.csv + disabled: false + - id: pair_5d4497fe301246a19b2bbaad0dde8fd4 + name: Mex-From + value: "{{meshSandboxMailbox}}" + disabled: false + - id: pair_bf20e7dd55b641afa99669d4fad881b9 + name: Mex-To + value: "{{meshSandboxMailbox}}" + disabled: false + - id: pair_fd17af674fa848a8b36aa9e51affda57 + name: Mex-Workflowid + value: API-DOCS-TEST + disabled: false + settings: + renderRequestBody: true + encodeUrl: true + followRedirects: global + cookies: + send: true + store: true + rebuildPath: true + - url: "{{ _.mesh_sandbox_url }}/messageexchange/X26ABC1/inbox" + name: Get MESH Inbox + meta: + id: req_1b38d6fc1a2e4df3887ba87610c9b4c0 + created: 1748010148910 + modified: 1748514818520 + isPrivate: false + sortKey: -1747992419875 + method: GET + headers: + - name: User-Agent + value: HTTPie + id: pair_b4b6ec9c767a4a9ea5f37e82beb02b1a + - id: pair_20ab5ad1d55f4af487c182bfe3d6869f + name: Authorization + value: "{{ meshAuthorisation }}" + disabled: false + - id: pair_0d5403dbd6794b00b45d73288e1a7f56 + name: Host + value: localhost:8700 + disabled: false + settings: + renderRequestBody: true + encodeUrl: true + followRedirects: global + cookies: + send: true + store: true + rebuildPath: true + - url: "{{ _.mesh_ingest_url }}/admin/functions/MeshHandshakeFunction" + name: Mesh Handshake (Timer) + meta: + id: req_f7ab0c0e26d04e2f9d9e08b4f81bcd43 + created: 1748434699775 + modified: 1748514921710 + isPrivate: false + sortKey: -1747921258958 + method: POST + body: + mimeType: application/json + text: |- + { + // Timer trigger - performs MESH handshake health check + "input": "" + } + parameters: + - id: pair_892346d6688e43f6b92ee35ad2410b34 + disabled: false + headers: + - name: Content-Type + value: application/json + id: pair_b173458285874ea8b46b5332dcc60570 + - name: User-Agent + value: insomnia/11.1.0 + id: pair_53388d8cda1945bab47ff7b616bd31a0 + settings: + renderRequestBody: true + encodeUrl: true + followRedirects: global + cookies: + send: true + store: true + rebuildPath: true + - url: "{{ _.mesh_ingest_url }}/admin/functions/FileDiscoveryFunction" + name: File Discovery (Timer) + meta: + id: req_a40d10f1d500472383bc34ebf0a0e1e0 + created: 1748435198587 + modified: 1748514913043 + isPrivate: false + sortKey: -1747992419825 + method: POST + body: + mimeType: application/json + text: |- + { + // Timer trigger - scans MESH inbox for new messages + "input": "" + } + headers: + - name: Content-Type + value: application/json + id: pair_f49d3291afc2446fac8870418f1fa707 + - name: User-Agent + value: insomnia/11.1.0 + id: pair_53388d8cda1945bab47ff7b616bd31a0 + - id: pair_7d6896186cdf4fcab495def4642a007c + name: Authorization + value: "{{ _.meshAuthorisation }}" + disabled: false + settings: + renderRequestBody: true + encodeUrl: true + followRedirects: global + cookies: + send: true + store: true + rebuildPath: true + - url: "{{ _.mesh_ingest_url }}/admin/functions/FileRetryFunction" + name: File Retry (Timer) + meta: + id: req_7d9acd39d8f2480d9ee3c37e3dc34723 + created: 1748435262139 + modified: 1748514918195 + isPrivate: false + sortKey: -1747959380833.625 + method: POST + body: + mimeType: application/json + text: >- + { + // Timer trigger - retries stale extraction/transformation operations + "input": "" + } + headers: + - name: Content-Type + value: application/json + id: pair_aaf682c7b0334c9c83cf1a26eed66143 + - name: User-Agent + value: insomnia/11.1.0 + id: pair_53388d8cda1945bab47ff7b616bd31a0 + settings: + renderRequestBody: true + encodeUrl: true + followRedirects: global + cookies: + send: true + store: true + rebuildPath: true + - url: "{{ _.mesh_ingest_url }}/admin/functions/FileExtractFunction" + name: File Extract (Queue) + meta: + id: req_73243b5059ea472ba6e7fa6e49549952 + created: 1748435288094 + modified: 1748514915919 + isPrivate: false + sortKey: -1747992419812.5 + method: POST + body: + mimeType: application/json + text: |- + // Replace with actual FileId from MESH inbox + // Get FileIds by calling: GET /messageexchange/X26ABC1/inbox + { + "FileId": "159896E597B24A9F8E82F0674C10AB98" + } + headers: + - name: Content-Type + value: application/json + id: pair_7d11f30a765b42ee888503a49c55b7c5 + - name: User-Agent + value: insomnia/11.1.0 + id: pair_53388d8cda1945bab47ff7b616bd31a0 + settings: + renderRequestBody: true + encodeUrl: true + followRedirects: global + cookies: + send: true + store: true + rebuildPath: true + - url: "{{ _.mesh_ingest_url }}/admin/functions/FileTransformFunction" + name: File Transform (Queue) + meta: + id: req_adc34d0696674592adf276cd67cf5195 + created: 1748435351948 + modified: 1748514919801 + isPrivate: false + sortKey: -1747992419793.75 + method: POST + body: + mimeType: application/json + text: |- + // Replace with actual FileId from MESH inbox + // Get FileIds by calling: GET /messageexchange/X26ABC1/inbox + { + "FileId": "159896E597B24A9F8E82F0674C10AB98" + } + headers: + - name: Content-Type + value: application/json + id: pair_eb5af6bfc0f54c2f9a3c24087b36e3df + - name: User-Agent + value: insomnia/11.1.0 + id: pair_53388d8cda1945bab47ff7b616bd31a0 + settings: + renderRequestBody: true + encodeUrl: true + followRedirects: global + cookies: + send: true + store: true + rebuildPath: true + - url: "{{ _.mesh_sandbox_url + }}/messageexchange/X26ABC1/inbox/159896E597B24A9F8E82F0674C10AB98" + name: Get MESH Message by Id + meta: + id: req_5a926a7f6d4a49e5a5153f6b3d29b15d + created: 1748435488346 + modified: 1748514809403 + isPrivate: false + sortKey: -1747992419850 + method: GET + parameters: + - id: pair_156dd6646ebb4b3da0423ddf4b11ba98 + name: id + value: 0B500E9749834F5AB3C89875346F53B8 + disabled: false + headers: + - name: User-Agent + value: HTTPie + id: pair_b4b6ec9c767a4a9ea5f37e82beb02b1a + - id: pair_20ab5ad1d55f4af487c182bfe3d6869f + name: Authorization + value: "{{ _.meshAuthorisation }}" + disabled: false + - id: pair_0d5403dbd6794b00b45d73288e1a7f56 + name: Host + value: localhost:8700 + disabled: false + settings: + renderRequestBody: true + encodeUrl: true + followRedirects: global + cookies: + send: true + store: true + rebuildPath: true + - url: "{{ _.base_url }}/api/bsselect/episodes/ingress" + name: IngressEpisode + meta: + id: req_a92c6aa106bc4c91bedf34878eda2968 + created: 1748516009918 + modified: 1748516657482 + isPrivate: false + sortKey: -1747910792423 + method: POST + body: + mimeType: application/json + text: |- + { + "episode_id": "12345", + "nhs_number": "1234567890", + "date_of_birth": "1990-01-15", + "first_given_name": "John", + "family_name": "Smith" + } + headers: + - name: Content-Type + value: application/json + - name: User-Agent + value: insomnia/11.1.0 + id: pair_8372df4efdfe451aad23e68982c237a3 + settings: + renderRequestBody: true + encodeUrl: true + followRedirects: global + cookies: + send: true + store: true + rebuildPath: true + - name: ParticipantManager + meta: + id: fld_6e725754fd3e4fc1ad51eefd60e88ec3 + created: 1747910487890 + modified: 1747910487890 + sortKey: -1747910487890 +cookieJar: + name: Default Jar + meta: + id: jar_f714b7668b974121d51068531b8ab7c1d3a6759c + created: 1722434681700 + modified: 1737026586440 +environments: + name: MAYS + meta: + id: env_f714b7668b974121d51068531b8ab7c1d3a6759c + created: 1722434681697 + modified: 1748515915606 + isPrivate: false + data: + mesh_ingest_url: http://localhost:7072 + mesh_sandbox_url: http://localhost:8700 + x-functions-key: your-local-master-key-here + base_url: http://localhost:7071 diff --git a/docs/insomnia/Mesh_README.md b/docs/insomnia/Mesh_README.md new file mode 100644 index 0000000..121523e --- /dev/null +++ b/docs/insomnia/Mesh_README.md @@ -0,0 +1,97 @@ +# API Testing with Insomnia + +This guide explains how to set up and use the Insomnia collection for testing the local development environment. + +## Prerequisites + +- [Insomnia](https://insomnia.rest/) installed +- Docker/Podman containers running (`docker-compose up` or `podman-compose up`) + +## Setup Instructions + +### 1. Import the Insomnia Collection + +1. Open Insomnia +2. Click **Create** → **Import From** → **File** +3. Select the `insomnia-collection.json` file from this repository +4. The collection will be imported with all API endpoints + +### 2. Get the Azure Functions Master Key + +After starting your containers, you need to retrieve your local master key for API authentication: + +podman exec -it mesh-ingest cat /azure-functions-host/Secrets/host.json + +#### Manual extraction + +```bash +podman exec -it mesh-ingest cat /azure-functions-host/Secrets/host.json +``` + +Look for the `masterKey.value` field in the JSON output. + +### 3. Configure the Environment Variable + +1. In Insomnia, click on the environment dropdown (usually shows "No Environment") | ctrl/cmd + E +2. Click **Manage Environments** +3. Create a new environment or edit the existing one +4. Add the following variable: + + ```json + { + "x_functions_key": "your-local-master-key-here" + } + ``` + +5. Replace `your-master-key-here` with the key you retrieved in step 2 + +### 4. Environment Variables + +The collection uses these environment variables that should be set in Insomnia: + +| Variable | Description | Example | +|----------|-------------|---------| +| `x_functions_key` | Azure Functions master key | `your-local-master-key-here` | +| `base_url` | Base URL for API calls | `http://localhost:7071` (adjust port as needed) | +| `mesh_ingest_url` | Mesh ingest service URL | `http://localhost:7072` (adjust port as needed) | + +![alt text](environment_setup.png) + +## Usage + +1. Start your containers: `docker-compose up` or `podman-compose up` +2. Wait for all services to be healthy +3. Retrieve and set the master key (steps 2-3 above) +4. Use the imported collection to test API endpoints + +## Key Persistence + +The master key now persists between container restarts thanks to the persistent volume configuration. You only need to retrieve it: + +- **First time** after creating the volume +- **After running** `docker-compose down -v` (which removes volumes) +- **After manually deleting** the `mesh-functions-data` volume + +## Troubleshooting + +### Key Not Found + +If you get "no such file" errors, verify the containers are running: +```bash +podman ps +# or +docker ps +``` + +### Authentication Errors + +- Verify the master key is correct and properly set in Insomnia environment +- Check that the `x-functions-key` header is being sent with requests +- Ensure containers are fully started and healthy + +### Port Issues + +Check your `.env` file for the correct port mappings: + +- `API_PORT` - for the main API service +- `MESH_INGEST_PORT` - for the mesh ingest service diff --git a/docs/insomnia/environment_setup.png b/docs/insomnia/environment_setup.png new file mode 100644 index 0000000000000000000000000000000000000000..579f000888a2906d60246f9902318d6ef164e2c9 GIT binary patch literal 26901 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 !|hPtB6v^&>K+zPt`3uw1To^BZf_T~*pPFBu+ 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 DateTime.UtcNow.AddHours(-12))) { logger.LogWarning( - "File with id: {fileId} found in MeshFiles table but is not suitable for extraction. Status: {status}, LastUpdatedUtc: {lastUpdatedUtc}.", + "File with id: {FileId} found in MeshFiles table but is not suitable for extraction. Status: {Status}, LastUpdatedUtc: {LastUpdatedUtc}.", file.FileId, file.Status, file.LastUpdatedUtc.ToTimestamp()); From fe1adcdcf1bf469ebbfb032eb047dc66870881bc Mon Sep 17 00:00:00 2001 From: warren Date: Thu, 29 May 2025 12:16:38 +0100 Subject: [PATCH 2/4] fix: file formatting --- docs/insomnia/MAYS-DataService.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/insomnia/MAYS-DataService.yaml b/docs/insomnia/MAYS-DataService.yaml index fcf1aaa..609fb0b 100644 --- a/docs/insomnia/MAYS-DataService.yaml +++ b/docs/insomnia/MAYS-DataService.yaml @@ -210,7 +210,7 @@ collection: body: mimeType: application/json text: |- - // Replace with actual FileId from MESH inbox + // Replace with actual FileId from MESH inbox // Get FileIds by calling: GET /messageexchange/X26ABC1/inbox { "FileId": "159896E597B24A9F8E82F0674C10AB98" @@ -242,7 +242,7 @@ collection: body: mimeType: application/json text: |- - // Replace with actual FileId from MESH inbox + // Replace with actual FileId from MESH inbox // Get FileIds by calling: GET /messageexchange/X26ABC1/inbox { "FileId": "159896E597B24A9F8E82F0674C10AB98" From 7be55e2a075889e426f5b567ef6a3fd00e3649c4 Mon Sep 17 00:00:00 2001 From: warren Date: Thu, 29 May 2025 12:17:23 +0100 Subject: [PATCH 3/4] fix: markdown formatting --- docs/insomnia/Mesh_README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/insomnia/Mesh_README.md b/docs/insomnia/Mesh_README.md index 121523e..2bb4fd2 100644 --- a/docs/insomnia/Mesh_README.md +++ b/docs/insomnia/Mesh_README.md @@ -77,6 +77,7 @@ The master key now persists between container restarts thanks to the persistent ### Key Not Found If you get "no such file" errors, verify the containers are running: + ```bash podman ps # or From 7fbfd1e76d22a1b4802303787a0b6ab8859a42e7 Mon Sep 17 00:00:00 2001 From: warren Date: Thu, 29 May 2025 12:19:17 +0100 Subject: [PATCH 4/4] fix: formatting --- docs/insomnia/Mesh_README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/insomnia/Mesh_README.md b/docs/insomnia/Mesh_README.md index 2bb4fd2..db4b278 100644 --- a/docs/insomnia/Mesh_README.md +++ b/docs/insomnia/Mesh_README.md @@ -20,7 +20,9 @@ This guide explains how to set up and use the Insomnia collection for testing th After starting your containers, you need to retrieve your local master key for API authentication: +```bash podman exec -it mesh-ingest cat /azure-functions-host/Secrets/host.json +``` #### Manual extraction