# backend-compliance Python/FastAPI service implementing the DSGVO compliance API: DSR, DSFA, consent, controls, risks, evidence, audit, vendor management, ISMS, change requests, document generation. **Port:** `8002` (container: `bp-compliance-backend`) **Stack:** Python 3.12, FastAPI, SQLAlchemy 2.x, Alembic, Keycloak auth. ## Architecture (target — Phase 1) ``` compliance/ ├── api/ # Routers (thin, ≤30 LOC per handler) ├── services/ # Business logic ├── repositories/ # DB access ├── domain/ # Value objects, domain errors ├── schemas/ # Pydantic models, split per domain └── db/models/ # SQLAlchemy ORM, one module per aggregate ``` See `../AGENTS.python.md` for the full convention and `../.claude/rules/architecture.md` for the non-negotiable rules. ## Run locally ```bash cd backend-compliance pip install -r requirements.txt export COMPLIANCE_DATABASE_URL=... # Postgres (Hetzner or local) uvicorn main:app --reload --port 8002 ``` ## Tests ```bash pytest compliance/tests/ -v pytest --cov=compliance --cov-report=term-missing ``` Layout: `tests/unit/`, `tests/integration/`, `tests/contracts/`. Contract tests diff `/openapi.json` against `tests/contracts/openapi.baseline.json`. ## Public API surface 404+ endpoints across `/api/v1/*`. Grouped by domain: `ai`, `audit`, `consent`, `dsfa`, `dsr`, `gdpr`, `vendor`, `evidence`, `change-requests`, `generation`, `projects`, `company-profile`, `isms`. Every path is a contract — see the "Public endpoints" rule in the root `CLAUDE.md`. ## Environment | Var | Purpose | |-----|---------| | `COMPLIANCE_DATABASE_URL` | Postgres DSN, `sslmode=require` | | `KEYCLOAK_*` | Auth verification | | `QDRANT_URL`, `QDRANT_API_KEY` | Vector search | | `CORE_VALKEY_URL` | Session cache | ## Don't touch Database schema, `__tablename__`, column names, existing migrations under `migrations/`. See root `CLAUDE.md` rule 3.