Complete Email Sortierer implementation with Appwrite and Stripe integration
This commit is contained in:
121
.kiro/specs/email-sorter-setup/design.md
Normal file
121
.kiro/specs/email-sorter-setup/design.md
Normal 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.
|
||||
58
.kiro/specs/email-sorter-setup/requirements.md
Normal file
58
.kiro/specs/email-sorter-setup/requirements.md
Normal 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
|
||||
50
.kiro/specs/email-sorter-setup/tasks.md
Normal file
50
.kiro/specs/email-sorter-setup/tasks.md
Normal 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
|
||||
|
||||
Reference in New Issue
Block a user