Complete Email Sortierer implementation with Appwrite and Stripe integration

This commit is contained in:
2026-01-14 20:02:16 +01:00
commit 95349af50b
3355 changed files with 644802 additions and 0 deletions

View File

@@ -0,0 +1,121 @@
# Design Document
## Overview
Das Email-Sortierer System besteht aus drei Hauptkomponenten:
1. Frontend: Vanilla JavaScript Multi-Step-Formular
2. Backend: Express.js Server mit API-Endpunkten
3. Datenbank: Appwrite Collections für Produkte, Fragen, Submissions, Antworten und Orders
## Architecture
```
Browser (HTML/JS)
↓ HTTP
Express Server
↓ API Calls
Appwrite Database
Express Server
↓ Webhook
Stripe Payment
```
## Components and Interfaces
### Frontend (public/index.html)
- Multi-step form renderer
- State management für Antworten
- API calls zu Backend
### Backend (server/index.mjs)
- GET /api/questions - Lädt Fragen aus Appwrite
- POST /api/submissions - Speichert Kundenantworten
- POST /api/checkout - Erstellt Stripe Checkout Session
- POST /stripe/webhook - Empfängt Stripe Events
### Bootstrap Script (server/bootstrap-appwrite.mjs)
- Erstellt Appwrite Database und Collections
- Erstellt alle Attribute/Spalten
- Seeded Produkt und 13 Fragen
## Data Models
### Products Collection
- slug: string
- title: string
- description: string
- priceCents: integer
- currency: string
- isActive: boolean
### Questions Collection
- productId: string
- key: string
- label: string
- helpText: string (optional)
- type: string (text, email, select, multiselect, textarea)
- required: boolean
- step: integer
- order: integer
- optionsJson: string (optional)
- isActive: boolean
### Submissions Collection
- productId: string
- status: string (draft, paid)
- customerEmail: email (optional)
- customerName: string (optional)
- utmJson: string (optional)
- finalSummaryJson: string
- priceCents: integer
- currency: string
### Answers Collection
- submissionId: string
- answersJson: string
### Orders Collection
- submissionId: string
- orderDataJson: string
## Correctness Properties
*Properties sind formale Aussagen über das Systemverhalten, die über alle gültigen Eingaben gelten.*
**Property 1: Question Loading**
*For any* active product, when questions are requested, all active questions for that product should be returned ordered by step and order.
**Validates: Requirements 1.1, 2.4**
**Property 2: Submission Creation**
*For any* valid answers object, when a submission is created, the system should store the submission and return a valid submissionId.
**Validates: Requirements 2.2, 2.3**
**Property 3: Payment Flow**
*For any* valid submissionId, when checkout is initiated, the system should create a Stripe session and return a checkout URL.
**Validates: Requirements 3.1, 3.2**
**Property 4: Webhook Validation**
*For any* Stripe webhook event, when the signature is invalid, the system should reject the request with 400 status.
**Validates: Requirements 3.4**
## Error Handling
- Fehlende Umgebungsvariablen → Server exit mit Fehler
- Ungültige Webhook-Signatur → 400 Bad Request
- Fehlende submissionId → 400 Bad Request
- Appwrite Fehler → Console error + graceful handling
## Testing Strategy
**Unit Tests:**
- API endpoint responses
- Data validation
- Error handling
**Property-Based Tests:**
- Question ordering across random datasets
- Submission creation with various answer formats
- Webhook signature validation
Minimum 100 Iterationen pro Property Test.

View File

