Complete Email Sortierer implementation with Appwrite and Stripe integration
This commit is contained in:
230
README.md
Normal file
230
README.md
Normal file
@@ -0,0 +1,230 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user