Zum Inhalt springen

Dateibereich

In Stud.IP hat jeder Nutzer, jede Einrichtung und jede Veranstaltung einen eigenen Dateibereich. Dateibereiche sind (spezielle) Ordner. Ordner können Dateien und Ordner enthalten, in denen sich wiederum Dateien und Ordner befinden können.

Es gibt verschiedene Arten von Ordnern, die sich in der Regel darin unterscheiden, wer sie sehen kann und wer Lese- und/oder Schreibzugriff auf diese Ordner hat.

Aus Nutzersicht sind Dateien in Stud.IP Ressourcen vom Typ “file-refs”. Technisch gesehen sind es allerdings Verweise auf die Ressourcen vom Typ “files”. Letztere sind die tatsächlich auf der Festplatte gespeicherten Dateien, die mithilfe der “file-refs” nur verlinkt werden.

Vereinfacht gesagt, hantiert man in der Regel immer mit “file-refs”.

AttributBeschreibung
nameder Name der Datei
descriptioneine optionale Beschreibung der Datei
mkdatedas Erstellungsdatum der Datei
chdatedas Datum der letzten Änderung der Metadaten (‘name’, ‘description’, …) der Datei
downloadsWie häufig wurde diese Datei heruntergeladen?
filesizedie Größe der Datei in Byte
storageTODO
RelationBeschreibung
filedie tatsächliche Datei auf der Festplatte
ownerder Nutzer, dem diese Datei gehört
parentder Ordner, im dem diese Datei liegt
rangedie Veranstaltung, die Einrichtung oder der Nutzer, in dessen Dateibereich diese Datei liegt
terms-of-usedie Lizenz, unter der diese Datei verfügbar gemacht wird

In den Metadaten von Dateien ist der “download-link” enthalten, um den Inhalt der Datei herunterzuladen.

Anders als Ressourcen vom Typ “file-refs” sind Ressourcen vom Typ “files” über die grafische Oberfläche nicht verfügbar. Technisch werden “files” verwendet, um die Dateien tatsächlich auf der Festplatte (oder einem entfernten Speicherort) abzulegen.

Erst durch die Verknüpfung durch “file-refs” werden Ressourcen vom Typ “files” sichtbar.

AttributBeschreibung
nameder Name der Datei
mime-typeder MIME-Typ der Datei
sizedie Größe der Datei in Bytes
storageTODO
mkdatedas Erstellungsdatum der Datei
chdatedas Datum der letzten Änderung der Datei
RelationBeschreibung
file-refsalle Ressourcen vom Typ “file-refs”, die auf diese Datei verweisen
ownerder Nutzer, dem diese Datei gehört

Ressourcen vom Typ “folders” sind im herkömmlichen Sinne Ordner und können weitere “folders” oder Ressourcen vom Typ “file-refs” enthalten.

Es gibt verschiedene Arten von “folders”. In Stud.IP werden aber vorrangig “StandardFolders” verwendet. Für diese sind alle Operationen möglich. Für andere Arten entscheiden die Implementierungen jeweils selbst, ob die Operation möglich ist.

AttributBeschreibung
folder-typedie Art des Ordners
nameder Name des Ordners
descriptiondie Beschreibung des Ordners
mkdatedas Erstellungsdatum des Ordners
chdatedas Datum der letzten Änderung des Ordners
is-visibleDarf der eingeloggte Nutzer den Ordner sehen?
is-readableDarf der eingeloggte Nutzer den Ordner öffnen?
is-writableDarf der eingeloggte Nutzer im Ordner Dateien erstellen?
is-editableDarf der eingeloggte Nutzer den Ordner bearbeiten?
is-subfolder-allowedDarf der eingeloggte Nutzer im Ordner weitere Ordner erstellen?
RelationBeschreibung
ownerder Nutzer, dem dieser Ordner gehört
parentder Ordner, in dem sich dieser Ordner befindet
rangedie Veranstaltung, die Einrichtung oder der Nutzer, in dessen Dateibereich dieser Ordner liegt
foldersdie Ordner, die sich in diesem Ordner befinden
file-refsdie Dateien, die sich in diesem Ordner befinden

Jede Datei unterliegt einer Lizenz, die die Nutzung, Weitergabe und Veränderung regelt.

AttributBeschreibung
nameder Name der Lizenz
descriptiondie Beschreibung der Lizenz
icondas für die Lizenz verwendete Icon
mkdatedas Erstellungsdatum der Lizenz
chdatedas Datum der letzten Änderung der Lizenz

Lizenzen (‘terms-of-use’) haben keine Relationen.

