From ca11a670164af71439da165b12f691ec4a0a6064 Mon Sep 17 00:00:00 2001 From: Tim Rijkse Date: Tue, 31 Mar 2026 16:06:18 +0200 Subject: [PATCH] fix: add les 8 --- Les08-Compleet-v2.zip | Bin 0 -> 49001 bytes Les08-Compleet.zip | Bin 0 -> 46927 bytes Les08-Supabase-Auth/Les08-Docenttekst.md | 893 ++++++ Les08-Supabase-Auth/Les08-Lesopdracht.pdf | 219 ++ .../Les08-Live-Coding-Guide.md | 2472 +++++++++++++++++ Les08-Supabase-Auth/Les08-Slide-Overzicht.md | 174 ++ Les08-Supabase-Auth/Les08-Slides.pptx | Bin 0 -> 173969 bytes 7 files changed, 3758 insertions(+) create mode 100644 Les08-Compleet-v2.zip create mode 100644 Les08-Compleet.zip create mode 100644 Les08-Supabase-Auth/Les08-Docenttekst.md create mode 100644 Les08-Supabase-Auth/Les08-Lesopdracht.pdf create mode 100644 Les08-Supabase-Auth/Les08-Live-Coding-Guide.md create mode 100644 Les08-Supabase-Auth/Les08-Slide-Overzicht.md create mode 100644 Les08-Supabase-Auth/Les08-Slides.pptx diff --git a/Les08-Compleet-v2.zip b/Les08-Compleet-v2.zip new file mode 100644 index 0000000000000000000000000000000000000000..b07bc979c26abfa72bb696c53197566f28da747a GIT binary patch literal 49001 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 literal 0 HcmV?d00001 diff --git a/Les08-Compleet.zip b/Les08-Compleet.zip new file mode 100644 index 0000000000000000000000000000000000000000..dda5cc61fb867d91d897beeef51f419bbff1a29e GIT binary patch literal 46927 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 { + const { data, error } = await supabase + .from('polls') + .select('*') + .order('created_at', { ascending: false }) + + if (error) { + console.error('Error fetching polls:', error) + return [] + } + + return data || [] +} + +export async function getOptions(pollId: string): Promise { + const { data, error } = await supabase + .from('options') + .select('*') + .eq('poll_id', pollId) + .order('votes', { ascending: false }) + + if (error) { + console.error('Error fetching options:', error) + return [] + } + + return data || [] +} +``` + +**Wat betekent dit:** +- `.from('polls')` — welke tabel +- `.select('*')` — alle kolommen +- `.eq('poll_id', pollId)` — filter op poll_id +- `.order()` — sorteer op +- `await` — wacht op het resultaat van de database call +- Error handling — log en return empty array + +**Teacher Tip:** Veel students maken hier fouten met async/await: +```typescript +// ❌ FOUT: promise niet awaited! +const data = supabase.from('polls').select('*') + +// ✅ GOED: +const data = await supabase.from('polls').select('*') +``` + +### 10:00–10:10 | Homepage als Server Component (10 min) + +Update `app/page.tsx` — dit wordt een Server Component: + +```typescript +import { getPolls } from '@/lib/data' +import PollItem from '@/components/PollItem' + +export default async function Home() { + const polls = await getPolls() + + return ( +

+

QuickPoll

