# Yumder

Yumder ist eine mobile-first Web-App, mit der Gruppen per Swipe ein Restaurant finden können – eine Art „Dating-App für Restaurants“. Teilnehmer einer Session wischen über Restaurant-Vorschläge, setzen Vetos und finden so per Mehrheit den passenden Essensort.

## Tech Stack

- **Framework:** [Next.js](https://nextjs.org/) 15.5+ mit App Router
- **Frontend:** React 19, TypeScript, Tailwind CSS 3.4, [Motion](https://motion.dev/)
- **Backend:** Next.js API Routes, serverseitige SQLite mit [better-sqlite3](https://github.com/WiseLibs/better-sqlite3)
- **Authentifizierung:** bcrypt + TOTP-2FA + serverseitige HTTP-only Sessions für den Admin-Bereich
- **Bilder:** Lokaler Pexels-Bilderpool (`public/img/pexels-cache/`), Fallback über Pexels-API
- **PWA:** Web-Manifest, Service-Worker via Next.js, installierbar

## Hauptfeatures

- **Gruppen-Sessions** mit kurzem Share-Code (z. B. `AB12CD`)
- **Swipe-Matching** mit Ja/Neu/Veto-Mechanismus
- **Joker-Funktion** („Schicksals-Joker“) zur zufälligen Auswahl unter den Ja-Restaurants
- **Filter:** Küche, Preisniveau, Diät (vegan, vegetarisch, halal, glutenfrei), Fast-Food-/Ketten-Ausschluss, Open-Now
- **Admin-Dashboard** mit Statistiken, Insights, gesponserten Restaurants und Werbebannern
- **Mehrsprachigkeit** (Deutsch/Englisch)
- **Session-Cleanup** nach 48 Stunden (Teilnehmer, Swipes, Vetos, Matches werden kaskadierend gelöscht)

## Voraussetzungen

- Node.js 20 oder höher
- npm

## Installation

```bash
npm install
```

Kopiere anschließend die Umgebungsvariablen:

```bash
cp .env.example .env.local
```

Passe `.env.local` an:

```env
ADMIN_SESSION_SECRET=change-me-to-a-long-random-string
NODE_ENV=production
PEXELS_API_KEY=your-pexels-api-key-here
```

- `ADMIN_SESSION_SECRET`: wird für die Admin-Session-Cookies verwendet.
- `PEXELS_API_KEY`: optional, wird für den Fallback-Bilderpool genutzt.

## Entwicklung

```bash
npm run dev
```

Die App läuft dann auf [http://localhost:3001](http://localhost:3001).

Beim ersten Start wird automatisch `db/yumder.db` angelegt und mit `db/schema.sql` initialisiert (sofern die Datenbank noch nicht existiert).

## Build & Produktion

```bash
npm run build
npm start
```

`npm start` startet den Next.js-Production-Server ebenfalls auf Port `3001`.

## Tests

Das Projekt nutzt [Vitest](https://vitest.dev/) für Unit-Tests. Die Tests liegen in `lib/__tests__/` und testen reine Logik-Funktionen (z. B. Match-Regeln, Öffnungszeiten, Session-Code-Generierung).

```bash
# Tests einmalig ausführen
npx vitest run

# Tests im Watch-Modus während der Entwicklung
npm test
```

Bei Änderungen an kritischer Logik sollten `npm run build` und `npx vitest run` erfolgreich durchlaufen, bevor gepusht wird.

## Cronjob / Cleanup

Sessions laufen nach 48 Stunden ab. Um abgelaufene Sessions regelmäßig zu entfernen, kannst du `lib/cleanup.js` per Cron oder PM2 laufen lassen:

```bash
node lib/cleanup.js
```

Das Skript löscht nur abgelaufene Sessions; gesponserte Restaurants und Admin-Daten bleiben erhalten.

## Admin-Zugang

Der Admin-Bereich ist unter `/admin` erreichbar. Zum initialen Anlegen eines Admin-Users gibt es aktuell kein öffentliches Registrierungsformular – der Account muss direkt in der Datenbank angelegt werden (z. B. über ein SQLite-Tool oder ein Setup-Skript).

Erforderliche Tabelle: `admin_users` mit `username` und `password_hash` (bcrypt).

## Projektstruktur

```
app/
  admin/              # Admin-Dashboard (Login, Statistiken, Sponsoren, Insights)
  api/                # Next.js API Routes (Sessions, Swipes, Admin, Uploads, ...)
  session/[code]/     # Öffentliche Session-Seite für Teilnehmer
  home-client.tsx     # Startseite mit Session erstellen/beitreten
components/           # Wiederverwendbare React-Komponenten
lib/                  # Hilfsfunktionen, DB-Connection, i18n, Auth, Zeitzonen
public/               # Statische Assets, PWA-Icons, Bildercache
db/
  schema.sql          # Autoritative SQLite-Schemadefinition
  yumder.db           # Lokale SQLite-Datenbank (nicht im Git)
migrations/           # SQL-Migrationen (manuell anzuwenden)
```

## Wichtige Hinweise

- `db/yumder.db`, `uploads/`, `public/img/pexels-cache/` und `.env.*` sind per `.gitignore` ausgeschlossen.
- Produktionsdatenbanken sollten regelmäßig außerhalb des Repos gesichert werden.
- Änderungen am Schema sollten in `db/schema.sql` und ggf. in `migrations/` nachgezogen werden.

## Lizenz

Privates Projekt – keine öffentliche Lizenz.
