# RoggioApp - Personen Entitäten & Nextcloud Sync (OIDC) ## Das Problem Wir wollen Personen (`Persons`) als zentrale Knoten im Graph (Datenbank) modellieren. Aber die "Wahrheit" über den Login (Passwort, Rollen) soll in der Nextcloud (als Identity Provider) liegen. Stellen wir uns ein Bein, wenn wir in der Datenbank jetzt Personen anlegen, ohne dass die Nextcloud steht? ## Die Lösung: Entkopplung von "Identity" und "Profile" Wir trennen das Konzept "Wer bist du technisch?" von "Wer bist du in der realen Welt?". ### 1. Das Roggio-Profil (Die Person-Entität) In unserer Postgres-DB (Prisma) liegt das Modell `Person`. Dieses Modell enthält **nur Profil- und Geschäftsdaten**: * `firstName`, `lastName`, `phone` * `traits` (JSONB) für alles andere (Körpergröße für Leihräder, Essensvorlieben für Gruppen). * **Der Anker:** Ein Feld `ssoId` (Single-Sign-On ID). ### 2. Die Nextcloud-Identität (Der Identity Provider) In der Nextcloud liegen die sensiblen Login-Daten: * `username` (z.B. "sev") * `password` (gehasht) * `email` * `groups` (z.B. "admin", "kollektiv") ### Der Workflow (Wie beides zusammenspielt) Wir können jetzt sofort Personen in der Datenbank anlegen (z.B. Gäste, die sowieso keinen Nextcloud-Account bekommen). Wenn sich später ein Kollektiv-Mitglied über Nextcloud einloggt (OIDC), passiert folgendes: 1. Nextcloud sagt: *"Hier ist User 'sev' mit der OIDC-Sub-ID '12345' und der Email 'sev@...'."* 2. Unser Backend schaut in der `Person`-Tabelle nach: *"Habe ich eine Person mit `ssoId = '12345'` oder `email = 'sev@...'`?"* 3. Wenn Ja: Die Person ist authentifiziert und das Roggio-Profil wird mit der Sitzung verknüpft. 4. Wenn Nein (erster Login): Das Backend erstellt automatisch eine neue `Person` mit der `ssoId='12345'`. ## Fazit für die Entwicklung Wir können das Datenmodell jetzt zu 100% fertigbauen und verfeinern! Gäste existieren ohnehin nur in Roggio. Für das Kollektiv lassen wir einfach das Feld `ssoId` vorerst leer. Wenn wir Nextcloud anbinden, füllen wir die ID nach oder lassen sie beim ersten Login auto-matchen. Kein Bein gestellt!