Terminal-Fenster
curl --request GET \
--url https://example.com/terms-of-use \
--header "Authorization: Basic `echo -ne "test_autor:testing" | base64`"

Diese Route erfragt alle im Stud.IP registrierten Lizenzen von Dateien.

GET /terms-of-use

Jeder Nutzer darf diese Route verwenden.

Terminal-Fenster
curl --request GET \
--url https://example.com/terms-of-use/<ID> \
--header "Authorization: Basic `echo -ne "test_autor:testing" | base64`"

Mit dieser Route kann eine beliebige Lizenz ausgelesen werden.

GET /terms-of-use/{id}

ParameterBeschreibung
iddie ID der Lizenz

keine URL-Parameter

Jeder Nutzer darf diese Route verwenden.

Terminal-Fenster
curl --request GET \
--url https://example.com/<courses,institutes,users>/<ID>/file-refs \
--header "Authorization: Basic `echo -ne "test_autor:testing" | base64`"

Mit dieser Route können alle Dateien eines Dateibereichs ausgelesen werden. Das Ergebnis ist eine flache Liste aller Dateien, ungeachtet der Zugehörigkeit zu Ordnern dieses Dateibereichs.

GET /courses/{id}/file-refs GET /institutes/{id}/file-refs GET /users/{id}/file-refs

ParameterBeschreibung
iddie ID der Veranstaltung, der Einrichtung oder des Nutzers
ParameterDefaultBeschreibung
page[offset]0der Offset (siehe Paginierung)
page[limit]30das Limit (siehe Paginierung)

Die Dateien einer Einrichtung darf jeder Nutzer sehen. Die Dateien einer Veranstaltung sehen alle Nutzer, die Zugriff auf die Veranstaltung haben. Die Dateien eines Nutzers sehen alle, es sei denn der Nutzer ist unsichtbar.

Im Übrigen gelten die Zugriffsregeln der Ordner, in denen die Dateien liegen.

Terminal-Fenster
curl --request GET \
--url https://example.com/<courses,institutes,users>/<ID>/folders \
--header "Authorization: Basic `echo -ne "test_autor:testing" | base64`"

Mit dieser Route können alle Ordner eines Dateibereichs ausgelesen werden. Das Ergebnis ist eine flache Liste aller Ordner, ungeachtet der Zugehörigkeit zu Ordnern dieses Dateibereichs.

GET /courses/{id}/folders GET /institutes/{id}/folders GET /users/{id}/folders

ParameterBeschreibung
iddie ID der Veranstaltung, der Einrichtung oder des Nutzers
ParameterDefaultBeschreibung
page[offset]0der Offset (siehe Paginierung)
page[limit]30das Limit (siehe Paginierung)

Die Ordner einer Einrichtung darf jeder Nutzer sehen. Die Ordner einer Veranstaltung sehen alle Nutzer, die Zugriff auf die Veranstaltung haben. Die Ordner eines Nutzers sehen alle, es sei denn der Nutzer ist unsichtbar.

Im Übrigen gelten die Zugriffsregeln der Ordner, in denen die Ordner liegen.

Ein Ordner kann einfach über diese Route angelegt werden.

Terminal-Fenster
curl --request POST \
--url https://example.com/courses/<ID>/folders \
--header "Content-Type: application/vnd.api+json" \
--header "Authorization: Basic `echo -ne "test_dozent:testing" | base64`" \
--data '{"data": {"type": "folders","attributes": {"name": "Name of the folder"}, "relationships": {"parent": {"data": {"type":"folders","id":"<any-folder-id>"}}}}}'

POST /courses/{id}/folders POST /institutes/{id}/folders POST /users/{id}/folders

ParameterBeschreibung
iddie ID der Veranstaltung, der Einrichtung oder des Nutzers

Der Request-Body enthält ein “JSONAPI resource object” vom Typ “folders”. Name und übergeordneter, enthaltender Ordner sind erforderlich: Das Attribut “name” und die Relation “parent”, die auf ein “folders”-Objekt verweist, sind verpflichtend.

keine Parameter

Ob ein Ordner angelegt werden darf, wird von der jeweiligen Implementation des Zielordners entschieden.

Terminal-Fenster
curl --request GET \
--url https://example.com/file-refs/<ID> \
--header "Authorization: Basic `echo -ne "test_autor:testing" | base64`"

Mit dieser Route kann eine Datei ausgelesen werden.

GET /file-refs/{id}

ParameterBeschreibung
iddie ID der Datei

keine Parameter

Ob eine Datei ausgelesen werden darf, entscheidet der übergeordnete Ordner.

