Table of Contents
Syfte
Använd HATEOAS för att undvika behovet av att ändra Studentportalen när bakomliggande tjänster uppdateras.
Motivation
Designen för schemat visar att det, beroende på händelsetyp, ska finnas knappar för att interagera med den givna händelsen på olika sätt. Till exempel för att avboka ett grupprum, ställa sig i handledningskö, eller anmäla sig till en tenta. Det skulle vara bra att slippa massor med if-satser och specialhantering för alla olika interaktioner som kan göras beroende på typ och data som annars inte skulle behövas i schemat. Tänk ett tentatillfälle på en kurs man går, för att kunna ha knappar för att (av-)anmäla sig så måste det komma med data om man är anmäld eller inte och också om det går att anmäla sig från första början. Inget av dessa är data som är generellt för schemahändelser eller kommer visas i GUI:t mer än att styra knapparna.
{event.type == 'tenta' && event.can_register && <Button onClick={registerForExam(event.exam)}>Anmäl till tenta</button>}
{event.type == 'tenta' && event.can_unregister && <Button onClick={unRegisterForExam(event.exam)}>Avanmäl från tenta</button>}
{event.type == 'rumsbokning' && event.booked_by == me && <Button onClick={cancelRoombooking(event.booking)}>Avboka</button>}
{event.type == 'handledning' && event.can_queue && <Button onClick={registerForTutoring(event.tutoring_queue)}>Ställ i kö för handledning</button>}
{event.type == 'handledning' && event.is_queued && <Button onClick={pauseTutoringQueue(event.tutoring_queue)}>Pausa köplats</button>}
{event.type == 'handledning' && event.is_queued && <Button onClick={unRegisterForTutoring(event.tutoring_queue)}>Lämna kön</button>}
...
Ovan block kommer växa och växa och kräver utveckling av Studentportalen när det kommer upp nya typer av händelser eller åtgärder som kan tas. Utöver ett sådant långt kodblock så måste man ha specifika endpoints i BFF:en som hanterar dom olika åtgärderna och vet vilket bakomliggande system den ska prata med.
Förslag
Genom att utnyttja HATEOAS kan varje händelse inkludera en lista på åtgärder som kan tas på händelsen som bakomliggande systemet har avgjort baserat på dess tillstånd (som då inte behöver göras publikt).
{
"start_time": "...",
"title": "Ordinarie tenta",
"actions": [
{
"title": "Anmäl till tentan",
"url": "https://daisy.dsv.su.se/api/tenta/register/27815705-4137-45b2-94ed-430d8a7815e7"
}
]
}
Gör man sedan en POST till den URL:n så genomförs den beskrivna åtgärden. För att sedan kunna agera på resultatet föreslås ett svar likt följande;
{
"messages": [
{
"level": "success | warning | error",
"message": "Du har blivit anmäld till tentan"
}
],
"actions": [
{
"title": "Avanmäl från tentan",
"url": "https://daisy.dsv.su.se/api/tenta/unregister/065c03a4-0a21-4f31-a6fc-067ba8e04cef"
}
]
}
På detta sätt behövs ingen specialhantering i Studentportalen för att hantera specifika typer av händelser och ingen logik för att härleda vilka åtgärder som tillåts baseras på den tillgängliga datan, allt sådant sköts av systemen som levererar schemahändelser.