Skip to main content

Medication Service — Local Dev Setup

Status: populated Owner: TBD Last updated: 2026-04-17 Companion: Service Template

1. Prerequisites

ToolVersion
Node22 LTS
pnpm9.x
Docker + Compose24+
psql16 (for direct DB)

2. Bring-up

cd services/medication-service
pnpm install
cp .env.example .env
docker compose up -d postgres nats redis
pnpm db:migrate
pnpm db:seed
pnpm dev

Service listens on http://localhost:4130 by default.

3. docker-compose services

postgres: ghcr.io/ghasi/pg16-rls:latest # preloaded RLS helpers
nats: nats:2.10-alpine --jetstream
redis: redis:7-alpine
vault-dev: hashicorp/vault:1.16 (dev mode)
mock-fhir: ghcr.io/ghasi/mock-fhir:latest # mocks chart/terminology/gateway

4. Seed Data

pnpm db:seed loads:

  • 2 tenants (ten_demo_afg_01, ten_demo_uae_01).
  • 10 patients per tenant.
  • 150 RxNorm medications, WHO EML subset.
  • 3 pharmacy locations per tenant (1 inpatient, 1 outpatient, 1 retail).
  • 200 stock items with varied lots/expiries (some near-expiry, one recalled lot).
  • 5 prescribers, 3 pharmacists, 1 pharmacist-in-charge per tenant.

5. Common Commands

CommandPurpose
pnpm devStart dev server (watch)
pnpm testUnit tests
pnpm test:intIntegration tests (docker required)
pnpm test:e2eE2E flows
pnpm db:migrateDrizzle migration
pnpm db:seedSeed dev data
pnpm openapi:genRegenerate openapi.json
pnpm pact:publishPublish consumer pacts
pnpm outbox:replay --since 1hManual outbox replay

6. Environment Variables

VarExample
DATABASE_URLpostgres://...:5432/medication
NATS_URLnats://localhost:4222
REDIS_URLredis://localhost:6379
IDENTITY_JWKS_URLhttp://localhost:4100/.well-known/jwks.json
FHIR_CHART_BASE_URLhttp://localhost:4200/fhir/R4
TERMINOLOGY_BASE_URLhttp://localhost:4300
EPRESCRIBING_GATEWAY_BASE_URLhttp://localhost:4140
DRUG_KB_BASE_URLhttp://localhost:4500/mock-kb
NCPDP_ENABLEDfalse
OTEL_EXPORTER_OTLP_ENDPOINThttp://localhost:4318

Validated via Zod at startup; missing variables fail fast.