Skip to main content

Care Plan Service — Application Logic

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

Use Cases — Commands

Use caseFileTriggerEmits event
CreateCarePlanUseCasecreate-care-plan.use-case.tsPOST /api/v1/care-planscare_plan.care_plan.created.v1
UpdateCarePlanUseCaseupdate-care-plan.use-case.tsPATCH /api/v1/care-plans/:idcare_plan.care_plan.updated.v1
ActivateCarePlanUseCaseactivate-care-plan.use-case.tsPOST /api/v1/care-plans/:id/activatecare_plan.care_plan.updated.v1
ReviewCarePlanUseCasereview-care-plan.use-case.tsPOST /api/v1/care-plans/:id/reviewcare_plan.care_plan.reviewed.v1
CloseCarePlanUseCaseclose-care-plan.use-case.tsPOST /api/v1/care-plans/:id/closecare_plan.care_plan.updated.v1
AddGoalUseCaseadd-goal.use-case.tsPOST /api/v1/care-plans/:id/goalscare_plan.goal.created.v1
UpdateGoalUseCaseupdate-goal.use-case.tsPATCH /api/v1/care-plans/:id/goals/:goalIdcare_plan.goal.updated.v1
AddActivityUseCaseadd-activity.use-case.tsPOST /api/v1/care-plans/:id/activitiescare_plan.activity.created.v1
CompleteActivityUseCasecomplete-activity.use-case.tsPOST /api/v1/care-plans/:id/activities/:actId/completecare_plan.activity.completed.v1
UpdateCareTeamUseCaseupdate-care-team.use-case.tsPUT /api/v1/care-plans/:id/care-teamcare_plan.care_team.updated.v1

Use Cases — Queries

Use caseFileReturns
GetCarePlanUseCaseget-care-plan.use-case.tsFull CarePlan with goals, activities, team
ListCarePlansUseCaselist-care-plans.use-case.tsPaginated CarePlanSummary[]
GetCarePlanFhirUseCaseget-care-plan-fhir.use-case.tsFHIR CarePlan resource for fhir-gateway
SearchGoalsFhirUseCasesearch-goals-fhir.use-case.tsFHIR Bundle of Goal resources

Ports (Interfaces)

PortFileDirection
CarePlanRepositorycare-plan.repository.port.tsOutbound — Postgres via Drizzle
EventPublisherevent-publisher.port.tsOutbound — NATS JetStream outbox
AuditClientaudit-client.port.tsOutbound — audit-service
TerminologyClientterminology-client.port.tsOutbound — terminology-service (validate codings)
ProviderDirectoryClientprovider-directory-client.port.tsOutbound — provider-directory-service (validate practitioners)
FhirMapperfhir-mapper.port.tsInternal — maps domain entities to FHIR resources

Orchestration Flows

Create Care Plan

Review Care Plan

Complete Activity

Saga / Outbox Pattern

All domain events use the transactional outbox:

  1. Domain event is inserted into outbox table in the same database transaction as the entity mutation.
  2. OutboxRelayWorker polls outbox at 500 ms intervals; publishes to NATS JetStream.
  3. On successful NATS publish, outbox row is marked published.
  4. If NATS is unavailable, messages accumulate; relay retries with exponential backoff (max 5 min).
  5. Dead-letter entries alert on-call after 15 min without publish.

Error Handling

Error conditionHTTP codeError code
Plan not found404CARE_PLAN_NOT_FOUND
Stale version409VERSION_CONFLICT
Plan is closed (immutable)409CARE_PLAN_CLOSED
Invalid status transition422INVALID_STATUS_TRANSITION
Module not licensed403MODULE_NOT_LICENSED
Validation failure (coding)422INVALID_CODING
Missing required field400VALIDATION_ERROR
Cross-tenant access attempt403TENANT_ISOLATION_VIOLATION