Kontaktseite mit Formular ohne Tracking (MAIN-15) #6
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "agent/full-stack-web-engineer/a806c7fe31da"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Kontaktseite
/kontaktmit eigenem Formular, ohne Drittdienste und ohne Tracking. Löst MAIN-15.Was ist drin
/kontakt(vorgerendert): Formular mitUiWindow,UiFieldundUiButtonaus dem Design-System, dazu direkte Kontaktdaten und das Antwortversprechen «meistens innerhalb von 24 Stunden» (aus dem Inventar MAIN-5).POST /api/contact: eigener Nitro-Endpoint. Der Server prüft alle Felder und versendet per SMTP (nodemailer). Reply-To ist die anfragende Person. Anfragen werden nicht gespeichert, Logs enthalten keine Formularinhalte.GET /api/contact/token, mindestens 3 s, höchstens 2 h) und ein Rate-Limit von 5 Anfragen pro IP in 10 Minuten. Bots bekommen beim Honeypot und bei zu schnellem Absenden ein stilles «ok». Es gibt kein Captcha.aria-invalidundaria-describedby) und als Zusammenfassung mitrole="alert". Nach einem Fehler springt der Fokus ins erste ungültige Feld. Browser und Server nutzen dieselbe Prüflogik. Bei 429, 502 und 503 nennt die Meldung die E-Mail-Adresse als Ausweichweg. Fehlercodes stehen indocs/kontaktformular.md.npm testprüft Validierung, Token, Rate-Limit und Mail-Aufbau und versendet per SMTP an einen Test-Empfänger.npm run test:e2estartet den gebauten Server und prüft: Die Testanfrage kommt an, Honeypot und Zeitprüfung greifen, Fehlermeldungen kommen an, das Rate-Limit wirkt, und/kontaktenthält keine externen URLs.⚠️ Deployment-Änderung
Bisher war die Seite rein statisch (
nuxt generate). Das Formular braucht jetzt einen Node-Prozess. Alle Seiten bleiben vorgerendert, nur/api/contact*läuft im Server.npm run build, Start:node .output/server/index.mjs(Node ≥ 20.19)nuxt buildstattnuxt generateund lädt.outputals Artefakt hoch.npm run generategibt es noch. Damit funktioniert das Formular aber nicht (es gibt dann keinen Endpoint). Für MAIN-18 (Deployment) wichtig.Konfiguration (neu)
Umgebungsvariablen
NUXT_CONTACT_*, siehe.env.example. Pflicht sind SMTP-Host,TOundFROM. Für ProduktionNUXT_CONTACT_SECRETsetzen.NUXT_CONTACT_TRUST_PROXY=truenur hinter einem Reverse-Proxy. Ohne SMTP-Konfiguration antwortet der Endpoint mit 503 und nennt die E-Mail-Adresse.Testen
Manuell:
.envaus.env.examplemit einem echten SMTP-Zugang anlegen,npm run dev, dann http://localhost:3000/kontakt öffnen.Lokal geprüft: Lint, Typecheck, 23 Unit-/Integrationstests und 5 E2E-Tests sind grün. Im Client-Bundle ist kein Server-Code (nodemailer und crypto).
Grenzen
/kontaktbei Handy- und Desktop-Breite, im Dunkelmodus und in diesen Zuständen ansehen: leer, Fehler, «Wird gesendet …», Erfolg.🤖 Generated with Claude Code