Files
ANDJJJJJJ/README.md

231 lines
5.4 KiB
Markdown

# 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