api-spec/daisy/grupprumsbokning.md

288 lines
6.2 KiB
Markdown

# Specifikation för grupprumsbokning i Daisys nya API
## Säkerhet/autentisering
API:t skall använda sig av [OAuth 2.0](https://datatracker.ietf.org/doc/html/rfc6749) med
[JSON Web Tokens (JWT)](https://datatracker.ietf.org/doc/html/rfc7519) i
[JSON Web Signature (JWS)](https://datatracker.ietf.org/doc/html/rfc7515) format för
autentisering och avgöra behörigheter på principalen (`sub`) som identifieras av token och
eventuella `entitlements`.
För mer information se https://oauth2.dsv.su.se/
## Prestandakrav
99% av alla giltiga förfrågningar måste svaras på inom 100ms. Detta måste gälla hela tiden
genom att mäta i ett kort rullande fönster, inte bara genomsnittligt över en längre period.
## Internationalisering
Om en lokal eller annan data har namn (eller annat attribut) på flera språk skall värdet
baseras på HTTP headern [`Accept-Language`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Accept-Language)
och språket ska anges i svaret med hjälp av [`Content-Language`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Content-Language)
om inget av språken i `Accept-Language` finns skall det falla tillbaka på engelska.
Denna internationalisering måste även appliceras på felmeddelanden; `title`, `detail`, och eventuella extra attribut.
### Exempel med språk som inte stöds
```
> GET /lokal
> Accept-Language: de
```
```
< 200 OK
< Content-Language: en
```
```
{
"name": "Meeting room"
}
```
### Exempel med språk som stöds
```
> GET /lokal
> Accept-Language: sv
```
```
< 200 OK
< Content-Language: sv
```
```
{
"name": "Mötesrum"
}
```
## Felhantering
Fel anges i [RFC 7807](https://datatracker.ietf.org/doc/html/rfc7807) format (Problem details)
Alla olika feltyper (`type` attribut) skall dokumenteras
### Exempel på generella fel som kan förekomma i alla anrop
#### Ej behörig
```
< 403 Forbidden
< Content-Type: application/problem+json
```
```json
{
"type": "daisy:forbidden",
"title": "You can not perform this action",
"detail": "You may not book a group room because you are not a student at SU",
"instance": "/v1/bookings/group-rooms"
}
```
#### Felaktigt format på datum/tid
```
< 400 Bad request
< Content-Type: application/problem+json
```
```json
{
"type": "daisy:bad-request",
"title": "Bad request",
"detail": "Badly formatted request",
"instance": "/v1/bookings/group-rooms",
"violations": {
"start_time": "Must be in format YYYY-MM-DDTHH:MM",
"name": "Too long, max 100 characters"
}
}
```
## Hämta komplett kontext för att genomföra en bokning
### Förfrågan
```
> GET /v1/bookings/group-rooms?size={small,large}
> Authorization: Bearer <oauth 2 token>
> Accept: application/json
```
Ger mig (identifierad av oauth 2 token) all information om dom små/stora grupprum jag kan boka
inklusive alla bokningar inom det bokningsbara intervallet.
Givet att datum är 2024-11-01 och bokningsbara intervallet är 14 dagar är nedan ett exempel på svar
### Svar
```
< 200 OK
< Content-Type: application/json
```
```json
{
"rooms": [
{
"id": "1",
"name": "Small Room 1",
"capacity": 5,
"bookings": [
{
"start": "2024-11-03T10:00:00",
"end": "2024-11-03T12:00:00"
}
]
},
{
"id": "abcd-uuid8v3-blaj-blaj",
"name": "Small Room 2",
"capacity": 5,
"bookings": [
{
"start": "2024-11-10T14:00:00",
"end": "2024-11-10T18:00:00"
}
]
}
],
"maxBookableLength": "PT4H",
"earliestBookingTime": "08:00:00",
"latestBookingTime": "20:00:00",
"minimumParticipants": 2,
"maxDaysInFuture": 14
}
```
## Göra en bokning
### Förfrågan
```
> POST /v1/bookings/group-rooms
> Authorization: Bearer <oauth 2 token>
> Accept: application/json
> Content-Type: application/json
```
`additional_participants` inkluderar inte mig själv (som står i oauth 2 token)
`name` skall kunna inkludera full utf-8
```json
{
"room_id": "123462abc",
"start_time": "2024-11-08T12:00",
"end_time": "2024-11-08T13:00",
"additional_participants": [
"stud1234@su.se",
"komp153n@su.se"
],
"name": "Min bokning för tentaplugg 😃<script>alert('hej')</script>"
}
```
### Svar
#### Allt gick bra
```
< 200 OK
< Content-Type: application/json
```
```json
{
"booking_id": "leif43253240",
"name": "Team standup",
"room_name": "G5:7",
"start_time": "2024-11-20T08:00",
"end_time": "2024-11-20T10:00",
"additional_participants": [
"kaan8888@su.se",
"joan7777@su.se"
]
}
```
#### För lång bokning
```
< 400 Bad request
< Content-Type: application/problem+json
```
```json
{
"type": "daisy:duration-too-long",
"title": "Booking exceeds max length",
"detail": "You may only book max four hours and you tried to book 5",
"instance": "/v1/bookings/group-rooms"
}
```
#### För få deltagare
```
< 400 Bad request
< Content-Type: application/problem+json
```
```json
{
"type": "daisy:too-few-participants",
"title": "Booking needs more participants",
"detail": "You may only book with at least two participants, not by yourself",
"instance": "/v1/bookings/group-rooms"
}
```
## Hämta mina bokningar
### Förfrågan
```
> GET /v1/bookings/group-rooms/mine
> Authorization: Bearer <oauth 2 token>
> Accept: application/json
```
### Svar
```
< 200 OK
< Content-Type: application/json
```
```json
[
{
"booking_id": "leif43253240",
"name": "Team standup",
"room_name": "G5:7",
"start_time": "2024-11-20T08:00",
"end_time": "2024-11-20T10:00",
"additional_participants": [
"kaan8888@su.se",
"joan7777@su.se"
]
}
]
```
## Uppdatera en bokning
### Förfrågan
```
> PUT /v1/bookings/group-rooms/{booking_id}
> Authorization: Bearer <oauth 2 token>
> Accept: application/json
> Content-Type: application/json
```
```json
{
"room_id": "123462abc",
"start_time": "2024-11-08T12:00",
"end_time": "2024-11-08T13:00",
"additional_participants": [
"stud1234@su.se",
"komp153n@su.se"
],
"name": "Min bokning för tentaplugg 😃<script>alert('hej')</script>"
}
```
### Svar
Se samma svar som för att skapa bokning
## Ta bort en bokning
### Förfrågan
```
> DELETE /v1/bookings/group-rooms/{booking_id}
> Authorization: Bearer <oauth 2 token>
```
### Svar
```
< 204 No Content
```