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
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
Expand Down
6 changes: 3 additions & 3 deletions lambdas/mesh-acknowledge/mesh_acknowledge/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand All @@ -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
Expand All @@ -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:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"""
Expand Down Expand Up @@ -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()

Expand Down
2 changes: 1 addition & 1 deletion lambdas/mesh-download/mesh_download/processor.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}
}
Expand Down
4 changes: 2 additions & 2 deletions lambdas/mesh-poll/mesh_poll/processor.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ def process_message(self, message):
"data": {
"meshMessageId": message_id,
"senderId": sender_id,
"failureCode": "DL_CLIV_006"
"reasonCode": "DL_CLIV_006"
}
}

Expand Down Expand Up @@ -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"])
6 changes: 3 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -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
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if it would be worth adding a reasonCode property to requests.schema.yaml. I don't think we can get rid of the failureCode type in requests.schema.yaml just yet as it might be used elsewhere.
Also there is a reasonCode in print.schema.yaml but we probably shouldn't use that either.

messageReference:
$ref: ../defs/requests.schema.yaml#/properties/messageReference
required:
- meshMessageId
- senderId
- failureCode
- reasonCode
21 changes: 15 additions & 6 deletions src/cloudevents/readme-index.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -195,7 +195,7 @@ test.describe('Digital Letters - Mesh Acknowledger', () => {
data: {
meshMessageId,
senderId,
failureCode,
reasonCode,
},
};

Expand All @@ -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}\\"*"`,
],
);
Expand Down Expand Up @@ -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);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ test.describe('Digital Letters - MESH Poll and Download', () => {
async function expectMeshInboxMessageInvalidEvent(
meshMessageId: string,
messageReference: string,
failureCode: string,
reasonCode: string,
): Promise<void> {
await expectToPassEventually(async () => {
const eventLogEntry = await getLogsFromCloudwatch(
Expand All @@ -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}\\"*"`,
],
);

Expand Down Expand Up @@ -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\"*"`,
],
);

Expand Down
Loading