Skip to content
Merged
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
1 change: 0 additions & 1 deletion .gitleaksignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,3 @@ d1c0a37078cbed4fbedae044e5cbafac71717af0:utils/utils/src/__tests__/key-generatio
f0eebf1356a699213340a45f64c6b990afcbb869:infrastructure/terraform/components/dl/ssm_parameter_mesh.tf:hashicorp-tf-password:11
e75d9e202c1fad2c9591c4fe0e411194bf19c8f6:infrastructure/terraform/components/dl/ssm_parameter_mesh_config.tf:hashicorp-tf-password:11
712ea0b0f178f5ffa7475bf7781ecd00b950cfbb:utils/utils/src/__tests__/key-generation-utils/jwk-key.test.ts:private-key:3
72c1f9356ce8773949204e60b6f787d667b1bd2b:utils/utils/src/__tests__/key-generation-utils/jwk-key.test.ts:private-key:3
Comment thread
nhsd-angel-pastor marked this conversation as resolved.
4 changes: 3 additions & 1 deletion README.md

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ WITH vars AS (
OR e.type LIKE '%.queue.digital.letter.read.%'
OR e.type LIKE '%.pdm.resource.submission.rejected.%'
OR e.type LIKE '%.pdm.resource.retries.exceeded.%'
OR e.type LIKE '%.messages.request.rejected.%' THEN 'Digital'
OR e.type LIKE '%.messages.request.rejected.%'
OR e.type LIKE '%.queue.digital.letter.unsuccessful.%' THEN 'Digital'
WHEN e.type LIKE '%.print.letter.transitioned.%'
OR e.type LIKE '%.print.file.quarantined.%'
OR e.type LIKE '%.print.invalid.attachment.received.%' THEN 'Print' ELSE NULL
Expand All @@ -23,14 +24,17 @@ WITH vars AS (
WHEN e.type LIKE '%.messages.request.rejected.%' THEN 'Failed'
WHEN e.type LIKE '%.print.file.quarantined.%' THEN 'Failed'
WHEN e.type LIKE '%.print.invalid.attachment.received.%' THEN 'Failed'
WHEN e.type LIKE '%.queue.digital.letter.unsuccessful.%' THEN 'Failed'
WHEN e.letterstatus = 'RETURNED' THEN 'Returned'
WHEN e.letterstatus = 'FAILED' THEN 'Failed'
WHEN e.letterstatus = 'DELIVERED' THEN 'Delivered'
WHEN e.letterstatus = 'REJECTED' THEN 'Rejected' ELSE NULL
END as status,
e.reasoncode,
COALESCE(
CASE WHEN e.type LIKE '%.messages.request.rejected.%' THEN e.reasontext END,
CASE
WHEN e.type LIKE '%.messages.request.rejected.%'
OR e.type LIKE '%.queue.digital.letter.unsuccessful.%' THEN e.reasontext END,
fcl.description,
e.reasontext,
e.reasoncode
Expand Down
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,12 +8,12 @@ properties:
$ref: ../defs/requests.schema.yaml#/properties/messageReference
senderId:
$ref: ../defs/requests.schema.yaml#/properties/senderId
failureCode:
$ref: ../defs/core.schema.yaml#/properties/failureCode
failureReason:
$ref: ../defs/core.schema.yaml#/properties/failureReason
reasonCode:
Comment thread
nhsd-angel-pastor marked this conversation as resolved.
$ref: ../defs/print.schema.yaml#/properties/reasonCode
reasonText:
$ref: ../defs/print.schema.yaml#/properties/reasonText
required:
- messageReference
- senderId
- failureCode
- failureReason
- reasonCode
- reasonText
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-11T09:16:35.071Z'
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
Comment thread
tdroza-nhs marked this conversation as resolved.
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,33 @@ const scenarios = [
'Unread',
senderId,
),
new ReportScenario(
'component-test-digitalLetterUnsuccessful',
CommunicationType.Digital,
[EventStatus.DigitalLetterNhsAppUnsuccessful],
'Failed',
senderId,
'CFR_CNSN_0001',
'Failed enrichment',
),
new ReportScenario(
'component-test-digitalLetterUnsuccessful-other-reason',
CommunicationType.Digital,
[EventStatus.DigitalLetterNhsAppUnsuccessfulOtherReason],
'Failed',
senderId,
'CFR_CNSN_0002',
'Letter failed to be delivered to NHS App',
),
new ReportScenario(
'component-test-itemDequeued-digitalLetterUnsuccessful',
CommunicationType.Digital,
[EventStatus.Unread, EventStatus.DigitalLetterNhsAppUnsuccessful],
'Failed',
senderId,
'CFR_CNSN_0001',
'Failed enrichment',
),
new ReportScenario(
'component-test-itemDequeued-digitalLetterRead',
CommunicationType.Digital,
Expand Down
25 changes: 25 additions & 0 deletions tests/playwright/helpers/event-builders.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {
DigitalLetterRead,
DigitalLetterUnsuccessful,
FileQuarantined,
InvalidAttachmentReceived,
ItemDequeued,
Expand Down Expand Up @@ -162,6 +163,30 @@ export function buildMessageRequestRejectedEvent(
} as MessageRequestRejected;
}

export function buildDigitalLetterUnsuccessfulEvent(
eventId: string,
time: string,
messageReference: string,
senderId: string,
reasonCode = 'CFR_CNSN_0001',
reasonText = 'Failed enrichment',
): DigitalLetterUnsuccessful {
const baseEvent = buildBaseEvent('queue', time);
return {
...baseEvent,
id: eventId,
type: 'uk.nhs.notify.digital.letters.queue.digital.letter.unsuccessful.v1',
dataschema:
'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-queue-digital-letter-unsuccessful-data.schema.json',
data: {
messageReference,
senderId,
reasonCode,
reasonText,
},
} as DigitalLetterUnsuccessful;
}

export function buildFileQuarantinedEvent(
eventId: string,
time: string,
Expand Down
35 changes: 35 additions & 0 deletions tests/playwright/helpers/report-helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { v4 as uuidv4 } from 'uuid';

import {
DigitalLetterRead,
DigitalLetterUnsuccessful,
FileQuarantined,
GenerateReport,
InvalidAttachmentReceived,
Expand All @@ -21,6 +22,7 @@ import {
PDMResourceSubmissionRejected,
PrintLetterTransitioned,
validateDigitalLetterRead,
validateDigitalLetterUnsuccessful,
validateFileQuarantined,
validateGenerateReport,
validateInvalidAttachmentReceived,
Expand All @@ -41,6 +43,7 @@ import eventPublisher from 'helpers/event-bus-helpers';
import expectToPassEventually from 'helpers/expectations';
import {
buildDigitalLetterReadEvent,
buildDigitalLetterUnsuccessfulEvent,
buildFileQuarantinedEvent,
buildInvalidAttachmentReceivedEvent,
buildItemDequeuedEvent,
Expand Down Expand Up @@ -72,6 +75,8 @@ export enum EventStatus {
DigitalMessageRequestRejected = 'MessageRequestRejected',
PrintFileQuarantined = 'FileQuarantined',
PrintInvalidAttachmentReceived = 'InvalidAttachmentReceived',
DigitalLetterNhsAppUnsuccessful = 'DigitalLetterNhsAppUnsuccessful',
DigitalLetterNhsAppUnsuccessfulOtherReason = 'DigitalLetterNhsAppUnsuccessfulOtherReason',
}
/**
* Utility class to proof the SQL logic to determine which status should be reported for a given message reference,
Expand Down Expand Up @@ -207,6 +212,36 @@ export function publishEventForScenario(scenario: ReportScenario) {
);
break;
}
case EventStatus.DigitalLetterNhsAppUnsuccessful: {
eventPublisher.sendEvents<DigitalLetterUnsuccessful>(
[
buildDigitalLetterUnsuccessfulEvent(
uuidv4(),
scenario.time,
scenario.messageReference,
scenario.senderId,
),
],
validateDigitalLetterUnsuccessful,
);
break;
}
case EventStatus.DigitalLetterNhsAppUnsuccessfulOtherReason: {
eventPublisher.sendEvents<DigitalLetterUnsuccessful>(
[
buildDigitalLetterUnsuccessfulEvent(
uuidv4(),
scenario.time,
scenario.messageReference,
scenario.senderId,
'CFR_CNSN_0002',
'Letter failed to be delivered to NHS App',
),
],
validateDigitalLetterUnsuccessful,
);
break;
}
default:
}
break;
Expand Down
Loading