diff --git a/lambdas/mesh-acknowledge/mesh_acknowledge/__tests__/fixtures.py b/lambdas/mesh-acknowledge/mesh_acknowledge/__tests__/fixtures.py index fdb52d9fd..c3f477419 100644 --- a/lambdas/mesh-acknowledge/mesh_acknowledge/__tests__/fixtures.py +++ b/lambdas/mesh-acknowledge/mesh_acknowledge/__tests__/fixtures.py @@ -44,7 +44,7 @@ def create_invalid_event_dict(event_id: str, message_reference: str | None = "RE data: Dict[str, str] = { "meshMessageId": "MSG123456", "senderId": "SENDER001", - "failureCode": "DL_CLIV_005", + "reasonCode": "DL_CLIV_005", } if message_reference is not None: data["messageReference"] = message_reference diff --git a/lambdas/mesh-acknowledge/mesh_acknowledge/__tests__/test_events.py b/lambdas/mesh-acknowledge/mesh_acknowledge/__tests__/test_events.py index 040111a85..c517cb3b4 100644 --- a/lambdas/mesh-acknowledge/mesh_acknowledge/__tests__/test_events.py +++ b/lambdas/mesh-acknowledge/mesh_acknowledge/__tests__/test_events.py @@ -292,7 +292,7 @@ def create_malformed_invalid_sqs_record(event_id_invalid: str) -> Dict[str, str] 'data': { 'meshMessageId': 'MSG123456', 'senderId': 'SENDER001', - 'failureCode': 'DL_CLIV_005', + 'reasonCode': 'DL_CLIV_005', 'extraField': 'INVALID' # Invalid extra field } } @@ -366,7 +366,7 @@ def test_publish_nack_success( 'receivedMeshMessageId': incoming_event.data.meshMessageId, 'sentMeshMessageId': 'SENT123', 'statusCode': 400, - 'failureCode': incoming_event.data.failureCode, + 'failureCode': incoming_event.data.reasonCode, } if with_reference: expected_data['messageReference'] = incoming_event.data.messageReference diff --git a/lambdas/mesh-acknowledge/mesh_acknowledge/__tests__/test_message_processor.py b/lambdas/mesh-acknowledge/mesh_acknowledge/__tests__/test_message_processor.py index 6dbbd0a58..50a7dfcf2 100644 --- a/lambdas/mesh-acknowledge/mesh_acknowledge/__tests__/test_message_processor.py +++ b/lambdas/mesh-acknowledge/mesh_acknowledge/__tests__/test_message_processor.py @@ -525,7 +525,7 @@ def test_process_invalid_event_success( mock_acknowledger.negative_acknowledge_message.assert_called_once_with( mailbox_id=mesh_mailbox_id, message_id=invalid_event.data.meshMessageId, - failure_code=invalid_event.data.failureCode, + failure_code=invalid_event.data.reasonCode, sender_id=invalid_event.data.senderId, message_reference=invalid_event.data.messageReference ) diff --git a/lambdas/mesh-acknowledge/mesh_acknowledge/events.py b/lambdas/mesh-acknowledge/mesh_acknowledge/events.py index 0a8d5fe81..5d7b7f15b 100644 --- a/lambdas/mesh-acknowledge/mesh_acknowledge/events.py +++ b/lambdas/mesh-acknowledge/mesh_acknowledge/events.py @@ -116,7 +116,7 @@ def publish_negative_acknowledged_event( mesh_mailbox_id: str, sent_mesh_message_id: str): """ Publishes a MESHInboxMessageAcknowledged event for a negative acknowledgement, - with statusCode 400 and the failureCode from the invalid event. + with statusCode 400 and the reasonCode from the invalid event. """ now = datetime.now(timezone.utc).isoformat() @@ -137,7 +137,7 @@ def publish_negative_acknowledged_event( 'receivedMeshMessageId': incoming_event.data.meshMessageId, 'sentMeshMessageId': sent_mesh_message_id, 'statusCode': 400, - 'failureCode': incoming_event.data.failureCode, + 'failureCode': incoming_event.data.reasonCode, **( {'messageReference': incoming_event.data.messageReference} if incoming_event.data.messageReference is not None @@ -157,7 +157,7 @@ def publish_negative_acknowledged_event( "Published MESHInboxMessageAcknowledged (negative acknowledgement) event", sender_id=incoming_event.data.senderId, mesh_mailbox_id=mesh_mailbox_id, - failure_code=incoming_event.data.failureCode, + reason_code=incoming_event.data.reasonCode, message_reference=incoming_event.data.messageReference ) except Exception as e: diff --git a/lambdas/mesh-acknowledge/mesh_acknowledge/message_processor.py b/lambdas/mesh-acknowledge/mesh_acknowledge/message_processor.py index a0907679e..4d47e7043 100644 --- a/lambdas/mesh-acknowledge/mesh_acknowledge/message_processor.py +++ b/lambdas/mesh-acknowledge/mesh_acknowledge/message_processor.py @@ -147,7 +147,7 @@ def __process_invalid_record(self, record: Dict[str, Any]) -> str: sender_id = validated_event.data.senderId incoming_message_id = validated_event.data.meshMessageId - failure_code = validated_event.data.failureCode + reason_code = validated_event.data.reasonCode message_reference = validated_event.data.messageReference mesh_mailbox_id = self.__sender_lookup.get_mailbox_id(sender_id) @@ -162,7 +162,7 @@ def __process_invalid_record(self, record: Dict[str, Any]) -> str: negative_acknowledgement_message_id = self.__acknowledger.negative_acknowledge_message( mailbox_id=mesh_mailbox_id, message_id=incoming_message_id, - failure_code=failure_code, + failure_code=reason_code, sender_id=sender_id, message_reference=message_reference ) diff --git a/lambdas/mesh-download/mesh_download/__tests__/test_processor.py b/lambdas/mesh-download/mesh_download/__tests__/test_processor.py index e698edaf0..c2c938cf4 100644 --- a/lambdas/mesh-download/mesh_download/__tests__/test_processor.py +++ b/lambdas/mesh-download/mesh_download/__tests__/test_processor.py @@ -314,8 +314,8 @@ def test_process_sqs_message_invalid_fhir_content(self, mock_datetime): assert event_data['senderId'] == 'TEST-SENDER' assert event_data['messageReference'] == 'ref-001' assert event_data['meshMessageId'] == 'test-message-123' - assert event_data['failureCode'] == 'DL_CLIV_005' - assert set(event_data.keys()) == {'senderId', 'messageReference', 'meshMessageId', 'failureCode'} + assert event_data['reasonCode'] == 'DL_CLIV_005' + assert set(event_data.keys()) == {'senderId', 'messageReference', 'meshMessageId', 'reasonCode'} def test_process_sqs_message_validation_failure(self): """Malformed CloudEvents should be rejected by pydantic and not trigger downloads""" @@ -607,7 +607,7 @@ def test_trust_duplicate_publishes_invalid_event_and_acknowledges(self, mock_dat assert event_data['senderId'] == 'TEST-SENDER' assert event_data['meshMessageId'] == 'test-message-123' assert event_data['messageReference'] == 'ref-001' - assert event_data['failureCode'] == 'DL_CLIV_004' + assert event_data['reasonCode'] == 'DL_CLIV_004' mesh_message.acknowledge.assert_called_once() diff --git a/lambdas/mesh-download/mesh_download/processor.py b/lambdas/mesh-download/mesh_download/processor.py index 7800c0983..c7e2d331b 100644 --- a/lambdas/mesh-download/mesh_download/processor.py +++ b/lambdas/mesh-download/mesh_download/processor.py @@ -223,7 +223,7 @@ def _publish_message_invalid_event(self, incoming_event, failure_code: str): 'data': { 'senderId': incoming_event.data.senderId, 'meshMessageId': incoming_event.data.meshMessageId, - 'failureCode': failure_code, + 'reasonCode': failure_code, 'messageReference': incoming_event.data.messageReference, } } diff --git a/lambdas/mesh-poll/mesh_poll/processor.py b/lambdas/mesh-poll/mesh_poll/processor.py index 9f9b7e360..bd6532ae5 100644 --- a/lambdas/mesh-poll/mesh_poll/processor.py +++ b/lambdas/mesh-poll/mesh_poll/processor.py @@ -127,7 +127,7 @@ def process_message(self, message): "data": { "meshMessageId": message_id, "senderId": sender_id, - "failureCode": "DL_CLIV_006" + "reasonCode": "DL_CLIV_006" } } @@ -236,4 +236,4 @@ def _publish_mesh_inbox_message_invalid_event(self, event_detail): self.__log.info("Published MESHInboxMessageInvalid event", mesh_message_id=event_detail["data"]["meshMessageId"], sender_id=event_detail["data"]["senderId"], - failure_code=event_detail["data"]["failureCode"]) + reason_code=event_detail["data"]["reasonCode"]) diff --git a/package-lock.json b/package-lock.json index c9c8ebcfe..e5f263e90 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9995,9 +9995,9 @@ } }, "node_modules/@nhsdigital/nhs-notify-event-schemas-supplier-api": { - "version": "1.0.18", - "resolved": "https://npm.pkg.github.com/download/@nhsdigital/nhs-notify-event-schemas-supplier-api/1.0.18/e81996aca0271b686b521dec9ec33a8735b351b5", - "integrity": "sha512-+PJ4XSWYZ+hZ2jhbvt2Wpi0QzPAYug2bnl6NrdEQmcURVhAh5JxJkuQ7OayHXFS2A7hiEF+4nJnS6B0ZLiWSgw==", + "version": "1.0.19", + "resolved": "https://npm.pkg.github.com/download/@nhsdigital/nhs-notify-event-schemas-supplier-api/1.0.19/46a72901639161b3dafa0d47af70d1e9ec8f4686", + "integrity": "sha512-DqS0GmQ64jfLuKDerUuUFMZEdTjsEtpHROoMeXsjc54zELH4RLmZTok/gJozDXqSpn0twWPLu8QlP7bss7tmXQ==", "license": "MIT", "dependencies": { "@asyncapi/bundler": "^0.6.4", diff --git a/src/cloudevents/domains/digital-letters/2025-10-draft/data/digital-letters-mesh-inbox-message-invalid-data.schema.yaml b/src/cloudevents/domains/digital-letters/2025-10-draft/data/digital-letters-mesh-inbox-message-invalid-data.schema.yaml index 666708021..201c4c65b 100644 --- a/src/cloudevents/domains/digital-letters/2025-10-draft/data/digital-letters-mesh-inbox-message-invalid-data.schema.yaml +++ b/src/cloudevents/domains/digital-letters/2025-10-draft/data/digital-letters-mesh-inbox-message-invalid-data.schema.yaml @@ -8,11 +8,11 @@ properties: $ref: ../defs/mesh.schema.yaml#/properties/meshMessageId senderId: $ref: ../defs/requests.schema.yaml#/properties/senderId - failureCode: + reasonCode: $ref: ../defs/requests.schema.yaml#/properties/failureCode messageReference: $ref: ../defs/requests.schema.yaml#/properties/messageReference required: - meshMessageId - senderId - - failureCode + - reasonCode diff --git a/src/cloudevents/readme-index.yaml b/src/cloudevents/readme-index.yaml index 4643324c0..21f5a32f0 100644 --- a/src/cloudevents/readme-index.yaml +++ b/src/cloudevents/readme-index.yaml @@ -3,7 +3,7 @@ # To regenerate, run: make update-readme # To customize labels and purposes, edit: readme-metadata.yaml -generated: '2026-04-09T13:48:22.150Z' +generated: '2026-05-20T09:25:05.734Z' common: null domains: - name: digital-letters @@ -112,6 +112,11 @@ domains: source: src/digital-letters/2025-10-draft/data/digital-letters-queue-digital-letter-read-data.schema.yaml published: schemas/digital-letters/2025-10-draft/data/digital-letters-queue-digital-letter-read-data.schema.json docs: ../../docs/cloudevents/digital-letters/2025-10-draft/data/digital-letters-queue-digital-letter-read-data.schema.md + - type: Digital Letters Queue Digital Letter Unsuccessful Data + category: data + source: src/digital-letters/2025-10-draft/data/digital-letters-queue-digital-letter-unsuccessful-data.schema.yaml + published: schemas/digital-letters/2025-10-draft/data/digital-letters-queue-digital-letter-unsuccessful-data.schema.json + docs: ../../docs/cloudevents/digital-letters/2025-10-draft/data/digital-letters-queue-digital-letter-unsuccessful-data.schema.md - type: Digital Letters Queue Item Dequeued Data category: data source: src/digital-letters/2025-10-draft/data/digital-letters-queue-item-dequeued-data.schema.yaml @@ -327,6 +332,11 @@ domains: source: src/digital-letters/2025-10-draft/events/uk.nhs.notify.digital.letters.queue.digital.letter.read.v1.schema.yaml published: schemas/digital-letters/2025-10-draft/events/uk.nhs.notify.digital.letters.queue.digital.letter.read.v1.schema.json docs: ../../docs/cloudevents/digital-letters/2025-10-draft/events/uk.nhs.notify.digital.letters.queue.digital.letter.read.v1.schema.md + - type: uk.nhs.notify.digital.letters.queue.digital.letter.unsuccessful.v1 + category: events + source: src/digital-letters/2025-10-draft/events/uk.nhs.notify.digital.letters.queue.digital.letter.unsuccessful.v1.schema.yaml + published: schemas/digital-letters/2025-10-draft/events/uk.nhs.notify.digital.letters.queue.digital.letter.unsuccessful.v1.schema.json + docs: ../../docs/cloudevents/digital-letters/2025-10-draft/events/uk.nhs.notify.digital.letters.queue.digital.letter.unsuccessful.v1.schema.md - type: uk.nhs.notify.digital.letters.queue.item.dequeued.v1 category: events source: src/digital-letters/2025-10-draft/events/uk.nhs.notify.digital.letters.queue.item.dequeued.v1.schema.yaml @@ -357,11 +367,6 @@ domains: source: src/digital-letters/2025-10-draft/nhs-notify-document-reference.schema.yaml published: schemas/digital-letters/2025-10-draft/nhs-notify-document-reference.schema.json docs: ../../docs/cloudevents/digital-letters/2025-10-draft/nhs-notify-document-reference.schema.md - - type: Profile - category: profile - source: src/digital-letters/2025-10-draft/supplierapi-profile.schema.yaml - published: schemas/digital-letters/2025-10-draft/supplierapi-profile.schema.json - docs: ../../docs/cloudevents/digital-letters/2025-10-draft/supplierapi-profile.schema.md exampleEvents: - name: Uk.nhs.notify.digital.letters.letter.available.v1 filename: uk.nhs.notify.digital.letters.letter.available.v1-event @@ -439,6 +444,10 @@ domains: filename: uk.nhs.notify.digital.letters.queue.digital.letter.read.v1-event json: ../../docs/cloudevents/digital-letters/2025-10-draft/example-events/uk.nhs.notify.digital.letters.queue.digital.letter.read.v1-event.json markdown: ../../docs/cloudevents/digital-letters/2025-10-draft/example-events/uk.nhs.notify.digital.letters.queue.digital.letter.read.v1-event.md + - name: Uk.nhs.notify.digital.letters.queue.digital.letter.unsuccessful.v1 + filename: uk.nhs.notify.digital.letters.queue.digital.letter.unsuccessful.v1-event + json: ../../docs/cloudevents/digital-letters/2025-10-draft/example-events/uk.nhs.notify.digital.letters.queue.digital.letter.unsuccessful.v1-event.json + markdown: ../../docs/cloudevents/digital-letters/2025-10-draft/example-events/uk.nhs.notify.digital.letters.queue.digital.letter.unsuccessful.v1-event.md - name: Uk.nhs.notify.digital.letters.queue.item.dequeued.v1 filename: uk.nhs.notify.digital.letters.queue.item.dequeued.v1-event json: ../../docs/cloudevents/digital-letters/2025-10-draft/example-events/uk.nhs.notify.digital.letters.queue.item.dequeued.v1-event.json diff --git a/tests/playwright/digital-letters-component-tests/mesh-acknowledge.component.spec.ts b/tests/playwright/digital-letters-component-tests/mesh-acknowledge.component.spec.ts index c65a1ed37..fdd4c6072 100644 --- a/tests/playwright/digital-letters-component-tests/mesh-acknowledge.component.spec.ts +++ b/tests/playwright/digital-letters-component-tests/mesh-acknowledge.component.spec.ts @@ -184,7 +184,7 @@ test.describe('Digital Letters - Mesh Acknowledger', () => { const letterId = uuidv4(); const meshMessageId = `${Date.now()}_TEST_${uuidv4().slice(0, 8)}`; - const failureCode = 'DL_CLIV_005'; + const reasonCode = 'DL_CLIV_005'; const validMessageInvalidEvent: MESHInboxMessageInvalid = { ...validMessageDownloadedEvent, @@ -195,7 +195,7 @@ test.describe('Digital Letters - Mesh Acknowledger', () => { data: { meshMessageId, senderId, - failureCode, + reasonCode, }, }; @@ -218,7 +218,7 @@ test.describe('Digital Letters - Mesh Acknowledger', () => { `$.details.event_detail = "*\\"senderId\\":\\"${senderId}\\"*"`, `$.details.event_detail = "*\\"meshMailboxId\\":\\"${sendersMeshMailboxId}\\"*"`, `$.details.event_detail = "*\\"statusCode\\":400*"`, - `$.details.event_detail = "*\\"failureCode\\":\\"${failureCode}\\"*"`, + `$.details.event_detail = "*\\"failureCode\\":\\"${reasonCode}\\"*"`, `$.details.event_detail = "*\\"receivedMeshMessageId\\":\\"${meshMessageId}\\"*"`, ], ); @@ -246,7 +246,7 @@ test.describe('Digital Letters - Mesh Acknowledger', () => { const messageBody = JSON.parse(messageContent.body); expect(messageBody.meshMessageId).toEqual(meshMessageId); - expect(messageBody.failureCode).toEqual(failureCode); + expect(messageBody.failureCode).toEqual(reasonCode); expect(messageBody.requestId).toEqual(`${senderId}_`); }, 30); }); diff --git a/tests/playwright/digital-letters-component-tests/mesh-poll-download.component.spec.ts b/tests/playwright/digital-letters-component-tests/mesh-poll-download.component.spec.ts index 33e17865b..1b1cf9f0e 100644 --- a/tests/playwright/digital-letters-component-tests/mesh-poll-download.component.spec.ts +++ b/tests/playwright/digital-letters-component-tests/mesh-poll-download.component.spec.ts @@ -133,7 +133,7 @@ test.describe('Digital Letters - MESH Poll and Download', () => { async function expectMeshInboxMessageInvalidEvent( meshMessageId: string, messageReference: string, - failureCode: string, + reasonCode: string, ): Promise { await expectToPassEventually(async () => { const eventLogEntry = await getLogsFromCloudwatch( @@ -144,7 +144,7 @@ test.describe('Digital Letters - MESH Poll and Download', () => { `$.details.event_detail = "*\\"messageReference\\":\\"${messageReference}\\"*"`, `$.details.event_detail = "*\\"senderId\\":\\"${senderId}\\"*"`, `$.details.event_detail = "*\\"meshMessageId\\":\\"${meshMessageId}\\"*"`, - `$.details.event_detail = "*\\"failureCode\\":\\"${failureCode}\\"*"`, + `$.details.event_detail = "*\\"reasonCode\\":\\"${reasonCode}\\"*"`, ], ); @@ -318,7 +318,7 @@ test.describe('Digital Letters - MESH Poll and Download', () => { '$.details.detail_type = "uk.nhs.notify.digital.letters.mesh.inbox.message.invalid.v1"', String.raw`$.details.event_detail = "*\"meshMessageId\":\"${meshMessageId}\"*"`, String.raw`$.details.event_detail = "*\"senderId\":\"${senderId}\"*"`, - String.raw`$.details.event_detail = "*\"failureCode\":\"DL_CLIV_006\"*"`, + String.raw`$.details.event_detail = "*\"reasonCode\":\"DL_CLIV_006\"*"`, ], );