+ +
+ {polls.map((poll) => ( + + ))} +
+ + {polls.length === 0 && ( +

Geen polls beschikbaar.

+ )} +
+ ) +} +``` + +**Belangrijk:** Page.tsx is nu een **Server Component** — geen `'use client'` directive! We kunnen hier `async/await` rechtstreeks gebruiken. + +**Teacher Tip:** Students vragen: "Maar hoe krijgen we de options?" — Goed punt! Die halen we in PollItem. + +### 10:10–10:15 | PollItem Component (5 min) + +Update `components/PollItem.tsx` — ook een Server Component: + +```typescript +import { getOptions } from '@/lib/data' +import VoteForm from './VoteForm' +import { Poll } from '@/lib/types' + +export default async function PollItem({ poll }: { poll: Poll }) { + const options = await getOptions(poll.id) + + return ( +
+

{poll.question}

+ +
+ {options.map((option) => ( + + ))} +
+
+ ) +} +``` + +**Waarom twee Server Components?** +- `page.tsx` ziet alleen alle polls (geen details) +- `PollItem` wordt per poll gerenderd en haalt zelf de options op (parallel!) +- Dit patroon is efficient en schaalbaar + +**Teacher Tip:** Dit is het "Suspended Components" patroon van React 18 — Server Components voeren dit automatisch in parallel uit. + +--- + +## 10:15–10:30 | PAUZE (15 min) + +Goed moment om even weg te lopen. Tussendoor kun jij: +- Rondlopen en kijken wie nog errors heeft +- Checken of iedereen env vars juist ingesteld heeft +- Dev servers herstarten voor wie vergeten zijn +- Voorbereiding treffen voor DEEL 2 + +--- + +## 10:30–11:00 | DEEL 2a: Uitleg Auth (30 min) + +Dit is uitleg — geen live coding nog. Zorg dat alle laptops dicht zijn, focus op slides en beamer. + +### Authenticatie vs Autorisatie + +**Authenticatie (Authentication):** +- "Wie ben je?" — identity verification +- Voorbeeld: Je logt in met email + password +- Supabase Auth zorgt hiervoor + +**Autorisatie (Authorization):** +- "Wat mag je?" — permissions +- Voorbeeld: Je mag alleen je eigen polls aanpassen +- RLS (Row Level Security) in Supabase zorgt hiervoor + +**Voorbeeld:** +- Auth: "Je email en password kloppen, je bent Alice." +- RLS: "Alice mag haar eigen polls zien en updaten, maar niet die van Bob." + +### Supabase Auth Features + +Demo op beamer: +1. Open Supabase Dashboard → **Authentication** → **Providers** +2. Toon dat **Email/Password** is ingeschakeld +3. Toon de instelling **"Confirm email"** (nu UIT voor dev) +4. Ga naar **Users** tab — hier zie je ingelogde users + +**Supabase Auth ondersteunt:** +- Email/Password (wat we vandaag gebruiken) +- OAuth (Google, GitHub, etc.) — volgende week +- Magic Links (passwordless login) +- Session management (Supabase beheert cookies automatisch) + +### @supabase/ssr vs @supabase/supabase-js + +**@supabase/supabase-js:** +- Browser-side client +- Voor onClick handlers, forms, interactie + +**@supabase/ssr:** +- Server-side client (SSR = Server-Side Rendering) +- Voor middleware, cookies, server actions +- Handelt sessions automatisch af + +**Waarom twee?** +- Browser kan niet veilig geheimen beheren +- Server kan veilig cookies zetten +- Supabase SSR packages zorgen dat beide veilig werken + +### Supabase Auth Functies + +**signUp(email, password)** — nieuwe account aanmaken +```typescript +const { data, error } = await supabase.auth.signUp({ + email: 'user@example.com', + password: 'secure-password' +}) +``` + +**signInWithPassword(email, password)** — inloggen +```typescript +const { data, error } = await supabase.auth.signInWithPassword({ + email: 'user@example.com', + password: 'secure-password' +}) +``` + +**signOut()** — uitloggen +```typescript +await supabase.auth.signOut() +``` + +**getUser()** — huidge user ophalen +```typescript +const { data: { user } } = await supabase.auth.getUser() +// user is null als niemand ingelogd, anders is het een User object +``` + +### Server vs Browser Client + +**Browser Client (createBrowserClient):** +- Voor 'use client' components +- Kan useState gebruiken +- Kan useRouter gebruiken +- Kan user events luisteren + +**Server Client (createServerClient):** +- Voor server components en middleware +- Leest/schrijft cookies +- Kan getUser() veilig aanroepen +- Geen access tot browser APIs + +### Middleware & Session Refresh + +**Wat doet middleware?** +- Draait op elke request naar je app +- Refreshed de Supabase session +- Zorgt dat user state altijd up-to-date is + +**Voorbeeld flow:** +1. User logt in op `/login` page +2. Cookie wordt gezet +3. Middleware ziet op volgende request: "Er is een session cookie!" +4. Middleware refreshed de session +5. App ziet dat user ingelogd is + +### Handige links + +Toon op slides: +- [Supabase Auth docs](https://supabase.com/docs/guides/auth/server-side/nextjs) +- [Next.js Server Components docs](https://nextjs.org/docs/getting-started/react-essentials) + +--- + +## 11:00–11:30 | DEEL 2b: Zelf Doen — Auth Implementeren (30 min) + +Nu gaan studenten zelf auth bouwen in hun project. Dit is niet meer live coding — docent loopt rond en helpt. + +**Instructie voor studenten:** + +Volg deze stappen. Docent loopt rond als je vragen hebt. + +#### Stap 1: SSR Package Installeren (2 min) + +```bash +npm install @supabase/ssr +``` + +#### Stap 2: Server Client (3 min) + +Maak `lib/supabase-server.ts`: + +```typescript +import { cookies } from 'next/headers' +import { createServerClient } from '@supabase/ssr' + +export async function createClient() { + const cookieStore = await cookies() + + return createServerClient( + process.env.NEXT_PUBLIC_SUPABASE_URL!, + process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, + { + cookies: { + getAll() { + return cookieStore.getAll() + }, + setAll(cookiesToSet) { + try { + cookiesToSet.forEach(({ name, value, options }) => + cookieStore.set(name, value, options) + ) + } catch { + // Handle error + } + }, + }, + } + ) +} +``` + +**Wat is dit?** Dit is een helper zodat Supabase cookies kan beheren in Next.js. Copy-paste voor nu. + +#### Stap 3: Browser Client (1 min) + +Maak `lib/supabase-browser.ts`: + +```typescript +import { createBrowserClient } from '@supabase/ssr' + +export function createClient() { + return createBrowserClient( + process.env.NEXT_PUBLIC_SUPABASE_URL!, + process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY! + ) +} +``` + +**Wat is dit?** Dit gebruiken we in 'use client' components. + +#### Stap 4: Middleware (5 min) + +Maak `middleware.ts` in project root: + +```typescript +import { type NextRequest, NextResponse } from 'next/server' +import { createServerClient } from '@supabase/ssr' + +export async function middleware(request: NextRequest) { + let supabaseResponse = NextResponse.next({ + request, + }) + + const supabase = createServerClient( + process.env.NEXT_PUBLIC_SUPABASE_URL!, + process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, + { + cookies: { + getAll() { + return request.cookies.getAll() + }, + setAll(cookiesToSet) { + cookiesToSet.forEach(({ name, value, options }) => { + supabaseResponse.cookies.set(name, value, options) + }) + }, + }, + } + ) + + // Refresh user session + await supabase.auth.getUser() + + return supabaseResponse +} + +export const config = { + matcher: [ + '/((?!_next/static|_next/image|favicon.ico|.*\\.svg|.*\\.png|.*\\.jpg|.*\\.jpeg).*)', + ], +} +``` + +**Wat is dit?** Dit draait op elke request en refreshed de session. Copy-paste, don't worry. + +#### Stap 5: Signup Page (5 min) + +Maak `app/auth/signup/page.tsx`: + +```typescript +'use client' + +import { useState } from 'react' +import { useRouter } from 'next/navigation' +import { createClient } from '@/lib/supabase-browser' + +export default function SignUpPage() { + const router = useRouter() + const supabase = createClient() + const [email, setEmail] = useState('') + const [password, setPassword] = useState('') + const [error, setError] = useState('') + const [loading, setLoading] = useState(false) + + const handleSignUp = async (e: React.FormEvent) => { + e.preventDefault() + setLoading(true) + setError('') + + const { error } = await supabase.auth.signUp({ + email, + password, + }) + + if (error) { + setError(error.message) + setLoading(false) + } else { + router.push('/auth/login') + } + } + + return ( +
+
+

