16
Daisy/grupprumsbokning
erth9960 edited this page 2025-09-22 10:34:08 +02:00

Specifikation för grupprumsbokning i Daisys nya API

Se även Generella krav för samtliga APIer

Hämta komplett kontext för att genomföra en bokning

Returnerar all information om de grupprum den autentiserade användaren kan boka, inklusive alla bokningar inom det bokningsbara intervallet.

Inkluderar relevant metadata som behövs för att uppfylla reglerna för bokning.

Det finns filter för att begränsa svaret till rum med en viss kapacitet.

Specifikation

Förfrågan

  • HTTP-verb: GET
  • Autentiserad: ja
  • Endpoint: /booking/group-rooms
  • Argument:
    • minsize: number
      Frivilligt argument. Inkludera endast rum med minst det angivna antalet platser.
    • maxsize: number
      Frivilligt argument. Inkludera endast rum med max det angivna antalet platser.

Svar

{
  "rooms": [
    {
      "id": string,
      "name": string,
      "capacity": number,
      "bookings": [
        {
          "start": string,
          "end": string
        }
      ]
    }
  ],
  "max_bookable_length": string,
  "earliest_booking_time": string,
  "latest_booking_time": string,
  "minimum_participants": number,
  "furthest_bookable_date": string
}

Svarsobjektets nycklar:

  • rooms: list
    En lista med rumsobjekt.

  • max_bookable_length: string
    Maximal tillåten längd på en bokning, formaterat som ett ISO-tidsintervall.

  • earliest_booking_time: string
    Tidigaste tillåtna tid på dagen som en bokning får börja, formaterat som en ISO-tid.

  • latest_booking_time: string
    Senaste tillåtna tid på dagen som en bokning får sluta, formaterat som en ISO-tid.

  • minimum_participants: number
    Minsta antal deltagare på en bokning för att den ska accepteras.

  • furthest_bookable_date: string
    Sista datum då användaren får lägga en bokning vid tidpunkten då svaret skickas, formaterat som ett ISO-datum.

Rumsobjektens nycklar:

  • id: string
    En arbiträr sträng som unikt identifierar ett rum.

  • name: string
    Rummets namn.

  • capacity: number
    Antalet platser i rummet.

  • bookings: list
    En lista med bokningsobjekt.

Bokningsojektens nycklar:

  • start: string
    Datum och tid då bokningen börjar, formaterat som ett ISO-datum+tid.

  • end: string
    Datum och tid då bokningen slutar, formaterat som ett ISO-datum+tid.

Exempel

Dagens datum är i exemplet 2024-11-01 och det bokningsbara intervallet är 14 dagar.

> GET /v1/booking/group-rooms?maxsize=5
> Authorization: Bearer <oauth 2 token>
> Accept: application/json
< 200 OK
< Content-Type: application/json
{
  "rooms": [
    {
      "id": "1",
      "name": "Small Room 1",
      "capacity": 5,
      "bookings": [
        {
          "start": "2024-11-03T10:00:00",
          "end": "2024-11-03T12:00:00"
        },
        {
          "start": "2024-11-03T12:30:00",
          "end": "2024-11-03T14: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"
        }
      ]
    }
  ],
  "max_bookable_length": "PT4H",
  "earliest_booking_time": "08:00:00",
  "latest_booking_time": "20:00:00",
  "minimum_participants": 2,
  "furthest_bookable_date": "2024-11-15"
}

Hämta mina bokningar

Returnerar en lista med grupprumsbokningar som invloverar den autentiserade användaren.

Bokningsojekten innehåller all information som krävs för att kunna presentera bokningarna för användaren.

Det framgår ur bokningen om användaren kan redigera den.

Användaren kan alltid ta bort sig själv som deltagare på en bokning, se Ta bort en bokning för detaljer.

Specifikation

Förfrågan

  • HTTP-verb: GET
  • Autentiserad: ja
  • Endpoint: /booking/group-rooms/mine

Svar

[
  {
    "booking_id": string,
    "booking_name": string,
    "room_id": string,
    "room_name": string,
    "start": string,
    "end": string,
    "editable": boolean,
    "participants": [
      string
    ]
  }
]

Svaret är en json-lista med bokningsobjekt.

