# Email Sortierer Setup

Ein Multi-Step-Formular zur Konfiguration von Email-Präferenzen mit Appwrite-Datenspeicherung und Stripe-Bezahlung.

## Quick Start

```bash
# 1. Dependencies installieren
cd server
npm install

# 2. Setup überprüfen
npm run verify

# 3. Umgebungsvariablen konfigurieren
cp ../.env.example .env
# Bearbeiten Sie .env und fügen Sie Ihre Credentials ein

# 4. Datenbank initialisieren
npm run bootstrap
# Kopieren Sie die Database-ID und fügen Sie sie in .env ein

# 5. Tests ausführen
npm test

# 6. Server starten
npm start

# 7. Browser öffnen
# http://localhost:3000
```

## Voraussetzungen

- Node.js (v18 oder höher)
- Appwrite Account (https://cloud.appwrite.io)
- Stripe Account (https://stripe.com)

## Installation

1. **Repository klonen und Dependencies installieren:**

```bash
cd server
npm install
```

2. **Umgebungsvariablen konfigurieren:**

Kopieren Sie `.env.example` zu `.env` und füllen Sie alle Werte aus:

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

Erforderliche Werte:
- `APPWRITE_ENDPOINT`: Ihre Appwrite API Endpoint (z.B. https://cloud.appwrite.io/v1)
- `APPWRITE_PROJECT_ID`: Ihre Appwrite Projekt-ID
- `APPWRITE_API_KEY`: Ihr Appwrite API Key (mit allen Berechtigungen)
- `APPWRITE_DATABASE_ID`: Wird nach Bootstrap-Script automatisch gesetzt
- `STRIPE_SECRET_KEY`: Ihr Stripe Secret Key (sk_test_...)
- `STRIPE_WEBHOOK_SECRET`: Ihr Stripe Webhook Secret (whsec_...)

3. **Appwrite Datenbank initialisieren:**

```bash
npm run bootstrap
```

Dieses Script erstellt:
- Eine neue Datenbank "EmailSorter"
- 5 Collections: products, questions, submissions, answers, orders
- Ein Produkt "Email Sorter Setup"
- 13 Fragen für den Fragebogen

**Wichtig:** Nach dem Bootstrap-Script wird die Database-ID in der Konsole ausgegeben. Kopieren Sie diese ID und fügen Sie sie in Ihre `.env` Datei als `APPWRITE_DATABASE_ID` ein.

4. **Stripe Webhook konfigurieren:**

Für lokale Entwicklung mit Stripe CLI:

```bash
stripe listen --forward-to localhost:3000/stripe/webhook
```

Kopieren Sie das angezeigte Webhook-Secret und fügen Sie es als `STRIPE_WEBHOOK_SECRET` in Ihre `.env` Datei ein.

Für Produktion: Erstellen Sie einen Webhook in Ihrem Stripe Dashboard mit der URL `https://ihre-domain.com/stripe/webhook` und dem Event `checkout.session.completed`.

## Server starten

```bash
npm start
```

Der Server läuft auf http://localhost:3000

## Verwendung

1. Öffnen Sie http://localhost:3000 in Ihrem Browser
2. Füllen Sie den mehrstufigen Fragebogen aus
3. Überprüfen Sie die Zusammenfassung
4. Klicken Sie auf "Jetzt kaufen" um zur Stripe-Bezahlung weitergeleitet zu werden
5. Verwenden Sie Stripe Test-Kreditkarte: `4242 4242 4242 4242`

## API Endpunkte

### GET /api/questions
Lädt alle aktiven Fragen für ein Produkt.

**Query Parameter:**
- `productSlug`: Produkt-Slug (z.B. "email-sorter")

**Response:**
```json
[
  {
    "$id": "...",
    "key": "email",
    "label": "Ihre E-Mail-Adresse",
    "type": "email",
    "required": true,
    "step": 1,
    "order": 1
  }
]
```

### POST /api/submissions
Erstellt eine neue Submission mit Kundenantworten.

**Request Body:**
```json
{
  "productSlug": "email-sorter",
  "answers": {
    "email": "kunde@example.com",
    "name": "Max Mustermann"
  }
}
```

**Response:**
```json
{
  "submissionId": "..."
}
```

### POST /api/checkout
Erstellt eine Stripe Checkout Session.

**Request Body:**
```json
{
  "submissionId": "..."
}
```

**Response:**
```json
{
  "url": "https://checkout.stripe.com/..."
}
```

### POST /stripe/webhook
Empfängt Stripe Webhook Events (nur für Stripe).

## Datenmodell

### Products Collection
- `slug`: Eindeutiger Produkt-Identifier
- `title`: Produktname
- `priceCents`: Preis in Cent
- `currency`: Währung (z.B. "eur")
- `isActive`: Produkt aktiv/inaktiv

### Questions Collection
- `productId`: Referenz zum Produkt
- `key`: Eindeutiger Schlüssel für die Antwort
- `label`: Anzeigetext
- `type`: Feldtyp (text, email, select, multiselect, textarea)
- `required`: Pflichtfeld ja/nein
- `step`: Schritt-Nummer im Formular
- `order`: Reihenfolge innerhalb des Schritts
- `optionsJson`: JSON-Array mit Auswahloptionen (für select/multiselect)
- `isActive`: Frage aktiv/inaktiv

### Submissions Collection
- `productId`: Referenz zum Produkt
- `status`: Status (draft, paid)
- `customerEmail`: Kunden-Email
- `customerName`: Kundenname
- `finalSummaryJson`: JSON mit allen Antworten
- `priceCents`: Preis in Cent
- `currency`: Währung

### Answers Collection
- `submissionId`: Referenz zur Submission
- `answersJson`: JSON mit allen Antworten

### Orders Collection
- `submissionId`: Referenz zur Submission
- `orderDataJson`: JSON mit Stripe Session Daten

## Troubleshooting

### Server startet nicht
- Überprüfen Sie, dass alle Umgebungsvariablen in `.env` gesetzt sind
- Stellen Sie sicher, dass Port 3000 nicht bereits verwendet wird

### Fragen werden nicht geladen
- Überprüfen Sie die Appwrite-Verbindung und API-Key
- Stellen Sie sicher, dass das Bootstrap-Script erfolgreich durchgelaufen ist
- Überprüfen Sie die Browser-Konsole auf Fehler

### Stripe Checkout funktioniert nicht
- Überprüfen Sie, dass `STRIPE_SECRET_KEY` korrekt gesetzt ist
- Für lokale Tests: Stellen Sie sicher, dass Stripe CLI läuft
- Überprüfen Sie die Server-Logs auf Fehler

### Webhook wird nicht empfangen
- Für lokale Tests: Stellen Sie sicher, dass `stripe listen` läuft
- Überprüfen Sie, dass `STRIPE_WEBHOOK_SECRET` korrekt gesetzt ist
- Überprüfen Sie die Stripe Dashboard Webhook-Logs

## Lizenz

ISC
