Skip to main content

Patient Portal Service — Event Schemas

Status: populated Owner: TBD Last updated: 2026-04-18 Companion: Service Template · 03 platform-services · 02 DDD

1. Overview

Transport: NATS JetStream via @ghasi/nats-client Envelope: CloudEvents v1.0 Stream: PATIENT_PORTAL Retention: All events carry tenantId; retention class varies by event type.


2. Published Events

2.1 portal.account.created.v1

NATS subject: PATIENT_PORTAL.account.created Retention: 7 days Trigger: New portal account registered and linked to patient identity.

{
"specversion": "1.0",
"id": "01JXXX",
"source": "ghasi/patient-portal",
"type": "portal.account.created.v1",
"datacontenttype": "application/json",
"time": "2026-04-18T10:00:00Z",
"tenantid": "TENANT_01J",
"data": {
"accountId": "pact_01JXXX",
"patientId": "pat_01JXXX",
"status": "pending_verification"
}
}

2.2 portal.account.suspended.v1

NATS subject: PATIENT_PORTAL.account.suspended Retention: 30 days Trigger: Admin suspends portal account.

{
"data": {
"accountId": "pact_01JXXX",
"patientId": "pat_01JXXX",
"actorId": "usr_01JYYY",
"reason": "Suspicious access pattern"
}
}

2.3 portal.account.closed.v1

NATS subject: PATIENT_PORTAL.account.closed Retention: 90 days Trigger: Account deletion request confirmed after retention check.

{
"data": {
"accountId": "pact_01JXXX",
"patientId": "pat_01JXXX",
"closedAt": "2026-04-18T12:00:00Z"
}
}

2.4 portal.login.v1

NATS subject: PATIENT_PORTAL.login Retention: 30 days Trigger: Successful patient authentication.

{
"data": {
"accountId": "pact_01JXXX",
"patientId": "pat_01JXXX",
"mfaUsed": true,
"channel": "web"
}
}

2.5 portal.result.viewed.v1

NATS subject: PATIENT_PORTAL.result.viewed Retention: 90 days Trigger: Patient views a lab or radiology result.

{
"data": {
"accountId": "pact_01JXXX",
"patientId": "pat_01JXXX",
"resourceType": "Observation",
"resourceId": "obs_01JXXX",
"actingAsProxy": false,
"occurredAt": "2026-04-18T10:00:00Z"
}
}

2.6 portal.appointment.requested.v1

NATS subject: PATIENT_PORTAL.appointment.requested Retention: 30 days Trigger: Patient submits an appointment request.

{
"data": {
"accountId": "pact_01JXXX",
"patientId": "pat_01JXXX",
"requestId": "apptreq_01JXXX",
"preferredProviderId": "prov_01JXXX",
"preferredFacilityId": "fac_01JXXX",
"requestedStart": "2026-05-01T09:00:00Z"
}
}

2.7 portal.demographics.update.requested.v1

NATS subject: PATIENT_PORTAL.demographics.update.requested Retention: 90 days Trigger: Patient submits a demographic update request.

{
"data": {
"accountId": "pact_01JXXX",
"patientId": "pat_01JXXX",
"requestId": "demreq_01JXXX",
"requestedAt": "2026-04-18T10:00:00Z"
}
}

2.8 portal.proxy.delegation.granted.v1

NATS subject: PATIENT_PORTAL.proxy.delegation.granted Retention: 90 days Trigger: Patient grants proxy/caregiver access.

{
"data": {
"delegationId": "pdel_01JXXX",
"grantorPatientId": "pat_01JXXX",
"proxyPortalAccountId": "pact_01JYYY",
"relationshipType": "parent",
"scope": ["read:record", "read:results"],
"validFrom": "2026-04-18",
"validTo": "2027-04-18"
}
}

2.9 portal.proxy.delegation.revoked.v1

NATS subject: PATIENT_PORTAL.proxy.delegation.revoked Retention: 90 days

{
"data": {
"delegationId": "pdel_01JXXX",
"actorId": "pact_01JXXX",
"revokedAt": "2026-04-18T12:00:00Z"
}
}

2.10 portal.export.requested.v1

NATS subject: PATIENT_PORTAL.export.requested Retention: 30 days

{
"data": {
"exportJobId": "expjob_01JXXX",
"accountId": "pact_01JXXX",
"patientId": "pat_01JXXX",
"includeResources": ["Patient","Condition","Observation","MedicationRequest"],
"from": "2020-01-01",
"to": "2026-04-18"
}
}

3. Consumed Events

SubjectSource ServiceWhy Consumed
IDENTITY.patient.registered.v1identity-serviceAuto-create portal account for new patient
SCHEDULING.appointment.status.updated.v1scheduling-servicePush notification to patient (appointment confirmed/cancelled)
LABORATORY.result.released.v1laboratory-servicePush notification to patient (new result available)
RADIOLOGY.report.released.v1radiology-servicePush notification to patient (imaging report ready)
TENANT.tenant.activated.v1tenant-serviceProvision default portal configuration for new tenant

4. Outbox Relay

All published events are written to the outbox table atomically within the triggering transaction and then relayed to NATS JetStream by the OutboxRelayWorker. This prevents dual-write failure and guarantees at-least-once delivery. Consumers must implement idempotent processing.