Dokumente¶
Für die Bearbeitung einer Dokumentdatei muss auch via REST API der Checkin/Checkout workflow beachtet und eingehaltet werden.
Folgende Abfolge ist dabei vorgesehen:
Dieser Workflow kann abgebrochen werden indem man den Checkout widerruft mit dem @cancelcheckout Endpoint.
Dokumentversionen können mit dem @history Endpoint aufgelistet werden.
Checkout - Dokument auschecken¶
Ein Dokument wird via @checkout
Endpoint ausgecheckt.
POST /ordnungssystem/dossier-23/document-123/@checkout HTTP/1.1 Accept: application/jsonHTTP/1.1 204 No Content
Darf ein Dokument vom aktuellen Benutzer nicht ausgecheckt werden, so wird mit dem Status 403 Forbidden
geantwortet.
POST /ordnungssystem/fuehrung/dossier-23/document-123/@checkout HTTP/1.1 Accept: application/jsonHTTP/1.1 403 Forbidden Content-Type: application/json { "error": { "message": "Checkout is not allowed.", "type": "Forbidden" } }
Lock¶
Um das Dokument von Schreibzugriffen von anderen Benutzern zu schützen muss es mittels Lock gesperrt werden.
Lock erstellen¶
POST /ordnungssystem/dossier-23/document-123/@lock HTTP/1.1 Accept: application/jsonHTTP/1.1 200 OK Content-Type: application/json { "creator": "peter.meier", "locked": true, "name": "plone.locking.stealable", "stealable": true, "time": 1477076400.0, "timeout": 600, "token": "0.684672730996-0.25195226375-00105A989226:1477076400.000" }
Standardmässig haben Locks ein Timeout von 600s Sekunden und müssen anschliessend erneuert werden. Entweder sollten daher Locks periodisch erneuert werden oder man verwendet ein höheres Timeout:
Lock erneuern¶
POST /ordnungssystem/dossier-23/document-123/@refresh-lock HTTP/1.1 Accept: application/jsonHTTP/1.1 200 OK Content-Type: application/json { "creator": "peter.meier", "locked": true, "name": "plone.locking.stealable", "stealable": true, "time": 1477076400.0, "timeout": 600, "token": "0.684672730996-0.25195226375-00105A989226:1477076400.000" }
Lock erstellen mit eigenem Timeout¶
POST /ordnungssystem/dossier-23/document-123/@lock HTTP/1.1 Accept: application/json { "timeout": 86400 }HTTP/1.1 200 OK Content-Type: application/json { "creator": "peter.meier", "locked": true, "name": "plone.locking.stealable", "stealable": true, "time": 1477076400.0, "timeout": 86400, "token": "0.684672730996-0.25195226375-00105A989226:1477076400.000" }
Lock entfernen¶
Ein bestehendes Lock kann mittels @unlock
Endpoint entfernt werden. Der lock_type
Parameter erlaubt es, den Lock-Typ anzugegeben, der entfernt werden soll. Wenn lock_type
nicht angegeben wird, wird ein Lock vom Typ plone.locking.stealable
entfernt.
POST /ordnungssystem/dossier-23/document-123/@unlock HTTP/1.1 Accept: application/json { "lock_type": "document.copied_to_workspace.lock" }HTTP/1.1 200 OK Content-Type: application/json { "locked": false, "stealable": true }
Datei aktualisieren¶
Für den Upload einer Datei unterstützt die REST API das sogenannte TUS Protocol. Eine detaillierte Dokumentation über die verschieden Möglichkeiten und Endpoints finden Sie in der plone.restapi Dokumentation.
Folgend ein kurzes Beispiel wie eine Datei eines bestehenden Dokumentes aktualisiert werden kann.
Upload URL erstellen:
POST /ordnungssystem/dossier-23/document-123/@tus-replace HTTP/1.1 Accept: application/json Tus-Resumable: 1.0.0 Upload-Length: 8 Upload-Metadata: filename dGVzdC50eHQ=,content-type dGV4dC9wbGFpbg==HTTP/1.1 201 created Content-Type: application/json location: ordnungssystem/ressourcen-und-support/personal/personalrekrutierung/dossier-4/document-2/@tus-upload/6cdfc5ddd1844e8cbca32721c4b17b84
Datei uploaden:
PATCH /ordnungssystem/dossier-23/document-123/@tus-upload/6cdfc5ddd1844e8cbca32721c4b17b84 HTTP/1.1 Accept: application/json Tus-Resumable: 1.0.0 Upload-Offset: 0 Content-Type: application/offset+octet-stream test dataHTTP/1.1 204 No content Content-Type: application/json
Wurde das Dokument zuvor mittels Lock gesperrt, muss das Lock Token über den Lock-Token header mitgegeben werden.
Dateiupload mit Lock Token:
PATCH /ordnungssystem/dossier-23/document-123/@tus-upload/6cdfc5ddd1844e8cbca32721c4b17b84 HTTP/1.1 Accept: application/json Tus-Resumable: 1.0.0 Upload-Offset: 0 Content-Type: application/offset+octet-stream Lock-Token: 0.684672730996-0.25195226375-00105A989226:1477076400.000 test dataHTTP/1.1 204 No content Content-Type: application/json
Checkin - Dokument einchecken¶
Ein Dokument wird via @checkin
Endpoint eingecheckt, dabei wird automatisch eine neue Version erstellt.
POST /ordnungssystem/dossier-23/document-123/@checkin HTTP/1.1 Accept: application/json { "comment": "Kapitel 3 - 6 korrigiert." }HTTP/1.1 204 No content Content-Type: application/json
Cancel checkout - Checkout widerrufen¶
Der checkout von einem Dokument kann man mittels @cancelcheckout
Endpoint widerrufen.
POST /ordnungssystem/dossier-23/document-123/@cancelcheckout HTTP/1.1 Accept: application/jsonHTTP/1.1 204 No Content
Versionen auflisten:¶
GET /ordnungssystem/dossier-23/document-123/@history HTTP/1.1 Accept: application/jsonHTTP/1.1 200 OK Content-Type: application/json [ { "@id": "/ordnungssystem/dossier-23/document-123/@history/1", "action": "Bearbeitet", "actor": { "@id": "http://localhost:8080/fd/@users/peter.meier ", "fullname": "Peter Meier", "id": "peter.meier", "username": "peter.meier" }, "comments": null, "may_revert": true, "time": "2019-03-27T10:50:59.196843", "transition_title": "Bearbeitet", "type": "versioning", "version": 1 }, { "@id": "/ordnungssystem/dossier-23/document-123/@history/0", "action": "Bearbeitet", "actor": { "@id": "http://localhost:8080/fd/@users/hugo.boss", "fullname": "Hugo Boss", "id": "hugo.boss", "username": "hugo.boss" }, "comments": "Dokument erstellt (Initialversion)", "may_revert": true, "time": "2019-03-27T09:19:25", "transition_title": "Bearbeitet", "type": "versioning", "version": 0 } ]
Dokument als PDF speichern¶
Mit dem @save-document-as-pdf
kann ein Dokument oder eine Version eines Dokuments als PDF gespeichert werden. Als document_uid
wird die UID des Dokuments erwartet. Wenn keine version_id
mitgegeben wird, wird die aktuelle Version verwendet. Der Endpoint steht auf Stufe Dossier, Teamraum und Teamraum-Ordner zur Verfügung.
POST /ordnungssystem/dossier-23/@save-document-as-pdf HTTP/1.1 Accept: application/json { "document_uid": "f923b2321f174b408c3bd483db9bfa66", "version_id": 2 }HTTP/1.1 201 Created Location: /ordnungssystem/dossier-4/document-1
Genehmigungen¶
Dokument Genehmigungen, welche via Aufgabe erteilt wurden, lassen sich als zusätzliche expansion ebenfalls mit einem GET Request auf ein Dokument abfragen.
GET /ordnungssystem/dossier-23/document-21?expand=approvals HTTP/1.1 Accept: application/jsonHTTP/1.1 200 OK Content-Type: application/json { "@id": "/ordnungssystem/dossier-23/document-21", "@type": "opengever.document.document", "UID": "edc93b13e4bf4d72bcdc49838697ebe6", "@components": { "approvals": [ { "approved": "2021-08-02T00:00:00", "approver": "peter.muster", "task": { "@id": "http://example.org/ordnungssystem/dossier-23/document-123", "@type": "opengever.task.task", "UID": "c99df05a4bbe473ead5e2356f5a4f8b4", "description": "", "is_leafnode": null, "review_state": "task-state-in-progress", "title": "Vertragsentwurf prüfen"}, "version_id": 1 } ] } }
Bearbeiten des Öffentlichkeitsstatus¶
Für die Bearbeitung des Öffentlichkeitsstatus eines Dokuments in einem abgeschlossen Geschäft, steht ein separater PATCH Endpoint @public-trial-status
zur Verfügung. Dieser funktioniert identisch zum normalen Bearbeitung eines Dokuments, erlaubt aber ausschliesslich die Bearbeitung der Metadaten public_trial
und public_trial_statement
.
PATCH /ordnungssystem/dossier-23/document-11 HTTP/1.1 Accept: application/json { "public_trial": "limited-public", "public_trial_statement": "Herr Muster, 03.02.2012, genehmigt." }HTTP/1.1 204 No Content
Dokument über einen XHR-Request als multipart/form-data erstellen¶
Neben dem @tus-upload
-Endpoint gibt es auch die Mögilchkeit, Dokumente über einen normalen XHR-Request als multipart/form-data zu erstellen.
Beispiel-Request:
POST http://example.com/ordnungssystem/dossier-1/@xhr-upload HTTP/1.1 Authorization: [AUTH_DATA] Accept: application/json Content-Type: multipart/form-data; boundary=------------------------b3e801e2d0fb0cc9 Content-Length: [NUMBER_OF_BYTES_IN_ENTIRE_REQUEST_BODY] --------------------------b3e801e2d0fb0cc9 Content-Disposition: form-data; name="title" Hello Worlds --------------------------b3e801e2d0fb0cc9 Content-Disposition: form-data; name="file"; filename="helloworld.pdf" Content-Type: application/octet-stream [FILE_DATA]
Beispiel-Response:
HTTP/1.1 200 OK Content-Type: application/json { "@id": "http://example.com/ordnungssystem/dossier-1/document-1", "...": "..." }