Terminal-Fenster
curl --request PATCH \
--url https://example.com/file-refs/<ID> \
--header "Authorization: Basic `echo -ne "test_autor:testing" | base64`" \
--header "Content-Type: application/vnd.api+json" \
--data '{"data": {"type": "file-refs","id":"<id-der-datei>", \
"attributes":{"name":"neuer-name.jpg"}}}'

Mit dieser Route kann der Name, die Beschreibung und/oder die Lizenz einer Datei geändert werden. Dazu wird JSONAPI-typisch das angepasste “resource object” an diese Route geschickt.

PATCH /file-refs/{id}

ParameterBeschreibung
iddie ID der Datei

Der Request-Body enthält das veränderte “resource object”.

keine URL-Parameter

Ob eine Datei angepasst werden darf, entscheidet der übergeordnete Ordner.

Terminal-Fenster
curl --request DELETE \
--url https://example.com/file-refs/<ID> \
--header "Authorization: Basic `echo -ne "test_autor:testing" | base64`"

Mit dieser Route löscht man eine Datei.

DELETE /file-refs/{id}

ParameterBeschreibung
iddie ID der Datei

keine URL-Parameter

ob eine Datei gelöscht werden kann, entscheidet der übergeordnete Ordner.

Terminal-Fenster
curl --request GET \
--url https://example.com/file-refs/<ID>/relationships/terms-of-use \
--header "Authorization: Basic `echo -ne "test_autor:testing" | base64`"

Um die Relation einer Datei zu einer Lizenz auszulesen, verwendet man diese Route.

GET /file-refs/<ID>/relationships/terms-of-use

ParameterBeschreibung
iddie ID der Datei

keine URL-Parameter

Der übergeordnete Ordner der Datei entscheidet.

Terminal-Fenster
curl --request PATCH \
--url https://example.com/file-refs/<ID>/relationships/terms-of-use \
--header "Authorization: Basic `echo -ne "test_autor:testing" | base64`" \
--header "Content-Type: application/vnd.api+json" \
--data '{"data": {"type": "terms-of-use","id": "<id-der-lizenz>"}}'

Um die Relation einer Datei zu einer Lizenz zu ändern, verwendet man diese Route. Das Löschen der Relation zur Datei ist ausgeschlossen.

PATCH /file-refs/<ID>/relationships/terms-of-use

ParameterBeschreibung
iddie ID der Datei

Der Request-Body muss einen “resource identifier” von Typ “terms-of-use” enthalten.

keine URL-Parameter

Der übergeordnete Ordner der Datei entscheidet.

Terminal-Fenster
curl --request HEAD \
--url https://example.com/file-refs/<ID>/content \
--header "Authorization: Basic `echo -ne "test_autor:testing" | base64`"

Um einen Fingerabdruck (ETag) des tatsächlichen Inhalts einer Datei zu bekommen, kann man diese nicht-JSON-API-Route aufrufen.

HEAD /file-refs/{id}/content

ParameterBeschreibung
iddie ID der Datei

keine URL-Parameter

Der übergeordnete Ordner der Datei entscheidet.

Terminal-Fenster
curl --request GET \
--url https://example.com/file-refs/<ID>/content \
--header "Authorization: Basic `echo -ne "test_autor:testing" | base64`"

Mit dieser Route kann der Inhalt einer Datei heruntergeladen werden.

GET /file-refs/{id}/content

ParameterBeschreibung
iddie ID der Datei

Der Request kann einen ETag-Header mitbringen, um redundante Datenübertragung zu vermeiden.

keine URL-Parameter

Der übergeordnete Ordner der Datei entscheidet.

Terminal-Fenster
curl --request POST --url https://example.com/file-refs/<ID>/content \
--header "Authorization: Basic `echo -ne "test_autor:testing" | base64`" \
-F 'myfile=@/path/to/local/file'

Mit dieser Route kann der Inhalt einer vorhandenen Datei überschrieben werden. Dazu wird eine einzige Datei “multipart/form-data”-kodiert an diese Route geschickt.

POST /file-refs/{id}/content

Im Request-Body muss dann eine Datei “multipart/form-data”-kodiert enthalten sein.

keine URL-Parameter

Der übergeordnete Ordner der Datei entscheidet.

Terminal-Fenster
curl --request GET \
--url https://example.com/folders/<ID> \
--header "Authorization: Basic `echo -ne "test_autor:testing" | base64`"

Mit dieser Route kann man die Daten eines Ordners auslesen.

GET /folders/{id}

ParameterBeschreibung
iddie ID des Ordners

keine URL-Parameter

Die Art des Ordners entscheidet über die Autorisierung.

