# WM 2026 Tippspiel – Backend Setup

## Voraussetzungen

- Node.js 20+
- npm oder pnpm
- Supabase Account (kostenlos)
- football-data.org API Key (kostenlos)
- Railway oder Render Account (Hosting)

---

## 1. Supabase einrichten

1. Projekt anlegen unter https://supabase.com
2. SQL Editor öffnen → `src/db/schema.sql` vollständig ausführen
3. Unter **Settings → Database → Connection string** die `DATABASE_URL` kopieren
4. Unter **Settings → API → service_role key** den Service Role Key kopieren

---

## 2. Staffbase Plugin Public Key

1. In Staffbase Studio: **Plugins → Neues Plugin anlegen**
2. Plugin-Typ: **External Web App (iFrame)**
3. Den angezeigten **Public Key (RSA)** kopieren
4. In `.env` als `STAFFBASE_PUBLIC_KEY` eintragen (mehrzeilig mit `\n` oder in Anführungszeichen)

---

## 3. football-data.org API Key

1. Registrieren unter https://www.football-data.org/client/register
2. API Key per E-Mail erhalten → in `.env` als `FOOTBALL_API_KEY` eintragen

---

## 4. Lokale Entwicklung

```bash
cd backend
npm install
cp .env.example .env
# .env mit echten Werten befüllen

npm run dev
# → Server läuft auf http://localhost:3001
# → Health Check: http://localhost:3001/health
```

---

## 5. Deployment auf Railway

```bash
# Railway CLI installieren
npm install -g @railway/cli

# Login
railway login

# Projekt erstellen und deployen
railway init
railway up

# Environment Variables setzen (einmalig)
railway variables set DATABASE_URL="..." \
  STAFFBASE_PUBLIC_KEY="..." \
  FOOTBALL_API_KEY="..." \
  NODE_ENV=production \
  CORS_ORIGIN="https://app.staffbase.com"
```

---

## 6. Ersten Sync durchführen

Nach dem Deployment:

```bash
# Spiele von football-data.org laden (als Editor-User via Staffbase)
POST /api/admin/sync

# Oder direkt via curl (mit gültigem JWT):
curl -X POST https://your-app.railway.app/api/admin/sync \
  -H "Authorization: Bearer <staffbase_jwt>"
```

---

## API Übersicht

| Method | Endpoint | Beschreibung |
|--------|----------|--------------|
| GET | `/health` | Health Check |
| GET | `/api/matches` | Alle Spiele (mit eigenem Tipp) |
| GET | `/api/matches/:id` | Einzelnes Spiel |
| POST | `/api/tips` | Tipp abgeben / aktualisieren |
| GET | `/api/tips` | Eigene Tipps |
| GET | `/api/leaderboard` | Rangliste (Top 50) |
| GET | `/api/leaderboard/me` | Eigene Statistiken |
| POST | `/api/admin/sync` | Spiele synchronisieren (Editor) |
| POST | `/api/admin/evaluate` | Tipps auswerten (Editor) |
| GET | `/api/admin/stats` | Admin-Statistiken (Editor) |

---

## Punkte-System

| Ergebnis | Punkte |
|----------|--------|
| Exaktes Ergebnis | **3** |
| Richtige Tendenz (S/U/N) | **1** |
| Falsche Tendenz | **0** |
