Skip to main content

DOSE — Drug Orchestration and Service Engine

Purpose​

DOSE is a high-throughput middleware pipeline for the CLIC Subscription ecosystem (Optum RxPBR). It bridges upstream pharmacy benefit management clients and downstream RxClaim running on IBM AS/400.

One-sentence summary: An upstream client sends a JSON file → DOSE ingests, validates, transforms, and writes each record to RxClaim via the CAT API.

Phase 1 scope: GPI category, ADD action only. Upstream: CLIC only.

How it works​

DOSE is a 7-repo system, not a single application. Each repo owns a distinct responsibility:

4 Core Capabilities​

#CapabilityWhat it does
1Async BatchingIngestion gateway for high-volume drug list updates (20,000+ records, hundreds of fields). Supports initial submission, retry delta subsets, cancellation, and webhook patterns.
2Resilience & SanitizationQueue processing with at-least-once delivery. Ingestion Gateway → Validation → Processing → Dispatcher lifecycle with Accepted/Rejected/Queued/Success/Failed states.
3RxClaim EncapsulationMaps intent records to actionable RxClaim operations: ADD/CHANGE/TERM translation, field mapping via JOLT, product reactivation detection, Standard vs. Live attribute splitting.
4Centralized AuditingUnified audit trail linking each RxClaim change back to the originating upstream application, work order, and user.

Key interfaces​

FileManager-MS API​

EndpointMethodPurpose
/init-uploadPOSTStart upload — returns {uploadId, blobPath, sasUrl, expiry:30min}
/upload-ackPOSTConfirm blob upload — triggers Event Hub publish

DataProcessor-MS API​

EndpointMethodPurpose
/docs/rxdose/uiGETSwagger UI (port 8092)

RxClaim CAT API (downstream)​

DetailValue
EndpointPOST /v1/rxclaim/plan/gpi/
AuthOAuth2 Client Credentials + JWT Bearer
Rate limits75 msg/sec · 10k/hr · 30k/day · 2100ms SLA · 1MB max
GranularityOne HTTP call per record

Data it owns​

CollectionPurpose
upstream_jobOne document per file upload; tracks full job lifecycle
IntentRecordOne document per payload record; tracks per-record status
DeliveryAuditLogOne document per downstream CAT API call
spec_mappingLookup table: (productType, action) → blob storage path for JOLT spec
DatabaseSequencesAuto-increment counter for recordMeta.doseId
drugintent_publish_deadletterDead-letter for failed Kafka ack publishes

upstream_job lifecycle​

IntentRecord lifecycle​

Dependencies​

DependencyDirectionProtocolAuth
Azure Blob StorageRead + WriteAzure SDKSAS URL (client) / MSI (internal)
Azure Event HubRead + WriteSpring Cloud AzureMSI
External Kafka (kaas-prod-us)WriteKafka/mTLSJKS keystore/truststore
RxClaim CAT APIOutboundHTTPS RESTOAuth2 + JWT Bearer
MongoDB AtlasRead + WriteReactive MongoAzure Key Vault secrets
Azure Key VaultReadAzure SDKMSI