From e3bd23d19f31578e71e4a6b573a947220987776b Mon Sep 17 00:00:00 2001
From: Jonas Groeger <jonas.groeger@codecentric.de>
Date: Thu, 20 May 2021 12:30:37 +0200
Subject: [PATCH] =?UTF-8?q?docs:=20"Fehlerverhalten=20und=20Statuscodes"?=
 =?UTF-8?q?=20erg=C3=A4nzt?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 docs/5_Fehlerverhalten_und_Statuscodes.md |  72 +++++++++++
 docs/5_Status-_und_Fehlercodes.md         | 145 ----------------------
 2 files changed, 72 insertions(+), 145 deletions(-)
 create mode 100644 docs/5_Fehlerverhalten_und_Statuscodes.md
 delete mode 100644 docs/5_Status-_und_Fehlercodes.md

diff --git a/docs/5_Fehlerverhalten_und_Statuscodes.md b/docs/5_Fehlerverhalten_und_Statuscodes.md
new file mode 100644
index 00000000..bb9cfd93
--- /dev/null
+++ b/docs/5_Fehlerverhalten_und_Statuscodes.md
@@ -0,0 +1,72 @@
+# Fehlerverhalten und Statuscodes
+
+> Wo 200 Licht ist, ist auch 403 Schatten. -Göthe
+
+Diese Seite gibt einen Überblick über Fehlerhandling in der XFall RESTful API (nachfolgend nur noch *API* genannt).
+
+## Features
+
+* Liefert zu allen Fehlerantworten einen HTTP Statuscode
+  laut [RFC 7231 (Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content)](https://datatracker.ietf.org/doc/html/rfc7231#section-6)
+  zurück.
+* Liefert Fehler (4xx und 5xx HTTP Statuscodes) im JSON Format
+  nach [RFC 7807 (Problem Details for HTTP APIs)](https://datatracker.ietf.org/doc/html/rfc7807) aus.
+    * Fehler besitzen **immer** folgende Felder:
+        * `type`: Eine URI (möglicherweise als Website aufrufbar) die den Typ des Fehlers eindeutig klassifiziert.
+          Beispiel: `https://fitko.uber.space/problem/application-not-found`
+        * `title`: Ein kurzer und menschenlesbarer Titel des Fehlers. Beispiel: `Application not found`
+        * `status`: Eine Kopie des HTTP Statuscodes
+    * Fehler können **optional** weitere Felder beinhalten. API Clients **müssen** hiermit umgehen können.
+* Unterscheidet zwischen technischen und fachlichen Fehlern
+
+## Liste von Fehlercodes
+
+Wir versuchen bei Fehlern stets sinnvolle Fehlermeldungen bereitzustellen um eine Fehleranalyse zu vereinfachen. Wir
+sind aber auch Menschen und daher nicht perfekt. Falls euch ein Fehler oder eine Inkonsistenz auffällt,
+[erstellt bitte ein Issue](https://git.fitko.de/fit-connect/FIT-Connect-PoC/-/issues/new).
+
+Wir unterscheiden zwischen technischen und fachlichen Fehlern. Technische Fehler sind nicht explizit in der API-Spec
+abgebildet. Fachliche schon.
+
+### Technische Fehler
+
+| `type` des technischen Fehlers                                | Titel laut [httpstatus.es](https://httpstatuses.com/)   | Beschreibung |
+|---------------------------------------------------------------|---------------------------------------------------------|--------------|
+| https://fitko.uber.space/problem/constraint-violation         | 400 Bad Request                                         |              |
+| https://fitko.uber.space/problem/request-binding-error        | 400 Bad Request                                         |              |
+| https://fitko.uber.space/problem/no-handler-found             | 404 Not Found                                           |              |
+| https://fitko.uber.space/problem/missing-request-part         | 400 Bad Request                                         |              |
+| https://fitko.uber.space/problem/missing-request-parameter    | 400 Bad Request                                         |              |
+| https://fitko.uber.space/problem/socket-timeout               | 504 Gateway Timeout                                     |              |
+| https://fitko.uber.space/problem/type-mismatch                | 400 Bad Request                                         |              |
+| https://fitko.uber.space/problem/multipart-error              | 400 Bad Request                                         |              |
+| https://fitko.uber.space/problem/message-not-readable         | 400 Bad Request                                         |              |
+| https://fitko.uber.space/problem/method-not-supported         | 405 Method Not Allowed                                  |              |
+| https://fitko.uber.space/problem/media-type-not-supported     | 415 Unsupported Media Type                              |              |
+| https://fitko.uber.space/problem/media-type-not-acceptable    | 406 Not Acceptable                                      |              |
+| https://fitko.uber.space/problem/unsupported-operation        | 501 Not Implemented                                     |              |
+| https://fitko.uber.space/problem/invalid-state-transition     | 500 Internal Server Error                               |              |
+
+### Fachliche Fehler
+
+| `type` des fachlichen Fehlers                                 | Titel laut [httpstatus.es](https://httpstatuses.com/)   | Beschreibung |
+|---------------------------------------------------------------|---------------------------------------------------------|--------------|
+| https://fitko.uber.space/problem/access-forbidden             | 403 Forbidden                                           |              |
+| https://fitko.uber.space/problem/application-already-fetched  | 410 Gone                                                |              |
+| https://fitko.uber.space/problem/application-incomplete       | 422 Unprocessable Entity                                |              |
+| https://fitko.uber.space/problem/application-not-found        | 404 Not Found                                           |              |
+| https://fitko.uber.space/problem/not-in-acknowledgeable-state | 422 Unprocessable Entity                                |              |
+| https://fitko.uber.space/problem/attachment-not-announced     | 422 Unprocessable Entity                                |              |
+| https://fitko.uber.space/problem/attachment-not-found         | 404 Not Found                                           |              |
+| https://fitko.uber.space/problem/destination-not-found        | 404 Not Found                                           |              |
+| https://fitko.uber.space/problem/empty-attachment             | 400 Bad Request                                         |              |
+
+## Verhalten von API Clients
+
+API Clients sollten gemäß RFC 7231 so implementiert sein, dass auch unbekannte HTTP Statuscodes gemäß ihrer
+Statusklasse (`Axx, A=[1,5]`) interpretiert werden können:
+> "HTTP status codes are extensible. HTTP clients are not required to understand the meaning of
+> all registered status codes, though such understanding is obviously desirable. However, a client
+> MUST understand the class of any status code, as indicated by the first digit, and treat an
+> unrecognized status code as being equivalent to the x00 status code of that class, with the
+> exception that a recipient MUST NOT cache a response with an unrecognized status code."
diff --git a/docs/5_Status-_und_Fehlercodes.md b/docs/5_Status-_und_Fehlercodes.md
deleted file mode 100644
index 3a901885..00000000
--- a/docs/5_Status-_und_Fehlercodes.md
+++ /dev/null
@@ -1,145 +0,0 @@
-# Status- und Fehlercodes
-
-Die XFall RESTful API liefert in allen Responses HTTP Response Codes. In der aktuell vorliegenden API Version werden nur HTTP Response Codes verwendet, die im [RFC 7231](https://tools.ietf.org/html/rfc7231) beschrieben sind. 
-
-API Clients sollten aber gemäß RFC 7231 so implementiert, dass auch unbekannte Response Status Codes (Neue Standardcodes oder proprietäre Erweiterungen) gemäß ihrer Statusklasse interpretiert werden können:
->    "HTTP status codes are extensible.  HTTP clients are not required to
-   understand the meaning of all registered status codes, though such
-   understanding is obviously desirable.  However, a client MUST
-   understand the class of any status code, as indicated by the first
-   digit, and treat an unrecognized status code as being equivalent to
-   the x00 status code of that class, with the exception that a
-   recipient MUST NOT cache a response with an unrecognized status code."
-
-
-### Ãœbersicht der verwendeten Response Codes und ihre Bedeutung
-
-Code | Text | Bedeutung
----------|----------|---------
- 200 | OK | Der Request war erfolgreich.
- 201 | Created | Eine Ressource wurde erfolgreich angelegt.
- 202 | Accepted | Daten wurden wurden erfolgreich übertragen und angenommen.
- 400 | Bad Request | Der Request war nicht korrekt aufgebaut oder es liegen mehrere Fehler vor, die unterschiedliche Statuscodes der 4xx-Klasse betreffen. 
- 401 | Unauthorized | Der Request lieferte keine oder eine ungültige Authentifikation.
- 403 | Forbidden | Die mit dem Request gelieferte Authentifikation ist für diese Resource nicht zugriffsberechtigt.
- 404 | Not Found | Die Ressource kann nicht unter dem angegeben Pfad gefunden werden oder temporär nicht verfügbar.
- 410 | Gone | Die Ressource ist unter dem Pfad permanent nicht mehr verfügbar. (bspw. weil die Ressource gelöscht wurde in dieser Repräsentation nicht mehr verfügbar ist)
- 413 | Request Entity Too Large | Der übertragene Datensatz ist zu groß.
- 415 | Unsupported Media Type | Der Datentyp wird nicht unterstützt.
- 500 | Internal Server Error | Es besteht ein Fehler auf Seite des API Providers.
-
-### Detailangaben zu clientseitig verursachten Fehlern
-
-Bei durch den API-Client verursachte Fehler (HTTP Statusklasse 4XX), liefert die API im Response Body eine [Error Body](../models/error-body.json) Mitteilung mit detaillierten Angaben, wodurch der Fehler versacht wurde. 
-
-Eine Error Mitteilung enthält folgende Angaben:
-
-- `code`: Standardisierter Fehlercode
-- `msg`: Textuelle Fehlermeldung
-- `ref`: Referenz auf fehlerhafte Stelle
-
-### Liste der Fehlercodes
-
-<!-- theme: warning -->
-> **Hinweis:**
-> Die im Folgenden beschriebenen Prüfungen und Fehlerfälle sind noch nicht implementiert und stellen aktuell eine Planung dar.
-
-#### Allgemeine Fehler
-
-**... Noch in der Erstellung ...**
-
-#### Application Transfer
-
-| HTTP Code                    | Code | Message                                                                                             | Referenz         | Tritt auf, wenn…                                                                                                                                       |
-|:---------------------------- |:----:|:--------------------------------------------------------------------------------------------------- |:---------------- |:------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| 404 Not Found                | 101  | Die Destination wurde nicht gefunden.                                                               | (keine)          | keine Destination mit der Destination-ID existiert                                                                                                     |
-| 413 Request Entity Too Large | 102  | Die Übertragung ist zu groß.                                                                        | (keine)          | die Gesamtgröße über der Maximalgröße der Destination liegt                                                                                            |
-| 413 Request Entity Too Large | 103  | Die Fachdaten sind zu groß.                                                                         | (keine)          | die Größe der Fachdaten (/contentStructure/data/size) über der Maximalgröße der Destination liegt                                                      |
-| 400 Bad Request              | 104  | Das Fachdatenschema des Antrags entspricht nicht den vorgebenen Schemata der Destination.           | (keine)          | ein Schema angegeben wird, das in der Destination nicht definiert wurde                                                                                |
-| 400 Bad Request              | 105  | Es darf keine Schema-ID angegeben werden.                                                           | (keine)          | die Schema-Quelle "none" und eine Schema-ID angegeben wurde                                                                                            |
-| 400 Bad Request              | 106  | Die Schema-ID fehlt.                                                                                | (keine)          | die Schema-Quelle "fim" und keine Schema-ID angegeben wurde                                                                                            |
-| 400 Bad Request              | 107  | Die Schema-ID referenziert kein FIM Stammdatenschema.                                               | (keine)          | die Schema-Quelle "fim" angegeben wurde, die Schema-ID aber nicht der Regex "^S\d{8}V\d+\.\d+$" entspricht                                             |
-| 413 Request Entity Too Large | 108  | Die Maximalzahl von Dokumenten wurde überschritten.                                                 | (keine)          | die Anzahl der Dokumente über der maximalen Anzahl der Destination liegt                                                                               |
-| 400 Bad Request              | 109  | Die Dokument-ID "{docId}" ist nicht eindeutig.                                                      | (keine)          | eine Doc-ID doppelt vorkommt                                                                                                                           |
-| 413 Request Entity Too Large | 110  | Das Dokument "{docId}" ist zu groß. Es sind nur {Maximalgröße} Bytes erlaubt.                       | (keine)          | die Größe des Dokuments (/contentStructure/docs[docId='{docId}']/size) über der Maximalgröße der Destination liegt                                     |
-| 400 Bad Request              | 111  | Der Content-Type des Dokuments "{docId}" ist ungültig.                                              | (keine)          | der MIME-Type (/contentStructure/docs[docId='{docId}']/mimeType) nicht RFC 2045 entspricht                                                             |
-| 404 Not Found                | 112  | Die Application wurde nicht gefunden.                                                               | (keine)          | keine Application mit der Application-ID existiert                                                                                                     |
-| 404 Not Found                | 113  | Die Application wurde nicht gefunden.                                                               | (keine)          | die Application-ID nicht zur Source-ID passt                                                                                                           |
-| 404 Not Found                | 114  | Die Application wurde nicht gefunden.                                                               | (keine)          | die Application-ID nicht zur Destination-ID passt                                                                                                      |
-| 400 Bad Request              | 115  | Fachdaten können nicht übermittelt werden. Es wurde kein "data" Element in den Metadaten angegeben. | (keine)          | in den Metadaten kein /contentStructure/data Element enthalten ist                                                                                     |
-| 400 Bad Request              | 116  | Die Größe der übermittelten Fachdaten entspricht nicht dem Eintrag in den Metadaten.                | (keine)          | die Größe des Bodys nicht mit /contentStructure/data/size in den Metadaten übereinstimmt                                                               |
-| 415 Unsupported Media Type   | 117  | Der Typ (Content-Type) der Fachdaten ist falsch.                                                    | (keine)          | der MIME-Type nicht mit /data/schema/mimeType übereinstimmt                                                                                            |
-| 400 Bad Request              | 118  | Die Fachdaten entsprechen nicht dem geforderten Format.                                             | (keine)          | die Fachdaten nicht dem Format (JSON bzw. XML) entsprechen                                                                                             |
-| 400 Bad Request              | 119  | Die Fachdaten entsprechen nicht dem geforderten Schema.                                             | (keine)          | ein Schema referenziert wurde (Schema-Source ≠ "none" und gültige Schema-ID) und die Fachdaten nicht dem Schema entsprechen                            |
-| 404 Not Found                | 120  | Die Application wurde nicht gefunden.                                                               | (keine)          | keine Application mit der Application-ID existiert                                                                                                     |
-| 404 Not Found                | 121  | Die Application wurde nicht gefunden.                                                               | (keine)          | die Application-ID nicht zur Source-ID passt                                                                                                           |
-| 404 Not Found                | 122  | Die Application wurde nicht gefunden.                                                               | (keine)          | die Application-ID nicht zur Destination-ID passt                                                                                                      |
-| 404 Not Found                | 123  | Das Dokument wurde nicht gefunden.                                                                  | (keine)          | die Doc-ID nicht zur Application-ID passt                                                                                                              |
-| 400 Bad Request              | 124  | Die Prüfsumme (Hash) des Dokuments "{docId}" stimmt nicht mit der in den Metadaten überein.         | (keine)          | der Hash in den Metadaten nicht zu dem hochgeladenen Dokument passt                                                                                    |
-| 400 Bad Request              | 125  | Die Signatur des Dokuments "{docId}" passt nicht zum Dokument.                                      | (keine)          | die Signatur in den Metadaten nicht zu dem hochgeladenen Dokument passt                                                                                |
-| 404 Not Found                | 126  | Die Application wurde nicht gefunden.                                                               | (keine)          | keine Application mit der Application-ID existiert                                                                                                     |
-| 404 Not Found                | 127  | Die Application wurde nicht gefunden.                                                               | (keine)          | die Application-ID nicht zur Source-ID passt                                                                                                           |
-| 404 Not Found                | 128  | Die Application wurde nicht gefunden.                                                               | (keine)          | die Application-ID nicht zur Destination-ID passt                                                                                                      |
-| 400 Bad Request              | 129  | Die Fachdaten fehlen noch.                                                                          | (keine)          | Fachdaten in den Metadaten angegeben wurden (/contentStructure/data), aber keine Fachdaten hochgeladen wurden                                          |
-| 400 Bad Request              | 132  | Das Dokument '{docId}' fehlt noch.                                                                  | (keine)          | nicht alle in den Metadaten angegebenen (/contentStructure/docs) Dokumente hochgeladen wurden                                                          |
-| 400 Bad Request              | 133  | Das Dokument '{docId}' wurde nicht vollständig hochgeladen.                                         | (keine)          | Das Dokument '{docId}' wurde nicht vollständig hochgeladen.                                                                                            |
-
-#### Status & Transfer Related Information
-
-| HTTP Code     | Code | Message                                                          | Referenz | Tritt auf, wenn…                                               |
-|:------------- |:----:|:---------------------------------------------------------------- |:-------- |:-------------------------------------------------------------- |
-| 404 Not Found | 201  | Es wurde keine Statusinformation für diese Application gefunden. | (keine)  | kein Status/keine Application mit der Application-ID existiert |
-| 404 Not Found | 202  | Es wurde keine Statusinformation für diese Application gefunden. | (keine)  | die Application-ID nicht zur Source-ID passt                   |
-| 404 Not Found | 203  | Die Application wurde nicht gefunden.                            | (keine)  | keine Application mit der Application-ID existiert             |
-| 404 Not Found | 204  | Die Application wurde nicht gefunden.                            | (keine)  | die Application-ID nicht zur Source-ID passt                   |
-| 404 Not Found | 205  | Die Application wurde nicht gefunden.                            | (keine)  | die Application-ID nicht zur Destination-ID passt              |
-| 404 Not Found | 206  | Die Destination wurde nicht gefunden.                            | (keine)  | keine Destination mit der Destination-ID existiert             |
-| 404 Not Found | 207  | Die Application wurde nicht gefunden.                            | (keine)  | die Application-ID nicht zur Destination-ID passt              |
-
-#### Destination Management
-
-| HTTP Code | Code | Message | Referenz | Tritt auf, wenn… |
-|:--------- |:----:|:------- |:-------- |:---------------- |
-| 404 Not Found | 301 | Der Subscriber wurde nicht gefunden. | (keine) | kein Subscriber mit der Subscriber-ID existiert |
-| 404 Not Found | 302 | Die Destination wurde nicht gefunden. | (keine) | keine Destination mit der Destination-ID existiert |
-| 404 Not Found | 303 | Die Destination wurde nicht gefunden. | (keine) | die Destination-ID nicht zur Subscriber-ID passt |
-| 404 Not Found | 304 | Die Destination wurde nicht gefunden. | (keine) | keine Destination mit der Destination-ID existiert |
-| 404 Not Found | 305 | Die Destination wurde nicht gefunden. | (keine) | die Destination-ID nicht zur Subscriber-ID passt |
-| 400 Bad Request | 306 | Die Destination-ID darf nicht geändert werden. | /destinationId | die Destination-ID in URL und Body nicht übereinstimmen |
-| 404 Not Found | 307 | Die Destination wurde nicht gefunden. | (keine) | keine Destination mit der Destination-ID existiert |
-| 404 Not Found | 308 | Die Destination wurde nicht gefunden. | (keine) | die Destination-ID nicht zur Subscriber-ID passt |
-
-#### Application Retrieval
-
-
-| HTTP Code     | Code | Message                                                     | Referenz | Tritt auf, wenn…                                           |
-|:------------- |:----:|:----------------------------------------------------------- |:-------- |:---------------------------------------------------------- |
-| 404 Not Found | 401  | Die Destination wurde nicht gefunden.                       | (keine)  | keine Destination mit der Destination-ID existiert         |
-| 404 Not Found | 402  | Die Destination wurde nicht gefunden.                       | (keine)  | die Destination-ID nicht zur Subscriber-ID passt           |
-| 404 Not Found | 403  | Die Application wurde nicht gefunden.                       | (keine)  | keine Application mit der Application-ID existiert         |
-| 404 Not Found | 404  | Die Application wurde nicht gefunden.                       | (keine)  | die Application-ID nicht zur Destination-ID passt          |
-| 404 Not Found | 405  | Die Application wurde nicht gefunden.                       | (keine)  | der Status 'incomplete' ist                                |
-| 404 Not Found | 406  | Im aktuellen Status ist nur das finale Acknowledge möglich. | (keine)  | der Status 'forwarded' ist und 'finalDelivery' 'false' ist |
-| 404 Not Found | 407  | Im aktuellen Status ist kein Acknowledge möglich.           | (keine)  | der Status 'delivered' ist                                 |
-| 404 Not Found | 408  | Die Destination wurde nicht gefunden.                       | (keine)  | keine Destination mit der Destination-ID existiert         |
-| 404 Not Found | 409  | Die Destination wurde nicht gefunden.                       | (keine)  | die Destination-ID nicht zur Subscriber-ID passt           |
-| 404 Not Found | 410  | Die Application wurde nicht gefunden.                       | (keine)  | keine Application mit der Application-ID existiert         |
-| 404 Not Found | 411  | Die Application wurde nicht gefunden.                       | (keine)  | die Application-ID nicht zur Destination-ID passt          |
-| 404 Not Found | 412  | Die Application wurde nicht gefunden.                       | (keine)  | der Status 'incomplete' ist                                |
-| 404 Not Found | 413  | Die Application wurde nicht gefunden.                       | (keine)  | der Status nicht 'queued' ist                              |
-| 404 Not Found | 414  | Es wurden keine Fachdaten gefunden.                         | (keine)  | keine Fachdaten vorliegen                                  |
-| 404 Not Found | 415  | Die Destination wurde nicht gefunden.                       | (keine)  | keine Destination mit der Destination-ID existiert         |
-| 404 Not Found | 416  | Die Destination wurde nicht gefunden.                       | (keine)  | die Destination-ID nicht zur Subscriber-ID passt           |
-| 404 Not Found | 417  | Die Application wurde nicht gefunden.                       | (keine)  | keine Application mit der Application-ID existiert         |
-| 404 Not Found | 418  | Die Application wurde nicht gefunden.                       | (keine)  | die Application-ID nicht zur Destination-ID passt          |
-| 404 Not Found | 419  | Die Application wurde nicht gefunden.                       | (keine)  | der Status 'incomplete' ist                                |
-| 404 Not Found | 420  | Die Application wurde nicht gefunden.                       | (keine)  | der Status nicht 'queued' ist                              |
-| 404 Not Found | 421  | Das Dokument wurde nicht gefunden.                          | (keine)  | die Doc-ID nicht zur Application-ID passt                  |
-| 404 Not Found | 408  | Die Destination wurde nicht gefunden.                       | (keine)  | keine Destination mit der Destination-ID existiert         |
-| 404 Not Found | 409  | Die Destination wurde nicht gefunden.                       | (keine)  | die Destination-ID nicht zur Subscriber-ID passt           |
-| 404 Not Found | 410  | Die Application wurde nicht gefunden.                       | (keine)  | keine Application mit der Application-ID existiert         |
-| 404 Not Found | 411  | Die Application wurde nicht gefunden.                       | (keine)  | die Application-ID nicht zur Destination-ID passt          |
-| 404 Not Found | 412  | Die Application wurde nicht gefunden.                       | (keine)  | der Status 'incomplete' ist                                |
-| 404 Not Found | 413  | Die Application wurde nicht gefunden.                       | (keine)  | der Status nicht 'queued' ist                              |
-| 404 Not Found | 408  | Die Destination wurde nicht gefunden.                       | (keine)  | keine Destination mit der Destination-ID existiert         |
-| 404 Not Found | 409  | Die Destination wurde nicht gefunden.                       | (keine)  | die Destination-ID nicht zur Subscriber-ID passt           |
-- 
GitLab