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
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:
- Bij het openen van de tab worden alle beschikbaarheidsrecords van de ingelogde trainer opgehaald.
- Per weekdag wordt het bijbehorende record (indien aanwezig) in staat gehouden.
- Wanneer de trainer tijdvakken toggled, bouwt de app de nieuwe
timeSlots-array op. - 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
| Regel | Expressie |
|---|---|
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.