Sign Up

+ + {error &&
{error}
} + + setEmail(e.target.value)} + className="w-full px-4 py-2 border rounded mb-4" + required + /> + + setPassword(e.target.value)} + className="w-full px-4 py-2 border rounded mb-6" + required + /> + + +
+
+ ) +} +``` + +**Belangrijk:** `'use client'` directive bovenaan — dit is een interactive component! + +#### Stap 6: Login Page (5 min) + +Maak `app/auth/login/page.tsx`: + +```typescript +'use client' + +import { useState } from 'react' +import { useRouter } from 'next/navigation' +import { createClient } from '@/lib/supabase-browser' +import Link from 'next/link' + +export default function LoginPage() { + const router = useRouter() + const supabase = createClient() + const [email, setEmail] = useState('') + const [password, setPassword] = useState('') + const [error, setError] = useState('') + const [loading, setLoading] = useState(false) + + const handleLogin = async (e: React.FormEvent) => { + e.preventDefault() + setLoading(true) + setError('') + + const { error } = await supabase.auth.signInWithPassword({ + email, + password, + }) + + if (error) { + setError(error.message) + setLoading(false) + } else { + router.push('/') + } + } + + return ( +
+
+

Login

+ + {error &&
{error}
} + + setEmail(e.target.value)} + className="w-full px-4 py-2 border rounded mb-4" + required + /> + + setPassword(e.target.value)} + className="w-full px-4 py-2 border rounded mb-6" + required + /> + + + +

+ Nog geen account? Sign up +

