Skip to content

ADR-0032: Organisationskonten, Org-Rollen, föderierter Stamm

Amendment (ADR-0051): Selbstanlage und der implizite Plattform-Operator (admin + tenant_id null) 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

  1. Organisationskonto = Control-Zeile tenants (UI: „Organisation“). Nicht organizations.
  2. Selbstanlage: ein eingeloggter User ohne tenant_id legt per POST /tenants ein Konto an und wird Org-Admin. Provisioning bleibt ADR-0031 (linetra_<slug>, {slug}_edit / {slug}_read).
  3. 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.
  4. 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.
  5. 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) ohne project_id. Alle Projekte der Org lesen/schreiben denselben Stamm (Dashboard Stammdaten, QGIS Value Relations).
  6. GIS bleibt projektbezogen: geo_objects.project_id (NOT NULL). Keine zweite Zentrumstabelle, die GIS-Produkte aus geo_objects zieht.
  7. Plattform-Operator (role=admin, tenant_id null) bleibt optional für Support. Der Normalweg ist Selbstanlage, nicht Settings-only durch einen Bootstrap-Admin.
  8. Lokal LINETRA_SHARED_DB=true: eine physische DB, mehrere logische Konten dürfen denselben dbname teilen. Keine User-DB linetra_<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_users und can_create_project nur 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_id NULL). Projektkopien nutzen dieselben Tabellen mit project_id + source_*_id und bidirektionalem Sync (ADR-0034) — kein zweites Akteur-Zentrum.