# DAK-Datenschutz: Rollenbasierte Datenmaskierung ## Ziel DAK-Mitarbeiter (`dak_mitarbeiter`) duerfen personenbezogene Daten (Nachname, Vorname, Geburtsdatum) nicht einsehen. Die Maskierung erfolgt auf Backend-Ebene (DSGVO-konform). Bei Bedarf (z.B. KVNR-Fehler) kann ein DAK-Mitarbeiter eine zeitlich begrenzte Freigabe beim Admin anfordern. ## Architektur **Ansatz: Backend-Filterung** — Das Backend entfernt sensible Felder aus der API-Antwort fuer `dak_mitarbeiter`. Zwei Serialisierungspfade je nach Rolle. Kein Frontend-only-Masking, da technisch versierte Nutzer sonst per DevTools an die Daten kaemen. ## 1. Backend-Serialisierung ### Zwei Response-Pfade - **Admin:** Voller `CaseResponse` wie bisher (alle Felder). - **dak_mitarbeiter:** Felder `nachname`, `vorname`, `geburtsdatum` werden auf `null` gesetzt, es sei denn eine aktive Freigabe existiert. Zusaetzliches Feld `disclosure_granted: bool` in der Response. ### Suchfunktion Der `search`-Query-Parameter durchsucht aktuell: nachname, vorname, fall_id, kvnr. Fuer `dak_mitarbeiter` wird die Suche auf **fall_id und kvnr** beschraenkt. ## 2. Freigabe-Mechanismus (Disclosure Requests) ### Neues Modell: `DisclosureRequest` Tabelle `disclosure_requests`: | Feld | Typ | Beschreibung | |------|-----|-------------| | id | int (PK) | Auto-increment | | case_id | int (FK -> cases) | Betroffener Fall | | requester_id | int (FK -> users) | DAK-Mitarbeiter | | reason | str | Begruendung | | status | str | pending / approved / rejected | | reviewed_by | int (FK -> users, nullable) | Admin der entscheidet | | reviewed_at | datetime (nullable) | Zeitpunkt der Entscheidung | | expires_at | datetime (nullable) | 24h nach Genehmigung | | created_at | datetime | Anfragezeitpunkt | ### Ablauf 1. DAK-Mitarbeiter sieht Fall -> klickt "Personendaten anfordern" 2. Gibt Begruendung ein -> `POST /cases/{case_id}/disclosure-request` 3. Admin erhaelt Notification (Typ `disclosure_request`) 4. Admin sieht offene Anfragen unter `/admin/disclosures` 5. Admin genehmigt/lehnt ab -> `PUT /admin/disclosure-requests/{id}` 6. Bei Genehmigung: `expires_at` = now() + 24h 7. DAK-Mitarbeiter erhaelt Notification ueber Ergebnis 8. Backend prueft bei jedem Case-Abruf: aktive Freigabe vorhanden? -> Personendaten werden mitgeliefert ### Zeitliche Begrenzung Freigaben laufen nach 24 Stunden automatisch ab. Pruefung bei jedem API-Aufruf: `status == 'approved' AND expires_at > now()`. Kein Cronjob noetig. ## 3. Neue API-Endpoints | Methode | Route | Rolle | Beschreibung | |---------|-------|-------|-------------| | POST | `/cases/{case_id}/disclosure-request` | dak_mitarbeiter | Freigabe anfordern | | GET | `/admin/disclosure-requests` | admin | Offene Anfragen auflisten | | GET | `/admin/disclosure-requests/count` | admin | Anzahl offener Anfragen (Badge) | | PUT | `/admin/disclosure-requests/{id}` | admin | Genehmigen/Ablehnen | ### Bestehende Endpoints — Anpassungen - `GET /cases/`, `GET /cases/{id}`, `GET /cases/pending-icd` — Rollenpruefung, Feldern maskieren - Search-Parameter: nachname/vorname aus OR-Suche entfernen fuer dak_mitarbeiter ### Validierung - Doppelte pending-Anfrage fuer gleichen Fall/User -> 409 Conflict - Aktive (nicht abgelaufene) Freigabe existiert bereits -> 409 Conflict - Fall nicht gefunden -> 404 ## 4. Frontend-Anpassungen ### Fallliste (CasesPage) **dak_mitarbeiter:** - Spalten Nachname/Vorname komplett ausgeblendet (nicht gerendert) - Suchfeld-Placeholder: "Fall-ID, KVNR..." - Sichtbare Spalten: Datum, KVNR, Fallgruppe, ICD, Gutachten, Status **admin:** Keine Aenderung. ### Falldetail (CaseDetail Sheet) **dak_mitarbeiter:** - Felder nachname, vorname, geburtsdatum ausgeblendet - Ausnahme: Bei `disclosure_granted === true` -> Felder anzeigen mit Badge "Freigabe aktiv (laeuft ab um XX:XX)" - Button "Personendaten anfordern" -> Dialog mit Textfeld fuer Begruendung - Bei pending-Anfrage -> Button disabled mit "Anfrage ausstehend" **admin:** Keine Aenderung. ### Admin-Bereich - Neuer Sidebar-Eintrag: "Freigabe-Anfragen" (`/admin/disclosures`) mit Badge-Counter - Listenseite mit offenen Requests: Fall-ID, Anfragender User, Begruendung, Datum - Approve/Reject-Buttons pro Anfrage ### Notifications Bestehendes Notification-System wird erweitert: - DAK-Mitarbeiter: "Ihre Freigabe fuer Fall XYZ wurde genehmigt/abgelehnt" - Admin: "Neue Freigabe-Anfrage von [Username] fuer Fall XYZ"