Bokningsobjektens nycklar:

  • booking_id: string
    En arbiträr sträng som unikt identifierar en bokning.

  • booking_name: string
    Bokningens namn.

  • room_id: string
    En arbiträr sträng som unikt identifierar ett rum.

  • room_name: string
    Det bokade rummets namn.

  • start: string
    Datum och tid då bokningen börjar, formaterat som ett ISO-datum+tid.

  • end: string
    Datum och tid då bokningen slutar, formaterat som ett ISO-datum+tid.

  • editable: boolean
    true om användaren kan redigera bokningen. Användaren ska alltid kunna ta bort sig själv från additional_participants.

  • participants: list
    Lista på samtliga SU-användarnamn som deltar i bokningen, inklusive bokaren.

Exempel

> GET /v1/booking/group-rooms/mine
> Authorization: Bearer <oauth 2 token>
> Accept: application/json
< 200 OK
< Content-Type: application/json
[
  {
    "booking_id": "leif43253240",
    "booking_name": "Team standup",
    "room_name": "G5:7",
    "start": "2024-11-20T08:00",
    "end": "2024-11-20T10:00",
    "editable": false,
    "participants": [
      "me@su.se",
      "kaan8888@su.se",
      "joan7777@su.se"
    ]
  }
]

Skapa en bokning

Skapar en bokning för den autentiserade användaren, givet att bokningen uppfyller systemets regler. Det returnerade svaret innehåller all information som behövs för att kunna presentera en tydlig bokningsbekräftelse för användaren.

Specifikation

Förfrågan

  • HTTP-verb: POST
  • Autentiserad: ja
  • Endpoint: /booking/group-rooms/bookings
  • Body:
    {
      "room_id": string,
      "name": string,
      "start": string,
      "end": string,
      "additional_participants": [
        string
      ]
    }
    

Body-objektets nycklar:

  • room_id: string
    En arbiträr sträng som unikt identifierar ett rum.

  • name: string
    Bokningens namn.

  • start: string
    Datum och tid då bokningen börjar, formaterat som ett ISO-datum+tid.

  • end: string
    Datum och tid då bokningen slutar, formaterat som ett ISO-datum+tid.

  • additional_participants: list
    Lista över SU-användarnamn som deltar i bokningen utöver den bokande användaren.

Svar

{
  "booking_id": string,
  "name": string,
  "room_id": string,
  "room_name": string,
  "start": string,
  "end": string,
  "participants": [
    string
  ]
}

Svarsobjektets nycklar:

  • booking_id: string
    En arbiträr sträng som unikt identifierar en bokning.

  • name: string
    Bokningens namn.

  • room_id: string
    En arbiträr sträng som unikt identifierar ett rum.

  • room_name: string
    Det bokade rummets namn.

  • start: string
    Datum och tid då bokningen börjar, formaterat som ett ISO-datum+tid.

  • end: string
    Datum och tid då bokningen slutar, formaterat som ett ISO-datum+tid.

  • participants: list
    Lista på samtliga SU-användarnamn som deltar i bokningen, inklusive bokaren.

Exempel

> POST /v1/booking/group-rooms/bookings
> Authorization: Bearer <oauth 2 token>
> Accept: application/json
{
  "room_id": "123462abc",
  "name": "Min bokning för tentaplugg 😃<script>alert('hej')</script>",
  "start": "2024-11-08T12:00:00",
  "end": "2024-11-08T13:00:00",
  "additional_participants": [
    "stud1234@su.se",
    "komp153n@su.se"
  ]
}
< 200 OK
< Content-Type: application/json
{
  "booking_id": "leif43253240",
  "name": "Min bokning för tentaplugg 😃<script>alert('hej')</script>",
  "room_id": "foobar65323",
  "room_name": "G5:7",
  "start": "2024-11-08T12:00:00",
  "end": "2024-11-08T13:00:00",
  "participants": [
    "me@su.se",
    "stud1234@su.se",
    "komp153n@su.se"
  ]
}

Uppdatera en bokning

Ändrar innehållet i en grupprumsbokning, givet att den autentiserade användaren har rätt att redigera bokningen.

Förfrågan innehåller alla fält, även såna som inte ska ändras.

Det är tillåtet men inte obligatoriskt att inkludera sig själv i additional_participants.

Specifikation

Förfrågan

  • HTTP-verb: PUT
  • Autentiserad: ja
  • Endpoint: /booking/group-rooms/bookings/{booking_id}
  • Body:
    {
      "booking_id": string,
      "booking_name": string,
      "room_id": string,
      "start": string,
      "end": string,
      "additional_participants": [
        string
      ]
    }
    

