# Mosenioring Backend Production-ready Kotlin/Spring Boot 3 modular monolith skeleton for patient-caregiver-doctor coordination. ## Requirements - Java 21 - Docker + Docker Compose ## Local run 1) Start dependencies: ```bash docker compose up -d ``` 2) Run the API (local profile, local auth enabled): ```bash SPRING_PROFILES_ACTIVE=local \ ALLOW_LOCAL_AUTH=true \ ./gradlew :app:bootRun ``` ```bash SPRING_PROFILES_ACTIVE=dev \ ALLOW_LOCAL_AUTH=false \ ./gradlew :app:bootRun ``` 3) (Optional) Run the worker: ```bash ./gradlew :workers:notification-worker:bootRun ``` Required env flags (local/dev): - `SPRING_PROFILES_ACTIVE=local` - `ALLOW_LOCAL_AUTH=true` (enables local auth headers) - `KEYCLOAK_ISSUER_URI=http://localhost:8081/realms/mosenioring` (if using Keycloak) - Frontend should set `USE_LOCAL_AUTH=true` when using local auth headers. ## Auth - The backend is a JWT resource server and does not handle user passwords. - Local auth shortcut is available only when `SPRING_PROFILES_ACTIVE=local` and `ALLOW_LOCAL_AUTH=true`. Local headers (dev only): - `X-Local-Email`: user id/email - `X-Local-Roles`: comma-separated roles (ADMIN, DOCTOR, CAREGIVER) - `X-Tenant-Id`: tenant id ## OpenAPI - http://localhost:8080/swagger-ui/index.html ## Health - http://localhost:8080/health ## Key services - Postgres: localhost:5432 (mosenioring/mosenioring) - Keycloak: http://localhost:8081 (admin/admin) - RabbitMQ: http://localhost:15672 (guest/guest) - MinIO: http://localhost:9001 (minio/minio123) ## Notes - Tenant ID is enforced via `TenantFilter` using JWT claim `tenant_id`, or `X-Tenant-Id` header (local). - Medication plan creation publishes a `MedicationPlanCreated` outbox event. - Worker consumes and emits `NotificationRequested` events with idempotency via Redis.