Terminal-Fenster
curl --request PATCH \
--url https://example.com/folders/<ID> \
--header "Authorization: Basic `echo -ne "test_autor:testing" | base64`" \
--header "Content-Type: application/vnd.api+json" \
--data '{"data": {"type":"folders","id":"<id-der-lizenz>", \
"attributes":{"name":"Neuer Name"}}}'

Mit dieser Route kann der Name und/oder die Beschreibung geändert werden. Außerdem kann man den Ordner in einen anderen Ordner verschieben. Dazu ändert man die “parent”-Relation.

PATCH /folders/{id}

ParameterBeschreibung
iddie ID des Ordners

keine URL-Parameter

Die Art des Ordners entscheidet über die Autorisierung.

Terminal-Fenster
curl --request DELETE \
--url https://example.com/folders/<ID> \
--header "Authorization: Basic `echo -ne "test_autor:testing" | base64`"

Mit dieser Route kann man einen Ordner löschen.

DELETE /folders/{id}

ParameterBeschreibung
iddie ID des Ordners

keine URL-Parameter

Die Art des Ordners entscheidet über die Autorisierung.

Terminal-Fenster
curl --request GET \
--url https://example.com/folders/<ID>/file-refs \
--header "Authorization: Basic `echo -ne "test_autor:testing" | base64`"

Mit dieser Route erhält man eine Liste aller Dateien, die direkt in einem Ordner liegen.

GET /folders/{id}/file-refs

ParameterBeschreibung
iddie ID des Ordners
ParameterDefaultBeschreibung
page[offset]0der Offset (siehe Paginierung)
page[limit]30das Limit (siehe Paginierung)

Ob man die Liste der Dateien eines Ordners sehen darf, entscheidet die Implementierung des Ordners.

Terminal-Fenster
curl --request GET \
--url https://example.com/folders/<ID>/folders \
--header "Authorization: Basic `echo -ne "test_autor:testing" | base64`"

Mit dieser Route erhält man eine Liste aller Ordner, die direkt in einem Ordner liegen.

GET /folders/{id}/folders

ParameterBeschreibung
iddie ID des Ordners
ParameterDefaultBeschreibung
page[offset]0der Offset (siehe Paginierung)
page[limit]30das Limit (siehe Paginierung)

Ob man die Liste der Ordner eines Ordners sehen darf, entscheidet die Implementierung des Ordners.

Eine Datei wird immer in einem Ordner erstellt. Da Dateien aus Metadaten und Inhalt bestehen, muss das Erstellen einer Datei in zwei Schritten passieren. Dazu kann entweder

  • zuerst der Inhalt hochgeladen werden und dann die Metadaten (wie Beschreibung und Lizenz) angepasst werden oder
  • erst die Datei mit den Metadaten erstellt werden und nachträglich der Inhalt hochgeladen werden.
Terminal-Fenster
curl --request POST --url "https://example.com/folders/<ID>/file-refs" \
-F 'file=@/pfad/zu/einer-neuen-datei.jpg' \
--header "Authorization: Basic `echo -ne "test_dozent:testing" | base64`"

Zuerst sendet man einen POST-Request mit Content-Type: multipart/form-data und der Datei im Request-Body an die angegebene URL.

Man erhält im Erfolgsfall einen Status-Code 201 und einen Location-Header, der einen zum neu erstellten Dokument in die JSON:API bringt.

Der Dateiname wird standardmäßig aus dem Upload genommen und auch für den Namen der Datei verwendet.

Will man einen anderen Dateinamen verwenden, kann man einen HTTP-Header verwenden: Slug: neuer-dateiname.txt.

Über die URL aus dem erhaltenen Location-Header erhält man die JSON:API-Repräsentation der hochgeladenen Datei.

Nun können mit einem (JSON:API-typischen) PATCH-Request an diese Route Modifikationen an den Metadaten (wie Beschreibung usw.) vorgenommen werden.

Terminal-Fenster
curl --request POST --url https://example.com/folders/<ID>/file-refs \
--header "Content-Type: application/vnd.api+json" \
--header "Authorization: Basic `echo -ne "test_autor:testing" | base64`" \
--data '{"data": { "type": "file-refs", "attributes": { "name": "iason.txt", "description": "Iasons Lebenslauf"}, "relationships":{"terms-of-use": {"data": {"type": "terms-of-use", "id": "FREE_LICENSE"}}}}}'

Zunächst sendet man einen POST-Request mit Content-Type: application/vnd.api+json an die URL.

Im Request-Body muss dann eine JSON:API-typische Repräsentation der neuen Datei enthalten sein. Im Erfolgsfall erhält man dann eine Repräsentation der neu angelegten Datei, die aber derzeit noch keinen Inhalt hat.

