231 lines
5.4 KiB
Markdown
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
|