CodamAIDocs
Themafertig

Die Endpunkte

Alle HTTP-Routen von CRMS unter /crms: rendern, Vorlagen bearbeiten und freigeben, endgültige Dokumente lesen und prüfen. Wo sie laufen, was sie annehmen und wer sie aufrufen darf.

Ausprägungen
Rendern: render, validate, capabilitiesVorlagen: Ausgaben, Varianten, Entwurf, Freigabe, Revisionen, KetteDokumente: lesen, auflisten, prüfen, Legal Hold, löscheneingebettet mit crms-rest, eingebettet ohne, entfernt, eigener Dienst

Worum es geht

CRMS bietet seine Funktionen über HTTP an, alle unter dem Pfad /crms. Das übernimmt die HTTP-Schnittstelle von CRMS. Sie ist ein Adapter: Sie liest eine Anfrage, ruft die passende Funktion eines CRMS-Moduls auf und schreibt die Antwort. Eigene Fachlogik hat sie nicht.

Wo die Routen laufen

Die Routen gibt es dort, wo CRMS eingebettet läuft, also im selben Prozess wie die Anwendung, und die HTTP-Schnittstelle von CRMS auf dem Klassenpfad liegt. Der eigene CRMS-Dienst bringt sie immer mit.

Gibt es /crms in dieser Anwendung?
Eingebettet mit HTTP-SchnittstelleEingebettet ohne HTTP-SchnittstelleEntferntDer CRMS-Dienst selbst
CRMS läuftim Prozess der Anwendungim Prozess der Anwendungals eigener Dienstals eigener Dienst
HTTP-Schnittstelleim Buildnicht im Buildverboten, der Start schlägt fehlimmer dabei
Routen /crms/**ja, hinter der Sicherheitskette der Anwendungnein, die Anwendung ruft CRMS nur im Code aufnein, die Anwendung nutzt crms-clientja

Bei der Betriebsart entfernt würde die Anwendung den CRMS-Dienst sonst unter eigenen Routen weiterreichen, hinter ihrer eigenen Sicherheit. Darum lehnt der Start die HTTP-Schnittstelle dort ab. Mehr zu den Betriebsarten unter Eingebettet oder getrennt.

Der Weg einer Anfrage

Eine Anfrage an /crms
  1. CIAS
    Sicherheitskette
    Ist das Token gültig? CIAS legt Person, Mandant und Rollen fest.
    ↳ nein 401
  2. CRMS
    Anfrage lesen
    Gibt es eine angemeldete Person? Ist der Körper JSON, nicht zu groß, sind alle Felder bekannt und vom richtigen Typ?
    ↳ nein 401 crms-authentication-required, 400 malformed-json, 413, 415 oder 422 validation-failed
  3. CRMS
    Rolle und Sichtbarkeit
    Hat die Person die nötige Rolle, und sieht sie das Objekt?
    ↳ nein 403 oder 404
  4. Das Modul führt die Funktion aus, die Antwort geht zurück

Die HTTP-Schnittstelle liest selbst kein Token. Die Person kommt über CIAS, siehe Die Rollen.

Rendern

RouteKörperAntwortWer
POST /crms/renderdie Render-Anfragedie Bytes des Dokumentsjede angemeldete Person, für Vorlagen, die sie sieht
POST /crms/render/validatedie Render-Anfrage200 {"violations": [...]}, leer heißt gültigwie oben
GET /crms/capabilities–was diese Installation anbietetCRMS prüft keine Person, es gilt die Sicherheitskette der Anwendung

Fürs Rendern braucht es keine eigene Rolle. Es reicht, angemeldet zu sein und die Vorlage sehen zu dürfen. Welche Vorlage eine Anfrage findet, steht unter Wie eine Vorlage gefunden wird, die Felder der Anfrage unter Die Render-Anfrage.

Anfrage
POST /crms/render
Content-Type: application/json

{ "template": "audit-report", "format": "PDF", "mode": "FINAL",
  "reference": "audit-4711", "locale": "de-DE",
  "data": { "customer": { "name": "ACME" } } }
Antwort
200
Content-Type: application/pdf
Content-Disposition: inline; filename="audit-report.pdf"
Crms-Template-Key: audit-report
Crms-Template-Scope: TENANT          ← welche Ausgabe gewonnen hat
Crms-Template-Variant: de-DE         ← welche Sprachvariante
Crms-Template-Revision: 3f1c…        ← welche Revision der Vorlage
Crms-Template-Revision-Hash: sha-256:…
Crms-Document-Revision: 9a7e…        ← nur bei FINAL
X-Content-Type-Options: nosniff

<die Bytes des PDF>

/crms/render/validate prüft dieselbe Anfrage, ohne zu rendern. GET /crms/capabilities nennt die Formate, das Standard-PDF-Profil, die zugelassenen Scopes, die Sprachen, ob endgültige Dokumente gespeichert werden (documentRevisions), ob flüchtige Dokumente erlaubt sind (transientDocuments), und die Grenzen (timeout, maxOutputBytes, maxPayloadBytes, maxAttachmentCount, maxAttachmentBytes).

Vorlagen

Diese Routen nutzt ein Vorlagen-Editor. Jede Route ruft genau eine Funktion des Vorlagen-Moduls auf. Sehen heißt: die Vorlage gehört zum System, zu deinem Mandanten oder dir selbst. Schreiben heißt: zusätzlich die Schreibrolle des Scopes der Ausgabe. Prüfen heißt: die Rolle der aktuellen Freigabestufe.

RouteKörperAntwortWer
GET /crms/templates–die Ausgaben, die du siehstsehen
POST /crms/templateskey, outputType, scope, defaultLocale201 die Ausgabe, mit Locationschreiben
GET /crms/templates/{edition}–die Ausgabesehen
GET /crms/templates/{edition}/variants–ihre Varianten, die Standardsprache zuerstsehen
POST /crms/templates/{edition}/variantslocale201 die Varianteschreiben
GET /crms/variants/{variant}/draft–der Entwurf, oder 204 ohne Entwurfschreiben
PUT /crms/variants/{variant}/draftexpectedVersion, contentder gespeicherte Entwurfschreiben
GET /crms/variants/{variant}/draft/assets/{name}–ein Asset des Entwurfs, als Downloadschreiben
POST /crms/revisions/{revision}/draftexpectedVersionder Entwurf mit dem Inhalt dieser Revisionschreiben
POST /crms/variants/{variant}/submitreason (optional)die neue Revisionschreiben
POST /crms/revisions/{revision}/approve–die Revision danachprüfen
POST /crms/revisions/{revision}/rejectreasondie Revision danachprüfen
POST /crms/variants/{variant}/rollbacktarget, reason (optional)die neue, veröffentlichte Revisionschreiben
POST /crms/variants/{variant}/retirereason (optional)204schreiben
GET /crms/variants/{variant}/revisions–alle Revisionen, die älteste zuerstsehen
GET /crms/variants/{variant}/trail–jeder Eintrag der Kette, mit allen Hashessehen
POST /crms/variants/{variant}/verify–{"intact": true} oder {"intact": false, "brokenAt": 7}sehen
GET /crms/revisions/{revision}/content–der Inhalt der Revision, Assets beschriebensehen
GET /crms/revisions/{revision}/assets/{name}–ein Asset der Revision, als Downloadsehen

Ein paar Regeln gelten für alle Vorlagenrouten:

  • Ein Entwurf wird immer ganz gespeichert. content ersetzt den alten Inhalt, mit source, fields und allen assets als Base64. Base64 ist eine Schreibweise, die Bytes als Text darstellt.
  • expectedVersion ist die Version des Entwurfs, auf der deine Änderung aufbaut, 0 für keinen. Hat jemand anderes inzwischen gespeichert, antwortet CRMS mit 409 template-draft-changed.
  • Ob ein Grund Pflicht ist, entscheidet die Installation. Beim Zurückweisen ist er immer Pflicht.
  • Der Körper ist begrenzt, Standard 16 MiB, einstellbar über CODAMAI_CRMS_REST_TEMPLATE_MAX_BYTES. Darüber: 413 request-too-large|<Grenze>.
  • Assets kommen als Download (Content-Disposition: attachment) mit X-Content-Type-Options: nosniff und Content-Security-Policy: sandbox. So kann ein SVG im Browser keine Skripte auf der Seite der Anwendung ausführen.

Den ganzen Ablauf von Entwurf bis Veröffentlichung beschreiben Der Lebenszyklus einer Vorlage und Die Freigabe.

Dokumente

Diese Routen arbeiten mit endgültigen Dokumenten. Die Rolle prüft das Archiv, bevor es etwas nachschlägt, genauso wie bei einem eingebetteten Aufruf.

RouteRolleAntwort
GET /crms/documents?template=…&scope=…&reference=…lesendie Revisionen der Kette, die älteste zuerst
GET /crms/documents/{revision}lesendie Bytes des Dokuments, inline
POST /crms/documents/{revision}/verifylesen{"ok": true} oder {"ok": false, "problem": "<Schlüssel>"}
POST /crms/documents/{revision}/legal-holdLegal Hold204
POST /crms/documents/{revision}/legal-hold/releaseLegal Hold204
POST /crms/documents/{revision}/eraselöschen204
  • Beim Auflisten sind alle drei Parameter Pflicht. Fehlt einer, kommt 422 validation-failed mit der Regel required.
  • Die drei ändernden Routen brauchen einen Körper {"reason": "litigation-hold"}. Der Grund ist ein Schlüssel in kebab-case, kein freier Text, denn er landet in einer Kette, die nie gelöscht wird. Freier Text ergibt 422 validation-failed.
  • Das Lesen liefert die ganze Beschreibung der Revision in Kopfzeilen mit: Crms-Document-Revision, Crms-Document-Number, Crms-Document-Format, Crms-Document-Stored-At, Crms-Document-Retain-Until, Crms-Document-Legal-Hold, Crms-Document-Content-Hash und die Crms-Template-*-Kopfzeilen wie beim Rendern.
  • Das Archiv arbeitet immer im Mandanten der anfragenden Person und vermerkt sie als Handelnde.

Was Prüfen, Legal Hold und Löschen fachlich bedeuten, steht unter Prüfen und exportieren und Aufbewahrung, Legal Hold und Löschen.

Regeln für alle Routen

RegelWas sie bedeutet
Nur bekannte FelderEin unbekanntes Feld im Körper ergibt die Regel not-allowed. Doppelte Schlüssel und Text nach dem JSON-Objekt ergeben malformed-json.
Kein stilles Umwandeln"5" ist keine Zahl. Ein Wert mit falschem JSON-Typ ist invalid. null zählt wie ein fehlendes Feld.
Eine Schreibweise je IDIDs im Pfad sind UUIDs in der üblichen Langform, klein oder groß geschrieben. Kurzformen wie 1-1-1-1-1 ergeben invalid, mit dem Namen der Pfadvariablen als Feld.
Text statt Zahlen und ObjekteZeiten sind ISO-8601-Text, Sprachen Sprach-Tags wie de-DE, Hashes <Algorithmus>:<hex>.
Komprimierter KörperJede Route nimmt Content-Encoding: gzip an. Die Grenze gilt für die entpackten Bytes. Eine andere Kodierung ergibt 415 content-encoding-unsupported.
Dokumente geschütztJede Dokumentantwort trägt X-Content-Type-Options: nosniff, HTML zusätzlich Content-Security-Policy: sandbox. Ein Skript in einer Vorlage läuft so nicht mit der Sitzung der lesenden Person.
Ganze AntwortenEin Dokument kommt immer am Stück, nicht gestreamt. So kann auch ein später Fehler noch als Fehlerantwort kommen.

Fallen

Weiter

Suchen