CodamAIDocs
Themafertig

Listen als Zielzustand

Eine Liste im Payload beschreibt, wie die Liste danach aussehen soll. Hier steht, was mit Mitgliedern passiert, die nicht mehr vorkommen.

Ausprägungen
entfernt mit DELETE-Flag → gelöschtentfernt ohne DELETE-Flag → entkoppeltn:m: Verbindung gelöst, auch mit DELETE-Flagneue Mitgliederleere ListeListe fehlt: PUT vs. PATCHReihenfolgedoppelte Einträge

Worum es geht

Schickst du ein Listenfeld mit, etwa employees an einer Firma, beschreibt die Liste den Zustand danach: Genau diese Mitglieder soll die Liste haben. Die Liste ist also kein „füge hinzu“, sondern ein Zielzustand.

Vorher und nachher

flowchart LR
    subgraph vorher ["vorher: employees"]
      A1[Anna]
      B1[Ben]
      C1[Cem]
    end
    subgraph payload ["im Request"]
      A2["{ id: Anna }"]
      C2["{ id: Cem }"]
      D2["{ firstname: Dora }"]
    end
    subgraph nachher ["nachher: employees"]
      A3[Anna]
      C3[Cem]
      D3["Dora (neu)"]
    end
    vorher --> payload --> nachher
Mitgliedvorherim Requestnachher
Annajamit idbleibt
Benjafehltfliegt raus: gelöscht (DELETE-Flag) oder entkoppelt
Cemjamit idbleibt
Doraneinohne idwird angelegt (braucht CREATE)

Was mit einem entfernten Mitglied passiert

Ben fällt aus der Liste

Wann: Die Beziehung employees hat das DELETE-Flag, Ben ist ein abhängiges Kind.

  1. 1
    CDMS
    prüft die Löschrolle des Mitarbeiter-Modells
  2. 2
    Hook
    DELETE-Hooks von Ben laufen
  3. 3
    CDMS→Database
    löscht Ben, mit seinen eigenen abhängigen Kindern und Dateien

Ergebnis: Ben gibt es nicht mehr, read liefert 404.

Wann: Die Beziehung items einer Rechnung hat kein DELETE-Flag, die Positionen sind eigenständig.

  1. 1
    CDMS→Database
    setzt bei der Position das Feld der Gegenseite auf leer, also sponsorInvoice = null
  2. 2
    CDMS
    die Position selbst bleibt bestehen

Ergebnis: Die Position ist entkoppelt: Sie existiert weiter, gehört aber zu keiner Rechnung mehr. Eine Rolle am Positionsmodell braucht das nicht.

Wann: Eine Rolle wird aus groups entfernt, die Beziehung hat kein DELETE-Flag.

  1. 1
    CDMS→Database
    löscht die Zeile in der Verbindungstabelle

Ergebnis: Beide Objekte bleiben, nur ihre Verbindung ist weg.

Wann: Eine Rolle wird aus roles einer Gruppe entfernt, die Beziehung hat das DELETE-Flag.

  1. 1
    CDMS→Database
    löscht die Zeile in der Verbindungstabelle, genau wie ohne Flag

Ergebnis: Die Rolle bleibt, auch für alle anderen Gruppen. An n:m wirkt DELETE nicht, weil das Mitglied weiteren Partnern gehören kann. Siehe Many-to-Many über eine Verbindungstabelle.

Die Liste Schritt für Schritt

Wie CDMS eine Liste abgleicht
  1. 1
    CDMS
    sammelt die ids aller Einträge im Request
  2. 2
    CDMS
    nimmt jedes bisherige Mitglied, dessen id nicht dabei ist, aus der Liste: löschen (DELETE) oder entkoppeln
  3. 3
    CDMS
    Einträge mit id: verknüpfen oder mitändern, je nach Flag und Verb
  4. 4
    CDMS
    Einträge ohne id: neu anlegen, wenn die Beziehung CREATE hat
  5. 5
    CDMS→Database
    speichert alles in einer Transaktion

Wie Einträge mit und ohne id behandelt werden, steht unter Die vier Fälle beim verschachtelten Schreiben.

Leere Liste, fehlende Liste

Was eine Liste im Request bewirkt
VerbListenfeld im RequestErgebnis
PUTfehltalle Mitglieder raus
PUTnull oder []alle Mitglieder raus
PATCHfehltunverändert
PATCHnull oder []alle Mitglieder raus
PUT, PATCHTeillistegenau diese Mitglieder
Createfehlt, null oder []leere Liste

„Raus“ heißt bei jedem Mitglied: löschen mit DELETE-Flag, sonst entkoppeln.

Reihenfolge und doppelte Einträge

  • Reihenfolge: Eine Liste in CDMS ist eine Menge, ohne Position. Die Reihenfolge im Request wird nicht gespeichert. Beim Lesen bestimmst du sie mit order in der response der Liste, sonst ist sie nicht festgelegt. Siehe Filter in verschachtelten Listen.
  • Doppelte Einträge: Zwei gleiche Einträge ohne id legen bei Create und PUT zwei Objekte an, bei PATCH eins. Dieselbe id zweimal mit verschiedenen Werten: der letzte Eintrag gewinnt. Schicke jedes Mitglied nur einmal.

Fallen

Wie es weitergeht

Quellen im Code und in der Wissensdatenbank
  • CDMS/cdms-system-layer – AbstractLayer.reduceToTargetState, detachOrDeleteMember, removeBackReference, recursiveDelete, recursiveUpdate/recursivePatch (Listen), fetchAndSetList (order)
  • CDMS/cdms-integrationtest – AbstractUpdateTest (updateOneToManyListRecursiveDeleteReallyDeletes), AbstractRecursiveUpdate, AbstractRecursivePatch, AbstractManyToManyTest; Probe gegen SponsorInvoice, Group, system Role/Group
  • documentation/20-api/04-schreibsemantik.md
Suchen