+
+
+ ) +} +``` + +#### Stap 7: Logout Button (3 min) + +Maak `components/LogoutButton.tsx`: + +```typescript +'use client' + +import { useRouter } from 'next/navigation' +import { createClient } from '@/lib/supabase-browser' + +export default function LogoutButton() { + const router = useRouter() + const supabase = createClient() + + const handleLogout = async () => { + await supabase.auth.signOut() + router.refresh() + } + + return ( + + ) +} +``` + +**Belangrijk:** `router.refresh()` na logout zorgt dat page de nieuwe state ziet! + +#### Stap 8: Navbar met Auth State (3 min) + +Update `components/Navbar.tsx`: + +```typescript +import { createClient } from '@/lib/supabase-server' +import Link from 'next/link' +import LogoutButton from './LogoutButton' + +export default async function Navbar() { + const supabase = await createClient() + const { data: { user } } = await supabase.auth.getUser() + + return ( + + ) +} +``` + +**Logica:** +- Als `user` bestaat (ingelogd): toon email + Logout button +- Anders: toon Login + Sign Up buttons + +#### Stap 9: Layout updaten (2 min) + +Update `app/layout.tsx`: + +```typescript +import type { Metadata } from 'next' +import Navbar from '@/components/Navbar' +import './globals.css' + +export const metadata: Metadata = { + title: 'QuickPoll', + description: 'Vote on polls', +} + +export default function RootLayout({ + children, +}: { + children: React.ReactNode +}) { + return ( + + + + {children} + + + ) +} +``` + +Voeg gewoon `` toe. + +**Teacher Tip: Studenten vastlopen?** +- Na 5-10 minuten vastzitten: toon de referentie code op beamer +- Zeg: "Dit is complex, copy-paste is OK. Focus op begrijpen, niet op typen." +- Help met debuggen (console.log, errors lezen) + +--- + +## 11:30–11:45 | Vragen & Reflectie (15 min) + +Hier zijn veelvoorkomende vragen: + +### V: "Wat is het verschil tussen `createClient()` in server.ts en browser.ts?" +**A:** +- `server.ts`: kan cookies veilig beheren (server-side) +- `browser.ts`: kan UI events afhandelen (onClick, forms) +- Supabase kiest automatisch het juiste moment om te gebruiken + +### V: "Waarom twee environment variables bovenaan?" +**A:** +- `NEXT_PUBLIC_SUPABASE_URL`: URL is public, iedereen ziet het +- `NEXT_PUBLIC_SUPABASE_ANON_KEY`: anon key is public (maar kan geen private data lezen) +- Private keys (service role) zetten we NIET in .env.local, die gaan in server.ts als geheim + +### V: "Mijn login werkt niet, ik krijg error" +**A:** Check: +1. Klopt je email/password echt? +2. Is je account in Supabase Dashboard → Authentication → Users? +3. Is Email provider ingeschakeld? +4. Zit "Confirm email" uit? (check dashboard) + +### V: "Logout werkt niet, user staat nog ingelogd" +**A:** Vergeten `router.refresh()` na `signOut()`? + +### V: "Middleware error: 'createServerClient is not defined'" +**A:** Check je import: moet `import { createServerClient } from '@supabase/ssr'` zijn + +### V: "Kan ik als anonieme user stemmen?" +**A:** Ja! RLS policy staat op `FOR SELECT, UPDATE TO authenticated` — maar je Navbar toont Login/Signup want je bent nog niet ingelogd. Dat is OK. Volgende les doen we RLS policies correct. + +--- + +## 11:45–12:00 | Huiswerk & Afsluiting (15 min) + +### Huiswerk (voor Les 9): + +**Verplicht:** +1. **/create pagina bouwen** — studenten voegen nieuwe polls toe via een form + - Maak `app/create/page.tsx` (Server Component met form als Client Component) + - Form met: vraag + array van 2-3 opties + - `supabase.from('polls').insert()` en `supabase.from('options').insert()` + - Zorg dat je eigen `user_id` meestuurt + +2. **RLS INSERT policy** — alleen authenticated users mogen polls toevoegen + - Supabase Dashboard → Authentication → Policies + - Voeg policy toe: `INSERT` voor authenticated users + - `user_id = auth.uid()` + +3. **Optional extras (challenge):** + - Toon poll creator in PollItem + - Google OAuth inschakelen (zie Supabase docs) + - Edit/Delete buttons (alleen voor je eigen polls) + +### Afsluitingsboodschap: + +"Gefeliciteerd! Vandaag hebben jullie: +- Supabase gekoppeld aan Next.js +- Real data uit een database geladen +- Login/logout gebouwd +- Server & browser clients begrepen + +Volgende week voegen we RLS policies toe zodat iedereen alleen zijn eigen polls kan aanpassen. Dat is waar authenticatie écht nuttig wordt!" + +--- + +## Veelvoorkomende Problemen + +| Probleem | Oorzaak | Oplossing | +|----------|---------|-----------| +| `Error: Cannot find module '@supabase/supabase-js'` | Package niet geïnstalleerd | `npm install @supabase/supabase-js` en dev server herstarten | +| Supabase returns leeg array | .env.local niet juist of dev server niet herstarten | Check .env.local, restart dev server (Ctrl+C + `npm run dev`) | +| TypeScript complains over `null assertion (!)` | Normale TS warning | Dit is OK, we vertellen TS dat env vars bestaan | +| `'use client' vergeten in signup/login page` | Component is interactief maar geen directive | Voeg `'use client'` bovenaan toe | +| Login page blank/geen content | Conflict met server components | Zorg ALL pages onder /auth zijn `'use client'` | +| Logout werkt niet, user nog ingelogd | `router.refresh()` niet aangeroepen | Voeg `await router.refresh()` toe na `signOut()` | +| Middleware error: "wrong params" | Onjuiste URL of key in middleware | Copy-paste van .env.local, check Format | +| "Invalid token" bij Supabase calls | Token verlopen of anon key fout | Restart dev server, check API credentials | +| User niet in Authentication → Users | Signup failed, geen account aangemaakt | Check browser console op errors, probeer opnieuw met ander email | +| `router.refresh()` werkt niet in component | Router niet geïmporteerd | `import { useRouter } from 'next/navigation'` (niet 'next/router'!) | +| Cors/network error | Supabase URL fout | Check dat URL eindigt op `.supabase.co` en https:// bevat | +| Password te kort / validation error | Supabase vereist min 6 chars | Zeg studenten: "Test met password123" | + +--- + +## Didactische Tips + +- **Pair Programming:** Zet snelle studenten samen met tragere — kennis spreidt zich uit +- **Show & Tell:** Toon je eigen werkend QuickPoll op beamer — studenten zien het doel +- **Error-driven Learning:** Zeg niet meteen het antwoord, vraag: "Wat zegt de error?" +- **Debug together:** Als iemand vastlopen, use browser console.log + devtools +- **Save time** — als >3 students dezelfde error hebben, stop even en toon op beamer +- **Celebrate wins** — als iemand eerste Signup working heeft, geef thumbs up! + +--- + +## Referentiematerialen voor Studenten + +- [Supabase Auth docs](https://supabase.com/docs/guides/auth/server-side/nextjs) +- [Next.js Server Components](https://nextjs.org/docs/getting-started/react-essentials) +- [Environment Variables in Next.js](https://nextjs.org/docs/basic-features/environment-variables) +- Alle code snippets uit deze docenttekst + +--- + +**Einde docenttekst Les 8** diff --git a/Les08-Supabase-Auth/Les08-Lesopdracht.pdf b/Les08-Supabase-Auth/Les08-Lesopdracht.pdf new file mode 100644 index 0000000..eb83a68 --- /dev/null +++ b/Les08-Supabase-Auth/Les08-Lesopdracht.pdf @@ -0,0 +1,219 @@ +%PDF-1.4 +% ReportLab Generated PDF document (opensource) +1 0 obj +<< +/F1 2 0 R /F2 3 0 R /F3 6 0 R /F4 7 0 R +>> +endobj +2 0 obj +<< +/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font +>> +endobj +3 0 obj +<< +/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font +>> +endobj +4 0 obj +<< +/Contents 17 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 16 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +5 0 obj +<< +/Contents 18 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 16 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +6 0 obj +<< +/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font +>> +endobj +7 0 obj +<< +/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font +>> +endobj +8 0 obj +<< +/Contents 19 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 16 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +9 0 obj +<< +/Contents 20 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 16 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +10 0 obj +<< +/Contents 21 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 16 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +11 0 obj +<< +/Contents 22 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 16 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +12 0 obj +<< +/Contents 23 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 16 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +13 0 obj +<< +/Contents 24 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 16 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +14 0 obj +<< +/PageMode /UseNone /Pages 16 0 R /Type /Catalog +>> +endobj +15 0 obj +<< +/Author (\(anonymous\)) /CreationDate (D:20260331152247+02'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260331152247+02'00') /Producer (ReportLab PDF Library - \(opensource\)) + /Subject (\(unspecified\)) /Title (\(anonymous\)) /Trapped /False +>> +endobj +16 0 obj +<< +/Count 8 /Kids [ 4 0 R 5 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R ] /Type /Pages +>> +endobj +17 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 699 +>> +stream +Gatm8b>R(K']&X:mLn5>=AMTGd@h(3)/+n_DR+6q2;%F,`rSB==*Epi),,f/E?%DgYKk$H1'JaQgAK5PJBoC/J#,CJKR\O[+sbTVeA&XA#*?AiuGZ>&T0eo1p]8\6f:hWsLc-T::dU/"pNbYHlBu+4O?g>L\R@`3GFo\qW7DC[Tq*.R\d:?YJa2#all,Lknm6<@ZIGE&a@@OL7Jd:R9RUXiKuFRS5(DS]Y;A0P8T(Me=[GR4(Je];%?P9iSUJ6"qC"^AlB^SneRYr@`.QN2kPJV"0TI[G'YtMf][!dnqF3;CfMP2`YQ_@jDK*?6qVDc>fg1lu"GIoU>koF6QlZsZI(oCL3hmQ_AHi_\j4CA%endstream +endobj +18 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 882 +>> +stream +GauJ!>u03/'F*Lmrebc"2D)km=0nsD!.iWC[V!.=\8ftbC[/jSG09USEtYbh]7'Q:RgTC&neF;+m%NRG!%rX6g6f*-AJ"6'eUP-/WA+J`KM,d]dir,YnSR%>E-+?c`3Rf8$j>Z7*-U2APGBnWU))AH9U@l7NN%hma`kC6!jB22.[^kBGWrmS`g#"V"NTM*,+2B_cm1%bOZeqOK^$>TlmQMRE+JUUek\<;!bZ$/l][M5Ze3*Ng"4%Xh*U\u]\S"sLt-Z9^roYuNmG\HHL[`s[I-R=Or,*N%AE@`d^2Q1`.;>bV#@SLn.e!^ctF'2qhf%<.]L2$$#c%o/02Ft$I&/PO$-tUrMg30NL1^SS&B7oiG1jC@tbG6uh.F!@G.BLlM0#2W2YF1#"FA&k<'b0+e4hA3)-!Q#+P>Ztf=0'K?=lYoSOuWb"I3roo>-e692$1BDkVb2GX-b*.&)G3fXLgo]'*sC9:f#*5p?:C=.#\=J4BAHDgT('gWdo*]&b8K>FgUp\NG&B]_%mkVsQ0iiA?[H`"eG!k%G7>2bH-]l@GX*eTH4j$LLhPdZ:4XP=;4S-(YBQu$l7()D:'[uGH.7)WT6d;`!M9<3+ldbJ?&d;_RY7f/^:>@VK!^4f4g>;G;jbrktWUZ7RmB+GdD5'>>m/\bO7pUoVa*n>F`k^HKE8WV3OY2blE!ZEM4amnVf>aYEljM\hL~>endstream +endobj +19 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1216 +>> +stream +Gau0CmrR2B&H0m]Z0`pm3J?MO-BjijEnjBm1sHcaC$0NS.%jBa`cbq0-.D,YIOj*%"1U3?#7LYbC#;+f[qdB/pn[b71']cLU&-nTC-m.Qe0[),"6bNBcRi>GFA:a!AjF1R4@0-/^iamiR',],%M6fBXM=rO=R#orf"sRa,tp;=&13c*KR+_*q_uf1TKO,E13UQU%ej\'nX(]>=9=ie6'AkX"b_(2^/T(N_WO*RQf6/MfH)c8"?O8CftKh$>R%^9i,JZna$#Lf$Na%SV+F4`qe>@I2\g9St\[[rRI4jAjaYYscM>GPNt5D8'tdJ;_N`HXAR3]fPFp;`qPK@)W'a?&o/6<@=*AO=6r8M?>Z?ien`YchK,r4a\:5$9H131+AS;FWMID+)?-iU9M%TO399tif\0RYS%<]Xec!Vs8$\bp^S#'AS?r)>^9]E'K'DHWpP,sM*G8g"?IpkTo5/h'W!t:i3C]:F,C1oFlTBpr"G_7RRV/U]n3uSr8UaO,`E0Pako?;\,hr!G]j8oC=Z]BjDN\H@L"57HLuD=tF2INR(Tf`.5MPP2[Ds/RoJLBu_*0An5MH7Y+*=AUpVdTBM-m_BTRYXTIf89%_5Wnf0at8"T:(8DSo>rFfnH3<`s`p>,+E%*%;]R$Zi]=OCc'R+GDmd^U2H2hq85Bendstream +endobj +20 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 967 +>> +stream +Gb"/%gMWKG&:N^lVL?=aMcjouVlcsiBc-d(BIu)]3`YkL10Q<-s0s%GTgnaQ/.$$]$T@9cW6?R,n6(M/GWk^k0%?8rf[irZ\6FLGFfBr@Nc?B'+hX/1/kiCfP\PBtkZ[/5NajR`2n>(e:SrTZlB^KfV3L1fG\_atce4ntJn-qtUd55+5HL@Z-4KH'hf\FK.%`.r;ppqk8jVVH%Vb&1hl-d6.$0mQh;If'&;\GcL&&%mcD0/n?KjIA!/q#E11ciZs48f7*mi8&\kKj*CR?*5sjc\3n$_AAlQ't:LOU`@G-V[]_F%oQ7?QH*kLZW#A<"IM#2I=aV>KC9k`/b`B$^"gY"&1(B[#ecW"SD.bb_`G:U"BQAhE]\+g^8W("(b:<`H5)./.7-`,CWWE,qOAj$]]l*&L'Tu$-D`rCF&"Y@Ln[O,e"V#H@_/@,"h%4)q)LC\A.L!n?VPUj?,l9R'l8lP_c';0qRTePILQC;?5[=+kW%kIYTSS*eL?X-[,($,%J%)bk?/!NfWl3A#ZV=V^D9#[NKPXW3D302IdN[UU~>endstream +endobj +21 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1211 +>> +stream +Gau`SD3*C1&H9tY(nL(^[Lu0%pKY>\?17V:mBq9mf.Wsu9e_Zl32pDRmB-0P*BT?/]G+Dip&r7<4e?q2T(.%J@,m%+h]rGOecY4A!TH@_"N3)ZkZu!q?KZ*Z/0tD=$t:S2&-g&uE=h.jgbt"K'*=Yu(jAe(C!<70*)/CX!c9,Z#)r;>Q9`XoqMl6+X!21&*AaX]\7,N&+tj>L\3,E#([+"[JH!C2/l6Gm#-)7f;jN9DltI8mZG.J>)#omh.N)op)R2J7d'C"m3`B)2bIs0!")(_PU&OF5CnJ(D)9%a*`iqJ;HeC-%R!6b6Yf"P7bn4I1Tc9u7(\qZra1u[^&.G-ndY?LU&5<@Kl]AUf+,WUH*XN-30P9m]aO&NBN'rfG0A8kTG:Q;k(.O;7oB#OQ4fAYAC/DrX99sL1BYmeQ/"$L^/lFlM.H0Vs+qd)qF&3rjfD=uuNT_pW5c\fcJ^KE(1+g"2_7n;]K:?(dFXHGrP(HaJ8fa+:TQ?RE-:gbTj5\Vp->.oth`+C/8&LO:(oCArA@/And%$Z9!]'5)Am#=Lf4us&]t`qZE(ujNYU$O+FfmM;'jPne75fgHYS3f%QN,"jTXT#I'Bc:'Ehc?u3A$A&6VT7CQHhTU$&SBbZG%2Tp?c*02:LLc-A%6&Da%B?_>:QBs1J+U&\Fr*:!leACSqqUrU7g/Bm7shS-K8I5O4pn:0&PiX:]Z.h(!%pNZYuQ?5/m;is+dkgF_@\NPLBSM6LkDRZ.(6p`@9si>S/N8J9pgM>3RgkuJ1sj,MgH:%XDj92Y&aQbWZd1PmbG+#8uL0kA6_:#N$"";I\+=f(gn4rP^\$(b&.e:9T@V?VMFsRkSJKN#fZHed-T]!CR]JaL)s+PpEs/=p$,OVdG3Xp.@sn%@7q04F3"^YYXpP$dnhn'1As+0hM3P-9G_eG\W+ot[,nr6_Cl9rH/mgg2_endstream +endobj +22 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1369 +>> +stream +Gau`RD0+E#&H9tYf_,tRD&L#2foo19j*!P)>USH)gL8)H`#;UN4*#P43$/+om[XKt(i6%V>@9FPp3*'Vp:4J^d%\!d^69PpW!E2agL*+i]*@#r4Qr?P8[%Zp@@*:2@g.u.g!KHIQ5p,@mA&F%'0'jT#KmQ\DWH<_\bZJ=e0(CW8sip[+WPGp#lT/Uc$+s]3![g$:#eMj&NV^*L,>N7Qm5NXOR5=%0Bg*s?p<"c'-Pn0"_>++Nt(F@3ZtU+6oj!KBAW^#9N?flp]:B4ll+aN>4M!gq5*+i1^HElBi#nEZXCue%)?fci.3&/(eTuoV49ig=b9RP#B&J.rW*p]1LI$gL8fb:%]PTu@2-`jjp:Ja49WXnL>rOWkh@1lBem6W=_>K3g,hQR'=*=#X;qbg/=iGqn23q[MenhB-S#B&8#]HSlN6:6ZAajOgDeFlhYn6u11Q9G8;0&qaJu$n89(R.NHLQG0HDaYCUAHZQM+^(?mM7<;NqPK$@!$nV:=*Fb5mV\"KMa[G%A!#2qY,>hldGPY:2meF(CZc$;6Zl0%LfqK@OBR*FE2HDetc/o`\cc5sG%YkqI@t@iNN_sM)o:0>CP;,n*/B-:IMi*a)9&t8#phjc!I`pIuMjCh/ppViMX5YR)MhJh)[,EB8*f,4n"]6Y4/nV4TlVSa.!>S)8jhprkl'I.d_n9DH6)u#PYeC``#(*'CGbK&0ZjirQ$&#'4-LNg9E#0^^XDXVE[RR9;?V]11iU&BBu)V]e\P[N#V\(gr/cL-#c"W8MTfELaA![W;U=X#OX&Y7;4\61b[p!i,ob^-Jq-Pf,_6:XIUB_o-I5X"P^^t^KJn!;p//0K_ha'm)D(Nq7UupEHuYLH@48V]]^>X\gLRGT?b1*r=@n0c@8!lH@PM+9*AHKj+'NQ6Ij2`U3Np#Z7:f5h*6Si(C:#i,0O(7]H6O9W\:C(=Hp=t%[+Yendstream +endobj +23 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1160 +>> +stream +GauI5Df=Ag&B7`8>V].CAW#RV+_fkk;j,TKjO]:Op$pL&NBgpKO7nF;=%%`/gDo?NQ;8aH(9[G*=TegRSTk[i\qaL^2*=M>VN.](!4pdoH[fK]TBVH6gF;3-uSiL[OcbHd%G3BVR?RTK`\8.:q0K*Jd=YKXO_`h.YmaXCRn1WSoYOOu(@p;CiQLB5,4=%:j=fJc&")PPlJ:"8S+D]e%\%6YEkhJ%(\s2?E$rS_eX*4K%hBIGk2!9kf9W"0J/,3B1+e6cTMkD)*01I*!Yk0@L=-2&-Y!U64uU=*YdDOmY%$+h$/G('j!mu/F_T>b.[\j+IEEpYLr>)92a!,e5FBX$a^etF]1p*)+7*XUmu=aRmR>3*WXC&1Rj,tAf%REfPUbNKIa!?>mfY70WgB$XQfLd\C+:(&#Jq[q_QX+lW*jaOR"k,nUnX18^endstream +endobj +24 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 661 +>> +stream +Gat%^a_oie'LhcqMS!sK<&*J`nhN\_(,-*F(:#@$U#d)[Ys^&]D"R0h;B?J$78XA[W&L5n*uTD(AFWu*^dF-o-O,k\IfUK6"6;7#k+/sk4%>7YA<`o._g".9=>nRge+#GOf"Mf>;^qpc!o+MF7PWejqHbr7u[)s"3D56ZQZrk&H_^Q3:6id*lY'(GT,Kk5gh%0Jm1blUbZHnO?&bGS7oUC8,%f+en-ZWiSn'L$[LB1Nt4613Y7X0OS73@TB%c=Ot=,a4Dmh.P.]N$UL[[jT)mpofj9KE'K7AE,E,ZN\'k?TcX*!%Nk5&/#@Po+a3;]i+]q[YPjlA!$rZ4_[Si<@b9$T%p7#@S$Vc>/oOGa=8h7:Z]&U1O?)OmO^P(^ZUUN([G:p(7j@Z]0cJ~>endstream +endobj +xref +0 25 +0000000000 65535 f +0000000061 00000 n +0000000122 00000 n +0000000229 00000 n +0000000341 00000 n +0000000546 00000 n +0000000751 00000 n +0000000856 00000 n +0000000971 00000 n +0000001176 00000 n +0000001381 00000 n +0000001587 00000 n +0000001793 00000 n +0000001999 00000 n +0000002205 00000 n +0000002275 00000 n +0000002556 00000 n +0000002662 00000 n +0000003452 00000 n +0000004425 00000 n +0000005733 00000 n +0000006791 00000 n +0000008094 00000 n +0000009555 00000 n +0000010807 00000 n +trailer +<< +/ID +[<71e7c7d830850d86ed44e0355ffd582a><71e7c7d830850d86ed44e0355ffd582a>] +% ReportLab generated PDF document -- digest (opensource) + +/Info 15 0 R +/Root 14 0 R +/Size 25 +>> +startxref +11559 +%%EOF diff --git a/Les08-Supabase-Auth/Les08-Live-Coding-Guide.md b/Les08-Supabase-Auth/Les08-Live-Coding-Guide.md new file mode 100644 index 0000000..8c5159c --- /dev/null +++ b/Les08-Supabase-Auth/Les08-Live-Coding-Guide.md @@ -0,0 +1,2472 @@ +# Les 8 — Live Coding Guide +## Supabase × Next.js + Auth + +> **Jouw spiekbriefje.** Dit bestand staat op je privéscherm. Op de beamer draait Cursor. +> Volg stap voor stap. Typ exact wat hier staat. Leg uit met de "Vertel:" blokken. + +--- + +## VOOR DE LES BEGINT + +**Zorg dat je dit hebt klaargemaakt:** +- [ ] Het poll-demo project geopend in Cursor +- [ ] feature/les-8 branch checked out (VOOR de nieuwe commits) +- [ ] De code hieronder klopt met wat je ziet (BEFORE-state) +- [ ] Supabase project aangemaakt en database klaar (polls + options tabellen) +- [ ] Twee demo polls in de database +- [ ] Slides geopend (voor Deel 2) + +--- + +# DEEL 1: LIVE CODING — Supabase Koppelen (09:10–10:15) + +**Doel:** De poll-app offline maken en live verbinden met Supabase. Alle data gaat via het Supabase API. + +--- + +## STAP 1: Installeer @supabase/supabase-js + +```bash +npm install @supabase/supabase-js +``` + +**Vertel:** +"We gaan de Supabase client library installeren. Dit is de JavaScript SDK waarmee we rechtstreeks kunnen communiceren met Supabase — zonder een eigen backend API te hoeven schrijven." + +--- + +## STAP 2: Maak .env.local aan + +Bestand: `.env.local` (in de root van je project) + +``` +NEXT_PUBLIC_SUPABASE_URL=https://xxxxx.supabase.co +NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +``` + +**Vertel:** +"Deze environment variables bevatten je Supabase project URL en de anonieme API key. Ze beginnen beide met NEXT_PUBLIC_, dus ze worden in de browser zichtbaar — maar dat is oké want dit zijn public credentials. Je private key bewaar je nooit in de client code." + +**Waar vind je deze?** +- Ga naar je Supabase project dashboard +- Settings → API +- Kopieer Project URL en anon key + +--- + +## STAP 3: Maak lib/supabase.ts aan + +Bestand: `lib/supabase.ts` + +```typescript +import { createClient } from "@supabase/supabase-js"; + +const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL!; +const supabaseAnonKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!; + +export const supabase = createClient(supabaseUrl, supabaseAnonKey); +``` + +**Vertel:** +"Dit is onze Supabase client — één plek waar we de verbinding opzetten. We gebruiken `createClient()` om één client aan te maken die we overal importeren. De `!` betekent 'deze mag nooit undefined zijn'." + +--- + +## STAP 4: Update types/index.ts + +**BEFORE:** +```typescript +export interface Poll { + id: string; + question: string; + options: string[]; + votes: number[]; +} +``` + +**AFTER:** +```typescript +export interface Poll { + id: string; + question: string; + created_at: string; + options: Option[]; +} + +export interface Option { + id: string; + poll_id: string; + text: string; + votes: number; +} +``` + +**Vertel:** +"De database structuur is anders dan wat we hadden. Nu hebben we twee aparte tabellen: `polls` en `options`. Elke option is een eigen record met een `poll_id` referentie. Dit is genormaliseerde data — beter voor grote apps. De votes tellen we per option, niet meer als een array." + +--- + +## STAP 5: Rewrite lib/data.ts + +**BEFORE:** +```typescript +import { Poll } from "@/types"; + +let polls: Poll[] = [ + { id: "1", question: "Ik ben een vraag", options: ["optie 1", "optie 2", "optie 3", "optie 4"], votes: [1,1,1,1] }, + { id: "2", question: "Ik ben een vraag 2", options: ["optie 1", "optie 2", "optie 3", "optie 4"], votes: [1,1,1,1] } +] + +export function getPolls(): Poll[] { return polls } +export function getPollById(id: string): Poll | undefined { return polls.find((poll) => poll.id === id) } +export function votePoll(id: string, optionIndex: number) { + const poll = polls.find((p) => p.id === id) + if (!poll) return undefined; + if (optionIndex < 0 || optionIndex >= poll.options.length) return undefined; + poll.votes[optionIndex]++; + return poll; +} +``` + +**AFTER:** +```typescript +import { supabase } from "./supabase"; +import { Poll, Option } from "@/types"; + +export async function getPolls(): Promise { + const { data: polls, error } = await supabase + .from("polls") + .select("*, options(*)") + .order("created_at", { ascending: false }); + + if (error) { + console.error("Error fetching polls:", error); + return []; + } + + return polls || []; +} + +export async function getPollById(id: string): Promise { + const { data: poll, error } = await supabase + .from("polls") + .select("*, options(*)") + .eq("id", id) + .single(); + + if (error) { + console.error("Error fetching poll:", error); + return null; + } + + return poll; +} + +export async function votePoll(pollId: string, optionId: string): Promise