@@ -0,0 +1,58 @@
# Requirements Document
## Introduction
Funktionsfähiges Email-Sortierer Produkt mit Multi-Step-Formular, Appwrite-Datenspeicherung und Stripe-Bezahlung.
## Glossary
- **System**: Das Email-Sortierer Web-Applikation
- **Appwrite**: Backend-as-a-Service für Datenspeicherung
- **Stripe**: Zahlungsanbieter
- **Submission**: Kundenantworten auf Fragebogen
## Requirements
### Requirement 1: Multi-Step Formular
**User Story:** Als Kunde möchte ich durch einen mehrstufigen Fragebogen geführt werden, damit ich meine Email-Präferenzen konfigurieren kann.
#### Acceptance Criteria
1. WHEN die Seite geladen wird, THEN THE System SHALL die Fragen von Appwrite laden
2. WHEN ein Schritt ausgefüllt wird, THEN THE System SHALL die Antworten zwischenspeichern
3. WHEN alle Schritte abgeschlossen sind, THEN THE System SHALL eine Zusammenfassung anzeigen
4. WHEN Pflichtfelder leer sind, THEN THE System SHALL eine Validierungsfehlermeldung anzeigen
### Requirement 2: Appwrite Datenspeicherung
**User Story:** Als System möchte ich alle Kundendaten in Appwrite speichern, damit die Daten persistent verfügbar sind.
#### Acceptance Criteria
1. WHEN das Bootstrap-Script läuft, THEN THE System SHALL alle Tabellen und Spalten erstellen
2. WHEN ein Kunde den Fragebogen abschließt, THEN THE System SHALL eine Submission erstellen
3. WHEN eine Submission erstellt wird, THEN THE System SHALL alle Antworten speichern
4. WHEN Fragen abgerufen werden, THEN THE System SHALL nur aktive Fragen für das Produkt zurückgeben
### Requirement 3: Stripe Bezahlung
**User Story:** Als Kunde möchte ich nach dem Fragebogen bezahlen können, damit ich das Produkt kaufen kann.
#### Acceptance Criteria
1. WHEN der Kunde auf "Jetzt kaufen" klickt, THEN THE System SHALL eine Stripe Checkout Session erstellen
2. WHEN die Checkout Session erstellt wird, THEN THE System SHALL den Kunden zu Stripe weiterleiten
3. WHEN die Bezahlung erfolgreich ist, THEN THE System SHALL den Submission-Status auf "paid" aktualisieren
4. WHEN der Stripe Webhook empfangen wird, THEN THE System SHALL die Signatur validieren
### Requirement 4: Server Setup
**User Story:** Als Entwickler möchte ich den Server starten können, damit die Applikation läuft.
#### Acceptance Criteria
1. WHEN der Server startet, THEN THE System SHALL auf Port 3000 lauschen
2. WHEN die HTML-Datei angefordert wird, THEN THE System SHALL die statische Datei ausliefern
3. WHEN API-Endpunkte aufgerufen werden, THEN THE System SHALL JSON-Antworten zurückgeben
4. WHEN Umgebungsvariablen fehlen, THEN THE System SHALL einen Fehler ausgeben

View File

@@ -0,0 +1,50 @@
# Implementation Plan: Email Sorter Setup
## Overview
Funktionsfähiges Email-Sortierer Produkt mit allen notwendigen Dateien und Konfigurationen.
## Tasks
- [x] 1. Projektstruktur und fehlende Dateien erstellen
- Erstelle public/index.html mit dem Frontend-Code
- Erstelle server/index.mjs mit dem Express-Server
- Erstelle .env.example mit allen benötigten Umgebungsvariablen
- Aktualisiere server/package.json mit allen Dependencies (express, stripe, node-appwrite)
- _Requirements: 4.1, 4.2, 4.3, 4.4_
- [x] 2. Appwrite API Calls korrigieren
- Ersetze deprecated db.listRows() mit db.listDocuments()
- Ersetze deprecated db.createRow() mit db.createDocument()
- Ersetze deprecated db.updateRow() mit db.updateDocument()
- Teste dass bootstrap-appwrite.mjs ohne Fehler läuft
- _Requirements: 2.1, 2.2, 2.3_
- [x] 3. Server-Endpunkte implementieren und testen
- Implementiere GET /api/questions mit korrekter Appwrite Query
- Implementiere POST /api/submissions mit Antwort-Speicherung
- Implementiere POST /api/checkout mit Stripe Integration
- Implementiere POST /stripe/webhook mit Signatur-Validierung
- _Requirements: 1.1, 2.2, 2.3, 3.1, 3.2, 3.3, 3.4_
- [x] 4. Frontend-Integration vervollständigen
- Stelle sicher dass index.html alle Formular-Typen korrekt rendert
- Teste Navigation zwischen Steps
- Teste Validierung von Pflichtfeldern
- Teste Zusammenfassung und Kaufen-Button
- _Requirements: 1.1, 1.2, 1.3, 1.4_
- [x] 5. End-to-End Test und Dokumentation
- Erstelle README.md mit Setup-Anleitung
- Teste kompletten Flow: Fragen laden → Ausfüllen → Bezahlen
- Verifiziere dass Daten in Appwrite gespeichert werden
- Verifiziere dass Stripe Webhook funktioniert
- _Requirements: 1.1, 2.2, 2.3, 3.1, 3.2, 3.3_
## Notes
- Kein CSS - nur funktionale Implementierung
- Alle deprecated Appwrite API Calls müssen aktualisiert werden
- Express und Stripe Dependencies müssen zu package.json hinzugefügt werden
- .env Datei muss vom Benutzer mit echten Credentials ausgefüllt werden