Body-objektets nycklar:

  • booking_id: string
    En arbiträr sträng som unikt identifierar en bokning.

  • booking_name: string
    Bokningens namn.

  • room_id: string
    En arbiträr sträng som unikt identifierar ett rum.

  • start: string
    Datum och tid då bokningen börjar, formaterat som ett ISO-datum+tid.

  • end: string
    Datum och tid då bokningen slutar, formaterat som ett ISO-datum+tid.

  • additional_participants: list
    Lista över SU-användarnamn som deltar i bokningen utöver den bokande användaren.

Svar

Se samma svar som för att skapa bokning.

Exempel

> PUT /v1/booking/group-rooms/bookings/{booking_id}
> Authorization: Bearer <oauth 2 token>
> Accept: application/json
> Content-Type: application/json
{
  "booking_id": "leif43253240",
  "name": "Min bokning för tentaplugg 😃",
  "start": "2024-11-08T12:00:00",
  "end": "2024-11-08T13:00:00",
  "additional_participants": [
    "stud1234@su.se",
    "komp153n@su.se"
  ]
}
< 200 OK
< Content-Type: application/json
{
  "booking_id": "leif43253240",
  "name": "Min bokning för tentaplugg 😃",
  "room_name": "G5:7",
  "start": "2024-11-08T12:00:00",
  "end": "2024-11-08T13:00:00",
  "participants": [
    "me@su.se",
    "stud1234@su.se",
    "komp153n@su.se"
  ]
}

Ta bort en bokning

Raderar en bokning, givet att den autentiserade användaren har rätt att redigera bokningen.

Om användaren inte har rätt att redigera men är deltagare i bokningen raderas användaren istället ur deltagarlistan.

Faller antalet deltagare under reglernas krav så är det upp till APIet att avgöra vad som händer. Det framgår ur svaret huruvida bokningen finns kvar eller ej.

Specifikation

Förfrågan

  • HTTP-verb: DELETE
  • Autentiserad: ja
  • Endpoint: /booking/group-rooms/bookings/{booking_id}

Svar

Ett boknings-objekt i samma format som svaret när en bokning skapas, eller ett tomt objekt om bokningen raderats helt.

Exempel

> DELETE /v1/booking/group-rooms/bookings/{booking_id}
> Authorization: Bearer <oauth 2 token>

Bokningen raderades helt (användaren som gjorde förfrågan ägde bokningen):

< 200 OK
< Content-Type: application/json
{
  "result": "deleted"
}

Bokningen finns kvar men den förfrågande användaren togs bort:

< 200 OK
< Content-Type: application/json
{
  "result": "removed_participation"
}

Leta upp potentiella deltagare i en bokning

Returnerar upp till 5 förslag på bokningsdeltagare, givet en söksträng och datumet då den tilltänkta bokningen ska börja.

Söksträngen matchas mot alla ord i personers DisplayName (DN i SUKAT).

Datumet används som hint till sökningen för att möjliggöra mest relevanta resultat.

Förslagen baseras på en heuristisk sökning som försöker ge så relevanta förslag som möjligt. En möjlighet är att börja med att leta bland befintliga bokningar den autentiserade användaren deltar på, vidga till användarens pågående kurser, vidga till användarens historiska kurser och till slut kolla bland alla användare. Den exakta implementationen av den heuristiska sökalgoritmen är upp till API-implementatören.

Specifikation

Förfrågan

  • HTTP-verb: GET
  • Autentiserad: ja
  • Endpoint: /booking/group-rooms/people
  • Argument:
    • search: string
      Obligatoriskt argument. Söksträngen måste vara minst ett tecken lång.
    • date: string
      Frivilligt argument. Datumet då bokningen ska börja, formaterat som ett ISO-datum. Utelämnas det här argumentet så används dagens datum.

Svar

[
  string
]

Svaret är en json-lista med SU-användarnamn.

Exempel

> POST /v1/booking/group-rooms/people?search=Ka&date=2024-09-11
> Authorization: Bearer <oauth 2 token>
> Accept: application/json
< 200 OK
< Content-Type: application/json
[
  "kaka1234@su.se",
  "joka6432@su.se",
  "karv4525@su.se",
  "sfka6745@su.se",
  "kalle@su.se"
]