## API

> Wenn die env variable `API_SECRET` gesetzt ist, muss jede API Request den HTTP Header `Authorization: Basic <API_SECRET>` haben.

<details>
<summary><code>POST</code> <code>/api/feedback</code> (Erstellt Feedbackformulare)</summary>

##### Request Body

```
{
  // Interner Event Name (oder ID)
  "event": string,
  // Event Titel, wird über dem Feedbackformular angezeigt
  "title": string,
  // UUIDs aller Spieler, die das Feedback ausfüllen sollen
  "users": string[]
}
```

##### Response Codes

| http code | beschreibung                               |
| --------- | ------------------------------------------ |
| 200       | /                                          |
| 400       | Der Request Body ist falsch                |
| 401       | Es wurde ein falsches API Secret angegeben |

##### Response Body

```
{
  "feedback": {
    // UUID eines Spieler
    "uuid": string
    // URL zum Feedbackformular
    "url": string
  }[]
}
```

</details>

<details>
<summary><code>POST</code> <code>/api/player/death</code> (Registriert einen Spielertod)</summary>

##### Request Body

```
{
  // UUID des getöteten Spielers
  "user": string,
  // UUID des Spielers, der den Kill gemacht hat
  "killer": string | null,
  // Todesnachricht
  "message": string
}
```

##### Response Codes

| http code | beschreibung                                                                     |
| --------- | -------------------------------------------------------------------------------- |
| 200       | /                                                                                |
| 400       | Der Request Body ist falsch                                                      |
| 401       | Es wurde ein falsches API Secret angegeben                                       |
| 404       | Der getötete Spieler, oder der Spieler der den Kill gemacht hat, existiert nicht |

##### Response Body

`/`

</details>

<details>
<summary><code>POST</code> <code>/api/player/status</code> (Status eines Spielers)</summary>

##### Request Body

```
{
  // UUID eines Spielers
  "user": string
}
```

##### Response Codes

| http code | beschreibung                                        |
| --------- | --------------------------------------------------- |
| 200       | /                                                   |
| 400       | Der Request Body ist falsch                         |
| 401       | Es wurde ein falsches API Secret angegeben          |
| 404       | Der Spieler existiert nicht oder ist in keinem Team |

##### Response Body

```
{
  "team": {
    // Teamname
    "name": string,
    // Teamfarbe in HEX
    "color": string
  },
  // Ob der Spieler Tot ist
  "dead": boolean,
  // Gewichtung aller Strikes
  "strikeWeight": number,
  // UTC timestamp wann das Team zuletzt gejoined ist
  "lastJoined": number | null
}
```

</details>

<details>
<summary><code>PUT</code> <code>/api/player/status</code> (Updatet den Status eines Spielers)</summary>

##### Request Body

```
{
  // UUID eines Spieler
  "user": string,
  // Registriert einen neuen UTC timestamp an dem das Team zuletzt gejoined ist
  "lastJoined": number
}
```

##### Response Codes

| http code | beschreibung                               |
| --------- | ------------------------------------------ |
| 200       | /                                          |
| 400       | Der Request Body ist falsch                |
| 401       | Es wurde ein falsches API Secret angegeben |

##### Response Body

`/`

</details>

<details>
<summary><code>GET</code> <code>/api/team</code> (Liste aller Teams)</summary>

##### Request Body

`/`

##### Response Codes

| http code | beschreibung                               |
| --------- | ------------------------------------------ |
| 200       | /                                          |
| 400       | Der Request Body ist falsch                |
| 401       | Es wurde ein falsches API Secret angegeben |

##### Response Body

```
{
  // Teamname
  "name": string,
  // Teamfarbe in HEX
  "color": string,
  // UTC timestamp wann das Team zuletzt gejoined ist
  "lastJoined": number | null,
  // Gewichtung aller Strikes
  "strikeWeight": number,
  // Alle Spieler des Teams
  "users": {
    // UUID des Spielers
    "uuid": string,
    // Ob der Spieler Tot ist
    "dead": boolean
  }[]
}
```

</details>

## Webhook

> Die env variable `WEBHOOK_ENDPOINT` muss gesetzt und eine valide HTTP URL sein.

Bei bestimmten Aktionen wird an den Webhook Endpoint ein Webhook gesendet.
Die Art des Webhooks wird dabei durch den `x-webhook-action` HTTP Header angegeben und hat einen festgelegten JSON Body.

Das Webhook wir so oft gesendet, bis der angegebene Webhook Endpoint eine Response mit Status `200` zurücksendet.

Alle Webhooks:

| Beschreibung                     | HTTP Header                         | Body                                                                                                                                                                                                                                                   |
| -------------------------------- | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Ein Team hat ein Strike bekommen | <pre>x-webhook-action: strike</pre> | <pre>{<br>&nbsp;&nbsp;// UUIDs aller Nutzer des Teams, das einen Strike bekommen hat<br>&nbsp;&nbsp;"users": string[],<br>&nbsp;&nbsp;// Gewichtung aller Strikes, die das Team insgesamt bekommen hat<br>&nbsp;&nbsp;"totalWeight": number<br>}</pre> |