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
| # | Capability | What it does |
|---|
| 1 | Async Batching | Ingestion gateway for high-volume drug list updates (20,000+ records, hundreds of fields). Supports initial submission, retry delta subsets, cancellation, and webhook patterns. |
| 2 | Resilience & Sanitization | Queue processing with at-least-once delivery. Ingestion Gateway → Validation → Processing → Dispatcher lifecycle with Accepted/Rejected/Queued/Success/Failed states. |
| 3 | RxClaim Encapsulation | Maps intent records to actionable RxClaim operations: ADD/CHANGE/TERM translation, field mapping via JOLT, product reactivation detection, Standard vs. Live attribute splitting. |
| 4 | Centralized Auditing | Unified audit trail linking each RxClaim change back to the originating upstream application, work order, and user. |
Key interfaces
FileManager-MS API
| Endpoint | Method | Purpose |
|---|
/init-upload | POST | Start upload — returns {uploadId, blobPath, sasUrl, expiry:30min} |
/upload-ack | POST | Confirm blob upload — triggers Event Hub publish |
DataProcessor-MS API
| Endpoint | Method | Purpose |
|---|
/docs/rxdose/ui | GET | Swagger UI (port 8092) |
RxClaim CAT API (downstream)
| Detail | Value |
|---|
| Endpoint | POST /v1/rxclaim/plan/gpi/ |
| Auth | OAuth2 Client Credentials + JWT Bearer |
| Rate limits | 75 msg/sec · 10k/hr · 30k/day · 2100ms SLA · 1MB max |
| Granularity | One HTTP call per record |
Data it owns
| Collection | Purpose |
|---|
upstream_job | One document per file upload; tracks full job lifecycle |
IntentRecord | One document per payload record; tracks per-record status |
DeliveryAuditLog | One document per downstream CAT API call |
spec_mapping | Lookup table: (productType, action) → blob storage path for JOLT spec |
DatabaseSequences | Auto-increment counter for recordMeta.doseId |
drugintent_publish_deadletter | Dead-letter for failed Kafka ack publishes |
upstream_job lifecycle
IntentRecord lifecycle
Dependencies
| Dependency | Direction | Protocol | Auth |
|---|
| Azure Blob Storage | Read + Write | Azure SDK | SAS URL (client) / MSI (internal) |
| Azure Event Hub | Read + Write | Spring Cloud Azure | MSI |
External Kafka (kaas-prod-us) | Write | Kafka/mTLS | JKS keystore/truststore |
| RxClaim CAT API | Outbound | HTTPS REST | OAuth2 + JWT Bearer |
| MongoDB Atlas | Read + Write | Reactive Mongo | Azure Key Vault secrets |
| Azure Key Vault | Read | Azure SDK | MSI |