Supabase
Wat we gebruiken
Section titled “Wat we gebruiken”| Product | Gebruik |
|---|---|
| PostgreSQL | Hoofd database |
| Supabase Auth | Gebruikersauthenticatie (klanten + medewerkers) |
| Supabase Storage | Bestandsopslag (foto’s, documenten, PDFs) |
| pg_cron | Geplande taken (maandfacturen) |
| Row Level Security | Data-isolatie per gebruiker |
Project setup
Section titled “Project setup”# Supabase CLI installerennpm install -g supabase
# Project initialiseren in de reposupabase init
# Lokale development omgeving startensupabase start
# Migraties aanmakensupabase migration new create_clients_table
# Migraties uitvoerensupabase db pushAuth configuratie
Section titled “Auth configuratie”Twee typen gebruikers authenticeren via Supabase Auth:
Klanten
Section titled “Klanten”- Registreren via
/registerin het klantportaal - Email + wachtwoord authenticatie
- Na registratie:
clientsrecord aanmaken gekoppeld aanauth.uid() - Redirect naar
/onboardingbij eerste login
Medewerkers (admin)
Section titled “Medewerkers (admin)”- Accounts worden aangemaakt door de admin (niet zelf registreren)
- Email + wachtwoord of magic link
usersrecord met roladmin/medewerker/trainer
-- Trigger: automatisch clients record aanmaken na registratieCREATE OR REPLACE FUNCTION handle_new_client()RETURNS trigger AS $$BEGIN INSERT INTO public.clients (id, email) VALUES (new.id, new.email); RETURN new;END;$$ LANGUAGE plpgsql SECURITY DEFINER;
CREATE TRIGGER on_auth_user_created AFTER INSERT ON auth.users FOR EACH ROW EXECUTE PROCEDURE handle_new_client();Row Level Security (RLS)
Section titled “Row Level Security (RLS)”RLS is ingeschakeld op alle tabellen. Klanten zien alleen hun eigen data. Medewerkers en admins zien alles.
-- Klant ziet alleen eigen boekingenALTER TABLE bookings ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Klant ziet eigen boekingen"ON bookings FOR SELECTUSING (client_id = auth.uid());
CREATE POLICY "Admin ziet alle boekingen"ON bookings FOR ALLUSING ( EXISTS ( SELECT 1 FROM users WHERE id = auth.uid() AND role IN ('admin', 'medewerker') ));API architectuur
Section titled “API architectuur”De API draait als Hono app op Cloudflare Workers. Supabase wordt server-side benaderd met de service role key.
Frontend (React) → Hono API (CF Workers) → Supabase (service role)API endpoints (Hono)
Section titled “API endpoints (Hono)”| Endpoint | Methode | Doel |
|---|---|---|
/api/bookings | GET/POST | Boekingen CRUD |
/api/payments/webhook | POST | Sentoo webhook ontvangen |
/api/invoices | GET/POST | Facturen genereren |
/api/notifications | POST | Email versturen via Resend |
/api/dogs | GET/POST/PUT | Hondprofielen beheren |
Auth flow in de API
Section titled “Auth flow in de API”// JWT uit Authorization header → Supabase getUser() verificatie// Altijd getUser() voor server-side verificatie, nooit getSession()pg_cron — Geplande taken
Section titled “pg_cron — Geplande taken”pg_cron wordt gebruikt voor de maandelijkse factuurcyclus van unlimited abonnementen.
-- Elke dag om 00:01 controleren welke abonnementen gefactureerd moeten wordenSELECT cron.schedule( 'monthly-subscription-billing', '1 0 * * *', $$ SELECT process_subscription_billing(); $$);De functie process_subscription_billing() controleert welke subscriptions next_billing_date = CURRENT_DATE hebben en stuurt een request naar de Hono API voor factuurcreatie en Sentoo betaalaanvraag.
Migraties beheren
Section titled “Migraties beheren”supabase/ migrations/ 001_create_clients.sql 002_create_dogs.sql 003_create_vaccinations.sql 004_create_services.sql 005_create_bookings.sql 006_create_payments.sql 007_create_bundles.sql 008_create_subscriptions.sql 009_rls_policies.sql 010_cron_jobs.sql seed.sql ← Test data voor developmentEnvironment variables
Section titled “Environment variables”In de Hono API (Cloudflare Workers secrets)
Section titled “In de Hono API (Cloudflare Workers secrets)”SUPABASE_URL=https://[project-id].supabase.coSUPABASE_SERVICE_ROLE_KEY=[service-role-key]In de React app (Cloudflare Pages)
Section titled “In de React app (Cloudflare Pages)”VITE_SUPABASE_URL=https://[project-id].supabase.coVITE_SUPABASE_ANON_KEY=[anon-key]Database backups
Section titled “Database backups”Supabase Pro plan biedt dagelijkse automatische backups met 7 dagen retentie. Voor productie wordt het Pro plan aanbevolen.