ADR-0032: Organisationskonten, Org-Rollen, föderierter Stamm
- Status: accepted (amended by ADR-0051)
- Datum: 2026-08-27
- Phase: Multi-Tenant
- Bezug: ADR-0023, ADR-0030, ADR-0031
Amendment (ADR-0051): Selbstanlage und der implizite Plattform-Operator (
admin+tenant_idnull) gelten nicht mehr. Sysadmins (is_system_admin) legen Organisationen an. Control-DB hält nur Metadaten. Föderierter Stamm und GIS-project_id(Punkte 3–6) bleiben.
Kontext
ADR-0031 provisioniert eine Postgres-Datenbank pro Control-Zeile tenants. Unklar blieb, wer ein Konto anlegt, welche Web-Rollen an der Organisation hängen, und ob Akteure/Produktarten pro Projekt oder pro Organisation leben. GIS-Layer (geo_objects) sind bereits projektbezogen.
Zwei verschiedene „Organisationen“ dürfen nicht in einer Tabelle landen: das Konto (Isolation, Mitarbeiter, Projekte) und der Akteur Firma/Gemeinde (ADR-0023).
Entscheidung
- Organisationskonto = Control-Zeile
tenants(UI: „Organisation“). Nichtorganizations. - Selbstanlage: ein eingeloggter User ohne
tenant_idlegt perPOST /tenantsein Konto an und wird Org-Admin. Provisioning bleibt ADR-0031 (linetra_<slug>,{slug}_edit/{slug}_read). - Mitgliedschaft: ein User gehört einer Organisation (
app_users.tenant_id). Org-Admin lädt Mitarbeiter mit Rolle admin / editor / reader (plus bestehende Fachrollen customer / authority / foreman). Rollen gelten an der Org, nicht global an der Plattform. - Nur Org-Admins legen Projekte an und löschen sie (
can_create_project). Editor/Admin arbeiten in Projekten; Reader liest. Editor darf Stamm + GIS, aber keine Mitarbeiter- oder Projekt-Anlage. - Föderierter Stamm (Org → Projekte, nicht Cross-Org): in der Org-DB eine zentrale Akteure-Tabelle (
persons/organizations/ Memberships) und eine zentrale Produkt-Stammtabelle (geo_object_kinds/ Schema-CMS-Kinds) ohneproject_id. Alle Projekte der Org lesen/schreiben denselben Stamm (Dashboard Stammdaten, QGIS Value Relations). - GIS bleibt projektbezogen:
geo_objects.project_id(NOT NULL). Keine zweite Zentrumstabelle, die GIS-Produkte ausgeo_objectszieht. - Plattform-Operator (
role=admin,tenant_idnull) bleibt optional für Support. Der Normalweg ist Selbstanlage, nicht Settings-only durch einen Bootstrap-Admin. - Lokal
LINETRA_SHARED_DB=true: eine physische DB, mehrere logische Konten dürfen denselbendbnameteilen. Keine User-DBlinetra_<username>, kein Postgres-User pro Person.
Web-Rolle ≠ DB-User. Postgres/QGIS weiter {slug}_edit / {slug}_read am Cert (ADR-0031).
Begründung (für dieses Setup)
Selbstanlage trifft den Soll-Ablauf (Login → Organisation → Mitarbeiter → Projekte). Föderation innerhalb der Org vermeidet doppelte Akteure/Produktarten je Projekt, ohne eine plattformweite Cross-Org-Tabelle (Isolation bleibt DB-pro-Konto). GIS mit project_id hält Planung/Normierung/Produkt-Geometrie trennbar. tenants als Konto-Noun lässt organizations der Akteure unangetastet (Product-planning-Check).
Verworfene Alternativen
| Alternative | Warum verworfen |
|---|---|
Konto-Tabelle organizations |
Akteur Firma/Gemeinde; zweite Mandantenart würde umbenennen müssen |
| Membership M:N User ↔ Org | Selbstanlage + Einladen reicht; ein User → eine Org |
Plattform-only Tenants-UI (rnsrk legt alle Konten an) |
Normalweg ist Selbstanlage |
Produkt-GIS ohne project_id |
Layer und Planung sind projektbezogen |
| Cross-Org-Zentrale für Akteure/Produkte | bricht DB-Isolation |
Postgres-User / DB linetra_<username> |
Isolationseinheit ist das Organisationskonto, nicht die Person |
| Eine Cluster-DB + RLS | Isolation war ADR-0030/0031: DB pro Konto |
Folgen
- ADR-0031 bleibt Provisioning und Control-Plane. Diese ADR setzt den Konto-Lebenszyklus und den Org-Stamm.
- Principal:
can_manage_usersundcan_create_projectnur für Org-Admin (role=admin), nicht für jeden Editor (can_edit). - Startup bindet ungebundene User nicht mehr automatisch an das Dev-Konto.
- QGIS-Status zeigt
Konto {name}; Layer weiter projektgefiltert; Value Relations auf Org-Stamm. - 2026-09: Zentrale Akteure bleiben in
persons/organizations(project_idNULL). Projektkopien nutzen dieselben Tabellen mitproject_id+source_*_idund bidirektionalem Sync (ADR-0034) — kein zweites Akteur-Zentrum.