350 lines
8.5 KiB
Markdown
350 lines
8.5 KiB
Markdown
# Les 7: Backend Basics met Supabase
|
|
|
|
> 📋 **Lesmateriaal nog niet uitgewerkt**
|
|
>
|
|
> De volgende bestanden worden gegenereerd wanneer deze les wordt uitgewerkt:
|
|
> - Les07-Slide-Overzicht.md
|
|
> - Les07-Lesplan.md
|
|
> - Les07-Bijlage-A-Lesopdracht.md
|
|
> - Les07-Bijlage-B-Huiswerkopdracht.md
|
|
|
|
---
|
|
|
|
## Hoofdstuk
|
|
**Hoofdstuk 2: Intermediate** (Les 4-9)
|
|
|
|
## Beschrijving
|
|
Zet je eerste "echte" Next.js project op en koppel het aan Supabase voor database en authenticatie. Je leert de complete flow van lokaal ontwikkelen tot productie deployment.
|
|
|
|
---
|
|
|
|
## Te Behandelen
|
|
|
|
### Stap 1: Next.js Project Aanmaken
|
|
|
|
Dit is de eerste keer dat je een volledig Next.js project opzet.
|
|
|
|
```bash
|
|
# Maak nieuw project
|
|
npx create-next-app@latest todo-app
|
|
|
|
# Beantwoord de vragen:
|
|
# ✔ Would you like to use TypeScript? → Yes
|
|
# ✔ Would you like to use ESLint? → Yes
|
|
# ✔ Would you like to use Tailwind CSS? → Yes
|
|
# ✔ Would you like to use `src/` directory? → Yes
|
|
# ✔ Would you like to use App Router? → Yes
|
|
# ✔ Would you like to customize the default import alias? → No
|
|
|
|
# Ga naar project folder
|
|
cd todo-app
|
|
|
|
# Open in je editor
|
|
code . # of: cursor .
|
|
```
|
|
|
|
### Stap 2: Project Structuur Begrijpen
|
|
|
|
```
|
|
todo-app/
|
|
├── src/
|
|
│ └── app/
|
|
│ ├── layout.tsx # Root layout (header, footer)
|
|
│ ├── page.tsx # Homepage (/)
|
|
│ └── globals.css # Global styles + Tailwind
|
|
├── public/ # Static files (images, etc.)
|
|
├── .env.local # Environment variables (maak zelf aan)
|
|
├── next.config.js # Next.js configuratie
|
|
├── tailwind.config.ts # Tailwind configuratie
|
|
├── package.json # Dependencies
|
|
└── tsconfig.json # TypeScript configuratie
|
|
```
|
|
|
|
### Stap 3: Lokaal Draaien
|
|
|
|
```bash
|
|
# Start development server
|
|
npm run dev
|
|
|
|
# Open browser: http://localhost:3000
|
|
```
|
|
|
|
### Stap 4: Supabase Project Aanmaken
|
|
|
|
**Op supabase.com:**
|
|
|
|
1. Ga naar [supabase.com](https://supabase.com) en maak account (gratis)
|
|
2. Klik "New Project"
|
|
3. Kies een naam (bijv. `todo-app`)
|
|
4. Kies een database wachtwoord (bewaar deze!)
|
|
5. Kies region: `West EU (Frankfurt)` (dichtst bij NL)
|
|
6. Wacht ~2 minuten tot project klaar is
|
|
|
|
**Credentials ophalen:**
|
|
|
|
1. Ga naar Settings → API
|
|
2. Kopieer:
|
|
- `Project URL` → dit wordt `NEXT_PUBLIC_SUPABASE_URL`
|
|
- `anon public` key → dit wordt `NEXT_PUBLIC_SUPABASE_ANON_KEY`
|
|
|
|
### Stap 5: Environment Variables (Lokaal)
|
|
|
|
Maak `.env.local` in je project root:
|
|
|
|
```bash
|
|
# .env.local (NOOIT committen naar Git!)
|
|
NEXT_PUBLIC_SUPABASE_URL=https://xxxxx.supabase.co
|
|
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.xxxxx
|
|
```
|
|
|
|
Maak ook `.env.example` (deze WEL committen):
|
|
|
|
```bash
|
|
# .env.example (template voor anderen)
|
|
NEXT_PUBLIC_SUPABASE_URL=your-supabase-url
|
|
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
|
|
```
|
|
|
|
**Check .gitignore:**
|
|
```
|
|
# .gitignore moet bevatten:
|
|
.env*.local
|
|
```
|
|
|
|
### Stap 6: Supabase SDK Installeren
|
|
|
|
```bash
|
|
npm install @supabase/supabase-js
|
|
```
|
|
|
|
### Stap 7: Supabase Client Maken
|
|
|
|
Maak `src/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)
|
|
```
|
|
|
|
### Stap 8: Database Tabel Maken (via UI)
|
|
|
|
**In Supabase Dashboard:**
|
|
|
|
1. Ga naar Table Editor
|
|
2. Klik "New Table"
|
|
3. Naam: `todos`
|
|
4. Kolommen:
|
|
| Name | Type | Default | Primary |
|
|
|------|------|---------|---------|
|
|
| id | int8 | - | ✓ (auto) |
|
|
| title | text | - | |
|
|
| completed | bool | false | |
|
|
| created_at | timestamptz | now() | |
|
|
| user_id | uuid | auth.uid() | |
|
|
|
|
5. Klik "Save"
|
|
|
|
### Stap 9: CRUD Operaties
|
|
|
|
```typescript
|
|
// CREATE - nieuwe todo toevoegen
|
|
const { data, error } = await supabase
|
|
.from('todos')
|
|
.insert({ title: 'Nieuwe taak' })
|
|
|
|
// READ - todos ophalen
|
|
const { data, error } = await supabase
|
|
.from('todos')
|
|
.select('*')
|
|
.order('created_at', { ascending: false })
|
|
|
|
// UPDATE - todo afvinken
|
|
const { data, error } = await supabase
|
|
.from('todos')
|
|
.update({ completed: true })
|
|
.eq('id', todoId)
|
|
|
|
// DELETE - todo verwijderen
|
|
const { error } = await supabase
|
|
.from('todos')
|
|
.delete()
|
|
.eq('id', todoId)
|
|
```
|
|
|
|
### Stap 10: Authenticatie Setup
|
|
|
|
```bash
|
|
npm install @supabase/auth-ui-react @supabase/auth-ui-shared
|
|
```
|
|
|
|
**Login component:**
|
|
```tsx
|
|
import { Auth } from '@supabase/auth-ui-react'
|
|
import { ThemeSupa } from '@supabase/auth-ui-shared'
|
|
import { supabase } from '@/lib/supabase'
|
|
|
|
export function LoginForm() {
|
|
return (
|
|
<Auth
|
|
supabaseClient={supabase}
|
|
appearance={{ theme: ThemeSupa }}
|
|
providers={[]}
|
|
magicLink={true}
|
|
/>
|
|
)
|
|
}
|
|
```
|
|
|
|
**Session checken:**
|
|
```typescript
|
|
const { data: { user } } = await supabase.auth.getUser()
|
|
|
|
if (user) {
|
|
// User is ingelogd
|
|
} else {
|
|
// Redirect naar login
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Deployment naar Vercel (Productie)
|
|
|
|
### Stap 1: GitHub Repository
|
|
|
|
```bash
|
|
# In je project folder
|
|
git init
|
|
git add .
|
|
git commit -m "Initial commit"
|
|
|
|
# Maak repo op GitHub, dan:
|
|
git remote add origin https://github.com/jouw-username/todo-app.git
|
|
git push -u origin main
|
|
```
|
|
|
|
### Stap 2: Vercel Deployment
|
|
|
|
1. Ga naar [vercel.com](https://vercel.com)
|
|
2. "Add New Project"
|
|
3. Import je GitHub repository
|
|
4. **BELANGRIJK:** Voeg Environment Variables toe:
|
|
- `NEXT_PUBLIC_SUPABASE_URL` → je Supabase URL
|
|
- `NEXT_PUBLIC_SUPABASE_ANON_KEY` → je anon key
|
|
5. Klik "Deploy"
|
|
|
|
### Stap 3: Supabase URL Toestaan
|
|
|
|
In Supabase Dashboard:
|
|
1. Ga naar Authentication → URL Configuration
|
|
2. Voeg je Vercel URL toe aan "Redirect URLs":
|
|
- `https://jouw-app.vercel.app/**`
|
|
|
|
---
|
|
|
|
## Overzicht: Lokaal vs Productie
|
|
|
|
| Aspect | Lokaal | Productie |
|
|
|--------|--------|-----------|
|
|
| URL | `localhost:3000` | `jouw-app.vercel.app` |
|
|
| Env vars | `.env.local` | Vercel Dashboard |
|
|
| Database | Supabase (zelfde) | Supabase (zelfde) |
|
|
| Command | `npm run dev` | Automatisch via Vercel |
|
|
|
|
**Let op:** Je gebruikt dezelfde Supabase database voor lokaal en productie. Voor een echt project zou je aparte databases hebben, maar voor deze cursus is dat niet nodig.
|
|
|
|
---
|
|
|
|
## Tools
|
|
- Next.js
|
|
- Supabase (gratis tier)
|
|
- Vercel (gratis tier)
|
|
- Cursor/OpenCode
|
|
|
|
---
|
|
|
|
## Lesopdracht (2 uur)
|
|
|
|
### Bouw een Todo App met Supabase
|
|
|
|
**Deel 1: Project Setup (30 min)**
|
|
- Run `npx create-next-app@latest todo-app` met juiste opties
|
|
- Maak Supabase account en project aan
|
|
- Configureer `.env.local` met credentials
|
|
- Installeer `@supabase/supabase-js`
|
|
- Maak `src/lib/supabase.ts`
|
|
- Test: `npm run dev` werkt zonder errors
|
|
|
|
**Deel 2: Database (20 min)**
|
|
- Maak `todos` tabel via Supabase Table Editor
|
|
- Voeg 3 test todos toe via de UI
|
|
- Test: data is zichtbaar in Table Editor
|
|
|
|
**Deel 3: CRUD Interface (50 min)**
|
|
- Bouw UI om todos te tonen (lijst)
|
|
- Voeg form toe om nieuwe todo te maken
|
|
- Voeg checkbox toe om todo af te vinken
|
|
- Voeg delete button toe
|
|
- Test: alle CRUD operaties werken
|
|
|
|
**Deel 4: Authenticatie (20 min)**
|
|
- Installeer auth packages
|
|
- Maak login pagina met Auth UI
|
|
- Toon alleen todos voor ingelogde user
|
|
- Test: login met magic link werkt
|
|
|
|
### Deliverable
|
|
- Werkende Todo app lokaal
|
|
- GitHub repository met code
|
|
- Screenshot van werkende app
|
|
|
|
---
|
|
|
|
## Huiswerk (2 uur)
|
|
|
|
### Deploy naar Productie + Uitbreiden
|
|
|
|
**Deel 1: Deployment (30 min)**
|
|
- Push code naar GitHub
|
|
- Deploy naar Vercel
|
|
- Configureer environment variables in Vercel
|
|
- Voeg Vercel URL toe aan Supabase Redirect URLs
|
|
- Test: app werkt op productie URL
|
|
|
|
**Deel 2: Features Uitbreiden (1 uur)**
|
|
- Filter buttons: Alle / Actief / Voltooid
|
|
- Sorteer op datum (nieuwste eerst)
|
|
- Toon alleen todos van ingelogde user (filter op `user_id`)
|
|
- Loading state tijdens data ophalen
|
|
- Error state bij problemen
|
|
- Empty state: "Geen todos gevonden"
|
|
|
|
**Deel 3: Polish (30 min)**
|
|
- Styling verbeteren met Tailwind
|
|
- Responsive design (mobile friendly)
|
|
- Kleine animaties (fade in/out)
|
|
|
|
### Deliverable
|
|
- Deployed app op Vercel (werkende URL)
|
|
- Alle features werken in productie
|
|
- Screenshot van productie app
|
|
|
|
---
|
|
|
|
## Leerdoelen
|
|
Na deze les kan de student:
|
|
- Een Next.js project opzetten met `npx create-next-app`
|
|
- De project structuur begrijpen en navigeren
|
|
- Een Supabase project aanmaken en configureren
|
|
- Environment variables correct beheren (lokaal en productie)
|
|
- De Supabase client installeren en configureren
|
|
- Tabellen maken via de Supabase UI
|
|
- CRUD operaties uitvoeren met de Supabase SDK
|
|
- Authenticatie implementeren met Auth UI
|
|
- Deployen naar Vercel met environment variables
|
|
- Het verschil tussen lokale en productie omgeving begrijpen
|