User Stories
User Stories werden pro Meilenstein definiert. M1 (Fundament) ist reines Infra-Setup und wird ueber die Task-Checkliste in der Roadmap abgedeckt.
M2 — CMS Kern
Abschnitt betitelt „M2 — CMS Kern“Epic: Kundenverwaltung
Abschnitt betitelt „Epic: Kundenverwaltung“Als Betreiber moechte ich Kunden und deren Websites im CMS anlegen und verwalten damit ich neue Kunden effizient onboarden kann.
US-001: Kunde anlegen
Abschnitt betitelt „US-001: Kunde anlegen“Als Betreiber moechte ich einen neuen Kunden mit Firmenname, Kontaktdaten und Paket anlegen damit ich den Kunden im System erfassen kann.
Akzeptanzkriterien:
- Formular mit Pflichtfeldern: Firmenname, Ansprechpartner, E-Mail, Paket
- Kunde wird in PostgreSQL gespeichert (Tenant-ID generiert)
- Validierung: E-Mail-Format, Pflichtfelder
- Kunde erscheint in der Kundenliste
Prioritaet: Must
US-002: Website einem Kunden zuordnen
Abschnitt betitelt „US-002: Website einem Kunden zuordnen“Als Betreiber moechte ich einem Kunden eine oder mehrere Websites zuordnen damit ich Kunden mit Filialen abbilden kann.
Akzeptanzkriterien:
- Website anlegen mit: Name, Domain, Astro-Template-Referenz
- Website ist einem Kunden zugeordnet (Tenant-ID)
- Mehrere Websites pro Kunde moeglich
- Website erscheint im Kunden-Dashboard
Prioritaet: Must
Epic: Authentifizierung
Abschnitt betitelt „Epic: Authentifizierung“Als Benutzer (Betreiber oder Kunde) moechte ich mich sicher am CMS anmelden damit nur autorisierte Personen Inhalte aendern koennen.
US-003: Login
Abschnitt betitelt „US-003: Login“Als Benutzer moechte ich mich mit E-Mail und Passwort anmelden damit ich Zugang zum CMS erhalte.
Akzeptanzkriterien:
- Login-Formular mit E-Mail + Passwort
- Session-Cookie wird gesetzt
- Brute-Force-Schutz (Rate-Limiting nach 5 Fehlversuchen)
- Weiterleitung zum Dashboard nach erfolgreichem Login
- Fehlermeldung bei falschen Credentials (ohne zu verraten ob E-Mail existiert)
Prioritaet: Must
US-004: Logout
Abschnitt betitelt „US-004: Logout“Als Benutzer moechte ich mich abmelden damit meine Session beendet wird.
Akzeptanzkriterien:
- Logout-Button im CMS
- Session wird serverseitig invalidiert
- Weiterleitung zur Login-Seite
Prioritaet: Must
US-005: Passwort zuruecksetzen
Abschnitt betitelt „US-005: Passwort zuruecksetzen“Als Benutzer moechte ich mein Passwort per E-Mail zuruecksetzen damit ich bei Vergessen wieder Zugang erhalte.
Akzeptanzkriterien:
- “Passwort vergessen”-Link auf der Login-Seite
- E-Mail mit Reset-Link wird via SES versendet
- Link ist zeitlich begrenzt (z.B. 1 Stunde)
- Neues Passwort setzen ueber den Link
- Alte Session wird invalidiert
Prioritaet: Must
Epic: Platzhalter-System
Abschnitt betitelt „Epic: Platzhalter-System“Als Betreiber moechte ich die Inhalte einer Kundenwebseite im CMS pflegen damit ich die Seite nach dem Design mit echten Texten und Bildern befuellen kann.
US-006: Texte bearbeiten
Abschnitt betitelt „US-006: Texte bearbeiten“Als Betreiber moechte ich die Texte einer Seite in vordefinierten Platzhaltern aendern damit ich den Inhalt aktualisieren kann ohne das Design zu veraendern.
Akzeptanzkriterien:
- Pro Seite werden die definierten Text-Platzhalter angezeigt
- Textfelder sind editierbar (einfacher Text, kein Rich-Text)
- Aenderungen werden in PostgreSQL gespeichert (JSONB)
- Platzhalter-Struktur wird vom Astro-Template definiert
Prioritaet: Must
US-007: Bilder austauschen
Abschnitt betitelt „US-007: Bilder austauschen“Als Betreiber moechte ich Bilder in vordefinierten Platzhaltern austauschen damit ich kundenspezifische Fotos einsetzen kann.
Akzeptanzkriterien:
- Bild-Upload per Drag & Drop oder Dateiauswahl
- Unterstuetzte Formate: JPG, PNG, WebP
- Dateigroessen-Limit pro Upload (z.B. 10 MB)
- Upload geht nach R2 + async Mirror nach S3-IA
- EXIF-Daten werden entfernt (DSGVO)
- Bild-URL wird im Platzhalter gespeichert
- Quota-Check vor Upload
Prioritaet: Must
Epic: Medien-Bibliothek
Abschnitt betitelt „Epic: Medien-Bibliothek“Als Betreiber moechte ich alle hochgeladenen Medien eines Kunden ueberblicken damit ich Dateien wiederverwenden und den Speicherverbrauch kontrollieren kann.
US-008: Medien-Uebersicht
Abschnitt betitelt „US-008: Medien-Uebersicht“Als Betreiber moechte ich alle Medien eines Kunden in einer Bibliothek sehen damit ich einen Ueberblick ueber alle hochgeladenen Dateien habe.
Akzeptanzkriterien:
- Grid-Ansicht aller Medien (Thumbnails)
- Anzeige pro Datei: Name, Groesse, Hochladedatum, verwendete Seite(n)
- Anzeige Speicherverbrauch gesamt vs. Quota
- Filterbar nach Typ (Bild, PDF, etc.)
Prioritaet: Must
US-009: Datei loeschen
Abschnitt betitelt „US-009: Datei loeschen“Als Betreiber moechte ich eine Datei aus der Medien-Bibliothek loeschen damit ich Speicherplatz freigeben kann.
Akzeptanzkriterien:
- Loeschen-Button pro Datei
- Warnung wenn Datei noch in einem Platzhalter verwendet wird
- Datei wird aus R2 und S3-IA geloescht
- Speicherverbrauch wird aktualisiert
Prioritaet: Must
M3 — Build-Pipeline
Abschnitt betitelt „M3 — Build-Pipeline“Epic: Automatisches Deployment
Abschnitt betitelt „Epic: Automatisches Deployment“Als Betreiber moechte ich dass Inhaltsaenderungen automatisch die Kundenwebseite aktualisieren damit ich nicht manuell deployen muss.
US-010: Build ausloesen
Abschnitt betitelt „US-010: Build ausloesen“Als Betreiber moechte ich nach dem Speichern von Aenderungen einen Build ausloesen damit die Kundenwebseite aktualisiert wird.
Akzeptanzkriterien:
- “Veroeffentlichen”-Button im CMS
- CMS ruft Cloudflare Pages Deploy Hook auf
- Build-Status wird im CMS angezeigt (ausstehend, laeuft, erfolgreich, fehlgeschlagen)
- Bei Fehler bleibt die alte Version live
Prioritaet: Must
US-011: CMS-API fuer Astro
Abschnitt betitelt „US-011: CMS-API fuer Astro“Als Astro-Build-Prozess moechte ich die Kundendaten per API vom CMS abrufen damit ich die statische Seite generieren kann.
Akzeptanzkriterien:
- REST-API liefert alle Inhalte einer Website (Seiten, Platzhalter, Medien-URLs)
- Service-Auth (API-Key oder Token, nicht Session-basiert)
- Erreichbar ueber Cloudflare Tunnel
- Response als JSON, strukturiert nach Seiten und Platzhaltern
Prioritaet: Must
US-012: Deploy-Benachrichtigung
Abschnitt betitelt „US-012: Deploy-Benachrichtigung“Als Kunde moechte ich per E-Mail benachrichtigt werden wenn meine Seite live ist damit ich weiss dass meine Aenderungen sichtbar sind.
Akzeptanzkriterien:
- CMS prueft Build-Status via Cloudflare API
- Bei erfolgreichem Build: E-Mail an Kunden-Ansprechpartner via SES
- E-Mail enthaelt Link zur Webseite
- Bei fehlgeschlagenem Build: E-Mail an Betreiber (nicht an Kunden)
Prioritaet: Should
US-013: Domain einrichten
Abschnitt betitelt „US-013: Domain einrichten“Als Betreiber moechte ich die Domain eines Kunden in Cloudflare einrichten damit die Webseite unter der Kundendomain erreichbar ist.
Akzeptanzkriterien:
- Domain in Cloudflare DNS konfigurieren (API oder manuell)
- SSL wird automatisch bereitgestellt
- Cloudflare Pages Custom Domain zuweisen
- Domain-Status im CMS sichtbar
Prioritaet: Must
M4 — Kunden-CMS
Abschnitt betitelt „M4 — Kunden-CMS“Epic: Kunden-Selbstverwaltung
Abschnitt betitelt „Epic: Kunden-Selbstverwaltung“Als Kunde moechte ich meine Webseiteninhalte selbst pflegen damit ich nicht fuer jede Textaenderung den Betreiber kontaktieren muss.
US-014: Kunden-Dashboard
Abschnitt betitelt „US-014: Kunden-Dashboard“Als Kunde moechte ich nach dem Login nur meine eigene(n) Website(s) sehen damit ich nicht von fremden Daten abgelenkt werde.
Akzeptanzkriterien:
- Kunde sieht nur eigene Websites (Tenant-Isolation)
- Dashboard zeigt: Website-Name, Domain, letzter Build-Status, letzte Aenderung
- Kein Zugriff auf Betreiber-Funktionen oder andere Kunden
Prioritaet: Must
US-015: Mitarbeiterzugaenge verwalten
Abschnitt betitelt „US-015: Mitarbeiterzugaenge verwalten“Als Kunde moechte ich Mitarbeitern Zugang zum CMS geben damit mehrere Personen Inhalte pflegen koennen.
Akzeptanzkriterien:
- Mitarbeiter einladen per E-Mail
- Einladungs-E-Mail mit Registrierungslink via SES
- Mitarbeiter gehoeren zum gleichen Tenant
- Kunde kann Mitarbeiterzugaenge deaktivieren
- Mitarbeiter sehen die gleichen Websites wie der Kunde
Prioritaet: Must
US-016: Oeffnungszeiten bearbeiten
Abschnitt betitelt „US-016: Oeffnungszeiten bearbeiten“Als Kunde moechte ich meine Oeffnungszeiten im CMS aendern damit Besucher aktuelle Informationen sehen.
Akzeptanzkriterien:
- Strukturiertes Formular: Wochentag + Von/Bis + optional “geschlossen”
- Sonderoeffnungszeiten / Feiertage moeglich
- Aenderungen werden nach Veroeffentlichung auf der Webseite sichtbar
Prioritaet: Must
US-017: SEO-Meta-Daten pflegen
Abschnitt betitelt „US-017: SEO-Meta-Daten pflegen“Als Kunde moechte ich Meta-Title und Meta-Description pro Seite bearbeiten damit meine Seite in Google-Ergebnissen ansprechend dargestellt wird.
Akzeptanzkriterien:
- Pro Seite: Meta-Title (max. 60 Zeichen) und Meta-Description (max. 160 Zeichen)
- Zeichenzaehler im Formular
- Vorschau wie der Google-Eintrag aussehen wuerde
- Fallback auf Standard-Werte wenn leer
Prioritaet: Should
US-018: Impressum/Datenschutz generieren
Abschnitt betitelt „US-018: Impressum/Datenschutz generieren“Als Kunde moechte ich mein Impressum und meine Datenschutzerklaerung ueber einen Generator erstellen damit ich rechtlich abgesichert bin ohne einen Anwalt beauftragen zu muessen.
Akzeptanzkriterien:
- Impressum: Strukturiertes Formular mit Pflicht- und Optionalfeldern (siehe Spezifikation)
- Datenschutz: Automatisch generiert basierend auf aktivierten Features
- Verantwortlicher wird aus Impressum-Daten uebernommen
- Aenderungen loesen neuen Build aus
- Hinweis: “Keine Rechtsberatung, Template anwaltlich geprueft”
Prioritaet: Must
US-019: Audit-Log einsehen
Abschnitt betitelt „US-019: Audit-Log einsehen“Als Kunde moechte ich sehen wer wann was geaendert hat damit ich Aenderungen nachvollziehen kann (besonders bei mehreren Mitarbeitern).
Akzeptanzkriterien:
- Chronologische Liste: Zeitstempel, Benutzer, Aktion, betroffene Seite/Feld
- Filterbar nach Benutzer und Zeitraum
- Nur Aenderungen des eigenen Tenants sichtbar
Prioritaet: Should
US-020: Aenderung rueckgaengig machen
Abschnitt betitelt „US-020: Aenderung rueckgaengig machen“Als Kunde moechte ich eine fruehere Version eines Inhalts wiederherstellen damit ich versehentliche Aenderungen korrigieren kann.
Akzeptanzkriterien:
- Pro Platzhalter: Liste der letzten X Versionen mit Zeitstempel
- Vorschau des alten Werts
- “Wiederherstellen”-Button setzt den alten Wert
- Wiederherstellung wird im Audit-Log protokolliert
Prioritaet: Should
M5 — Kontaktformular + Kommunikation
Abschnitt betitelt „M5 — Kontaktformular + Kommunikation“Epic: Kontaktformular
Abschnitt betitelt „Epic: Kontaktformular“Als Website-Besucher moechte ich den Betrieb ueber ein Formular kontaktieren damit ich eine Anfrage stellen kann ohne eine E-Mail-App oeffnen zu muessen.
US-021: Kontaktformular absenden
Abschnitt betitelt „US-021: Kontaktformular absenden“Als Website-Besucher moechte ich ein Kontaktformular mit meinem Anliegen absenden damit der Betrieb meine Anfrage erhaelt.
Akzeptanzkriterien:
- Formular mit konfigurierbaren Feldern (Name, E-Mail, Nachricht + Custom-Felder)
- Cloudflare Turnstile Spam-Schutz
- Absenden geht an Pages Function → API Gateway → SQS
- Bestaetigung fuer den Absender (“Nachricht wurde gesendet”)
- Kein Tracking, DSGVO-konform
- Hinweis auf Datenschutzerklaerung unter dem Formular
Prioritaet: Must
US-022: Kontaktanfragen im CMS einsehen
Abschnitt betitelt „US-022: Kontaktanfragen im CMS einsehen“Als Kunde moechte ich eingehende Kontaktanfragen in meinem CMS-Dashboard sehen damit ich schnell auf Anfragen reagieren kann.
Akzeptanzkriterien:
- Liste aller Anfragen: Datum, Name, E-Mail, Nachricht (gekuerzt)
- Detail-Ansicht pro Anfrage
- Status: Neu / Gelesen
- Nur Anfragen des eigenen Tenants sichtbar
Prioritaet: Must
US-023: E-Mail-Benachrichtigung bei Kontaktanfrage
Abschnitt betitelt „US-023: E-Mail-Benachrichtigung bei Kontaktanfrage“Als Kunde moechte ich per E-Mail benachrichtigt werden wenn eine Kontaktanfrage eingeht damit ich zeitnah reagieren kann.
Akzeptanzkriterien:
- CMS sendet E-Mail via SES an Kunden-E-Mail
- E-Mail enthaelt: Name, E-Mail, Nachricht des Absenders
- Absender-Domain ist die Kundendomain (z.B. noreply@kunde.de)
- Link zum CMS-Dashboard in der E-Mail
Prioritaet: Must
US-024: Kontaktformular-Felder konfigurieren
Abschnitt betitelt „US-024: Kontaktformular-Felder konfigurieren“Als Betreiber moechte ich die Felder des Kontaktformulars pro Kunde konfigurieren damit verschiedene Branchen unterschiedliche Informationen abfragen koennen.
Akzeptanzkriterien:
- Felder hinzufuegen/entfernen: Text, E-Mail, Telefon, Dropdown, Textarea
- Pflichtfeld ja/nein pro Feld
- Reihenfolge per Drag & Drop
- Aenderungen erfordern neuen Build
Prioritaet: Must
US-025: WhatsApp/Telefon-Button
Abschnitt betitelt „US-025: WhatsApp/Telefon-Button“Als Kunde moechte ich einen WhatsApp- und/oder Telefon-Button auf meiner Webseite haben damit Besucher mich direkt kontaktieren koennen.
Akzeptanzkriterien:
- Konfigurierbar im CMS: Telefonnummer, WhatsApp-Nummer (optional)
- Sticky-Button auf der Webseite (Mobile-optimiert)
- WhatsApp oeffnet Chat mit vordefinierter Nachricht (optional)
Prioritaet: Should