Daher muss der Inhalt in einem zweiten Request hochgeladen werden. Dazu wird – wie unter “Inhalt einer Datei aktualisieren” beschrieben – ein POST-Request an die download-url geschickt.

POST /folders/{id}/file-refs

Im Request-Body befindet sich dann entweder eine “multipart/form-data”-kodierte Datei oder ein JSON-API-spezifisches “resource object”.

Wenn man ein JSON-API-”resource object” verschickt, muss die Relation terms-of-use (die Lizenz) enthalten sein. Ohne Lizenz können keine Dateien angelegt werden.

ParameterBeschreibung
iddie ID des Ordners

Ob man eine Datei erstellen darf, entscheidet die Implementierung des Ordners.

Um eine Datei zu kopieren, verwendet man die “Variante b.” für das Anlegen von Dateien.

Zuerst benötigt man den “resource identifier” der Relation file der zu kopierenden Datei. Dann schickt man ein JSON-API-”resource object” an die URL zum Erstellen einer Datei und setzt dort diesen “resource identifier” als Relation file der neuen Datei.

Wenn man selbst der Besitzer der Quelldatei ist, bleibt der Verweis auf das file bestehen. Ist man nicht der Besitzer der Quelldatei, wird auch das file kopiert und man selbst dessen Besitzer.

Terminal-Fenster
curl -F "destination=<destination-ID>" \
--url "https://example.com/folders/<source-ID>/copy" \
--header "Authorization: Basic `echo -ne "test_dozent:testing" | base64`"

Um einen Ordner zu kopieren, wird diese Route verwendet, die allerdings nicht JSON-API-konform ist. Dazu wird ein POST-Request an die Route des Ordners geschickt, in deren Request-Body der Zielordner spezifiziert wird. Der Request-Body muss vom “multipart/form-data”-kodiert sein.

POST /folders/{id}/copy

Der “Content-Type” des Requests muss “multipart/form-data” sein. Im Request-Body muss unter dem Schlüssel “destination” die ID des Zielordners enthalten.

Wenn der Request erfolgreich war, bekommt man einen Status-Code 201 und einen Location-Header, der auf den neuen, kopierten Ordner zeigt.

Jeder Nutzer, der den Quellordner öffnen und im Zielordner schreiben darf, kann diese Route aufrufen.

Terminal-Fenster
curl --request POST \
--url https://example.com/folders/<ID>/folders \
--header "Authorization: Basic `echo -ne "test_autor:testing" | base64`" \
--data '{"data": { "type": "folders", "attributes": {"name":"Neuer Ordner"}}}'

Mit dieser Route kann man einen neuen Ordner anlegen.

POST /folders/{id}/folders

ParameterBeschreibung
iddie ID des übergeordneten Ordners

keine URL-Parameter

Ob man einen Ordner erstellen darf, entscheidet die Implementierung des übergeordneten Ordners.

Terminal-Fenster
curl --request GET \
--url https://example.com/files/<ID> \
--header "Authorization: Basic `echo -ne "test_autor:testing" | base64`"

Die Dateien, die in den obigen Routen genannt werden, sind technisch gesehen nur Verweise auf tatsächliche Dateien auf der Festplatte o.ä. Auch die tatsächlichen Dateien (“files”) können ausgelesen werden. Dazu verwendet man diese Route.

GET /files/{id}

ParameterBeschreibung
iddie ID des “files”

keine URL-Parameter

Ein “file” kann ein Nutzer dann sehen, wenn eine der darauf verweisenden Dateien vom Nutzer gesehen werden kann.

Terminal-Fenster
curl --request GET \
--url https://example.com/files/<ID>/file-refs \
--header "Authorization: Basic `echo -ne "test_autor:testing" | base64`"

Mit dieser Route können alle Dateien, die auf dieses “file” verweisen, ausgelesen werden.

GET /files/{id}/file-refs

ParameterBeschreibung
iddie ID des “files”

keine URL-Parameter

Die Route kann sinnvoll aufgerufen werden, wenn man eine der darauf verweisenden Dateien sehen kann.

Terminal-Fenster
curl --request GET \
--url https://example.com/files/<ID>/relationships/file-refs \
--header "Authorization: Basic `echo -ne "test_autor:testing" | base64`"

Diese Route wird verwendet, um alle IDs der Dateien zu erhalten, die auf dieses “file” verweisen.

GET /files/{id}/relationships/file-refs

ParameterBeschreibung
iddie ID des “files”

keine URL-Parameter

Die Route kann sinnvoll aufgerufen werden, wenn man eine der auf das “file” verweisenden Dateien sehen kann.