# 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