CodamAIDocs
Themafertig

Was nach dem Löschen bleibt

Die Historie bleibt lesbar, einen Papierkorb (Soft-Delete) gibt es nicht, und ein Rollback holt gelöschte Objekte nicht zurück.

Ausprägungen
Historie lesbarkein Soft-Deletekein Wiederbeleben per Rollbacknicht auditiertes Modell → nichts bleibtneu anlegen aus der Historie

Worum es geht

CDMS löscht hart. Die Zeile verschwindet aus der Datenbank, und das Objekt ist für alle Anfragen weg: Lesen liefert 404, Suchen findet es nicht, Verweise darauf sind leer. Es gibt kein Feld „gelöscht“, keinen Papierkorb und keinen Endpunkt zum Wiederherstellen. Das nennt man: kein Soft-Delete.

Was bleibt, ist die Historie, sofern das Modell auditiert ist. Auditiert heißt: CDMS schreibt zu jeder Änderung eine Revision, also einen gespeicherten Stand mit Zeitpunkt und Urheber. Siehe Was auditiert wird.

Der Zeitstrahl eines Objekts

flowchart LR
    A["ADD<br/>angelegt"] --> M1["MOD<br/>geändert"] --> M2["MOD<br/>geändert"] --> D["DEL<br/>gelöscht"]
    D -.-> X["Lesen: 404<br/>Rollback: 404<br/>Historie: lesbar"]

Jede Revision hat einen Typ: ADD für das Anlegen, MOD für jede Änderung, DEL für das Löschen. Die DEL-Revision sagt, wer wann gelöscht hat. Ihre Felder sind leer, außer der id. Den letzten Inhalt vor dem Löschen findest du in der Revision davor.

Die Historie nach dem Löschen

Die Historie liest du wie bei einem bestehenden Objekt, mit seiner id:

Historie eines gelöschten Auftrags
Anfrage
POST /api/rest/order/7e1…/history
{ "response": ["id", "orderNr", "price"] }
Antwort
{ "data": [
    { "revision": { "id": "7e1…", "orderNr": null, "price": null },
      "revisionMeta": { "ref": 57, "username": "ben", … },
      "revisionType": "DEL" },
    { "revision": { "id": "7e1…", "orderNr": "A-1000", "price": 120.5 },
      "revisionMeta": { "ref": 42, "username": "anna", … },
      "revisionType": "MOD" },
    { "revision": { "id": "7e1…", "orderNr": "A-1000", "price": 90.8 },
      "revisionMeta": { "ref": 17, "username": "anna", … },
      "revisionType": "ADD" }
  ],
  "meta": { … } }

Dafür brauchst du die Leserolle und die Historienrolle des Modells, und das Modell muss den History-Endpunkt haben. Siehe Historie lesen.

Was bleibt, was weg ist

Nach dem Löschen
Auditiertes Modell
mit Historie
  • das Objekt ist weg
  • die Historie bleibt: alle Revisionen bis zur Löschung
  • wer wann gelöscht hat
  • abhängige Kinder: jedes mit eigener Historie, sofern ihr Modell auditiert ist
  • Dateiinhalt und Versionen sind weg
Nicht auditiertes Modell
ohne Historie
  • das Objekt ist weg
  • es bleibt nichts davon in CDMS
  • Dateiinhalt ist weg

Zu Dateien siehe Datei-Modelle löschen.

Kein Rollback für Gelöschtes

Ein Rollback setzt ein bestehendes Objekt auf den Stand einer älteren Revision zurück. Für ein gelöschtes Objekt geht das nicht:

  1. 1
    Client→CDMS
    schickt POST /order/7e1…/rollback/42
  2. 2
    CDMS
    sucht das Objekt mit den Filtern des Lesens
  3. 3
    CDMS→Client
    gibt es nicht mehr → 404 not-found|<Dto>|<id>
    Ergebnis: Nichts wird angelegt. Die Historie bleibt unverändert.

Ein Objekt behält seine id für immer, und eine gelöschte id wird nicht neu vergeben. Deshalb kann CDMS ein gelöschtes Objekt nicht unter seiner alten id zurückholen. Siehe Auf einen alten Stand zurücksetzen.

Einen alten Stand neu anlegen

Brauchst du ein gelöschtes Objekt wieder, lege es neu an:

  1. 1
    Client→CDMS
    liest die Historie und nimmt die Revision vor der DEL-Revision
  2. 2
    Client→CDMS
    schickt deren Felder ohne id an POST /order/create
  3. 3
    CDMS→Database
    legt ein neues Objekt an
    Ergebnis: Das neue Objekt hat eine neue id, ein neues _createdOn und eine eigene, neue Historie. Die alte Historie bleibt unter der alten id. Abhängige Kinder und Dateiinhalte musst du ebenso neu anlegen.

Fallen

Wie es weitergeht

Quellen im Code und in der Wissensdatenbank
  • CDMS/cdms-persistence-database – AbstractDatabasePersistence.deleteObject (em.remove), AuditHistoryReader.queryHistory (forRevisionsOfEntity mit gelöschten), historyRollback (history-entity-deleted)
  • CDMS/cdms-system-layer – AbstractLayer.queryHistory, AbstractSystemLayer.historyRollback (assertVisibleForWrite)
  • CDMS/cdms-integrationtest – AbstractAuditTrailTest.createPatchDeleteAreEachRecorded
  • documentation/50-auditierung/01-auditing-und-historie.md
Suchen