Skip to content

Beschikbaarheid (Trainer)

Rol: trainer (eigen beschikbaarheid instellen), eigenaar (beschikbaarheid van alle trainers inzien en bewerken)

De Beschikbaarheid-tab stelt trainers in staat om per weekdag aan te geven op welke tijdvakken zij beschikbaar zijn voor lessen. De eigenaar kan de beschikbaarheid van alle trainers inzien om de planning te coördineren.

Beschikbaarheidsflow

Aan Uit Ja Nee Beschikbaarheid-tab openen B MA C GET filter D bv Trainer toggled tijdvak Tijdvak toevoegen aan timeSlots-array Tijdvak verwijderen uit timeSlots-array H voor I timeSlots J trainer UI bijgewerkt

Upsert-patroon

Per combinatie van (trainer, weekday) bestaat er maximaal één record in de trainer_availability-collectie, gegarandeerd door een UNIQUE-index. De app werkt als volgt:

  1. Bij het openen van de tab worden alle beschikbaarheidsrecords van de ingelogde trainer opgehaald.
  2. Per weekdag wordt het bijbehorende record (indien aanwezig) in staat gehouden.
  3. Wanneer de trainer tijdvakken toggled, bouwt de app de nieuwe timeSlots-array op.
  4. Bij opslaan: als er al een record bestaat voor (trainer, weekdag)PATCH; anders → POST.

Dit upsert-patroon voorkomt dubbele records en maakt de state eenvoudig te synchroniseren.

timeSlots JSON-formaat

Het timeSlots-veld is een JSON-array van tijdstrings in HH:MM-formaat:

["09:00", "09:30", "10:00", "10:30", "14:00", "14:30", "15:00"]

De tijdvakken zijn in stappen van 30 minuten. De app rendert een grid van alle mogelijke tijdvakken per dag (bv. 07:00 – 21:00) en markeert de geselecteerde vakken met de teal-accentkleur.

Eigenaar-overzicht

De eigenaar ziet een trainersselectie bovenaan de tab. Na het kiezen van een trainer laadt de tab de beschikbaarheid van die trainer. De eigenaar kan tijdvakken bewerken namens de trainer (via PATCH met dezelfde upsert-logica). De PocketBase updateRule staat dit toe: @request.auth.id = trainer.id || @request.auth.role = 'eigenaar'.

Datamodel

Wekelijkse beschikbaarheid per trainer. Één record per trainer per weekdag (upsert-patroon).

Veld Type Verplicht Beschrijving Beperkingen
trainer relation De trainer waaraan de beschikbaarheid toebehoort → users · cascade delete
weekday select Dag van de week MA | DI | WO | DO | VR | ZA | ZO
timeSlots json Array van tijdvakstrings (bv. ["09:00","09:30","10:00"])

Indexen: UNIQUE (trainer, weekday) — één record per trainer per dag

Toegangsregels
RegelExpressie
list @request.auth.id = trainer.id || @request.auth.role = 'eigenaar'
view @request.auth.id = trainer.id || @request.auth.role = 'eigenaar'
create @request.auth.role = 'trainer' || @request.auth.role = 'eigenaar'
update @request.auth.id = trainer.id || @request.auth.role = 'eigenaar'
delete @request.auth.id = trainer.id || @request.auth.role = 'eigenaar'

Ontwerpkeuzes

JSON-array voor tijdvakken Een aparte tijdvakkentabel (trainer_slots) zou meer queries en joins vereisen per weekdag. Een JSON-array in één veld is eenvoudiger te lezen, schrijven en renderen. De structuur is flexibel: tijdstappen kunnen worden aangepast (bv. 15-minuten-stappen) zonder schema-migratie.

UNIQUE-index voor clean upsert-semantiek De UNIQUE-constraint op (trainer, weekday) garandeert dat de upsert-logica in de app altijd correct is: er is nooit een situatie waarbij meerdere records voor dezelfde dag-trainer-combinatie bestaan. Dit maakt ophalen en bijwerken deterministisch.

Cascade delete bij verwijdering trainer De trainer-relatie heeft cascade delete ingesteld. Wanneer een traineraccount wordt verwijderd (via de PocketBase Admin UI), worden alle bijbehorende beschikbaarheidsrecords automatisch verwijderd. Dit voorkomt weerecords in de database.

Geen aparte tijdvakkentabel Een genormaliseerde aanpak met een aparte tabel voor tijdvakken zou voordelig zijn bij complexe query’s (bv. “welke trainers zijn beschikbaar op WO 10:00?”). Voor de huidige use case — het tonen en bewerken van eigen beschikbaarheid — is de JSON-array aanzienlijk eenvoudiger en voldoende.