32e441c8bc79420b91bf161efb72a82655bd7219
Bisher sah man nirgends, ob die Angebots-Mail rausging, Fehler landeten nicht im Log, und senden ließ sie sich nur beim Anlegen. - Angebotsliste: Kunden-Adresse unter dem Namen, im Status "E-Mail gesendet <Zeitpunkt>" bzw. "E-Mail nicht verschickt" / "Keine E-Mail-Adresse hinterlegt" - Knopf "E-Mail senden" / "Erneut senden" mit Rückfrage (Adresse, letzter Versand), solange das Angebot offen und gültig ist; bei laufendem Abo, solange die erste rabattierte Abbuchung noch bevorsteht (die Mail nennt sie). POST /api/portal-admin/offers/:id/notify setzt notifiedAt. - Server-Log: "[offers] Angebots-Mail <Ref> vom Mailserver angenommen: <Message-ID> 250 … queued as …" bzw. "… fehlgeschlagen: <Grund>" - Lehnt der Mailserver nur den Kunden ab (die BCC-Kopie ans Team geht trotzdem raus), gilt die Mail als nicht verschickt - sendCustomerMail gibt die nodemailer-Info zurück Tests: npm test (40), Server-Durchlauf gegen Appwrite-Mock, SMTP-Sink und Stripe-Double (28 Prüfungen), Oberfläche (18 Prüfungen). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Webklar Kundenbereich
Kundenportal für Website-Projekte. Liest ausschließlich aus woms-database auf ticket.webklar.com (Ticketsystem). Es gibt keine eigene Portal-Datenbank mehr.
- Keine Kundenanlage im Portal
- Keine Admin-Funktionen
- Login über Appwrite Auth (ein User pro Kunde, verknüpft über
customers.appwriteUserId)
Verwaltung (Kunden, Passwörter, Projekte, Freischaltung): Ticketsystem.
Struktur
server/ Express-API, Appwrite, Gitea-Webhook
public/ Login & Dashboard (statisch)
Schnellstart
cp .env.example .env
# SESSION_SECRET (min. 32 Zeichen) und APPWRITE_API_KEY setzen
npm install
npm run dev
Öffnen: http://localhost:3000
API
| Methode | Pfad | Beschreibung |
|---|---|---|
| POST | /api/auth/login |
Appwrite Login + Portal-Prüfungen |
| POST | /api/auth/logout |
Session beenden |
| GET | /api/auth/me |
Aktueller Kunde |
| GET | /api/projects |
Eigene websiteProjects |
| GET | /api/features |
Eigene portalFeatures (enabled) |
| POST | /webhook/gitea?token=… |
Gitea Push → Deploy + DB-Update |
Appwrite
Schema und Collection-Anlage: siehe APPWRITE_SCHEMA.md.
Endpoint: https://ticket.webklar.com/v1
Project: 6a1058610003c5a13a05
Database: woms-database
Gitea / Preview
- Template: https://git.webklar.com/knso/webklar-preview-template.git
- Webhook-URL:
https://project.webklar.com/webhook/gitea - Secret:
GITEA_WEBHOOK_TOKENin.env - Vorschau:
https://<subdomain>.project.webklar.com
customerId wird im Ticketsystem am websiteProjects-Eintrag gesetzt, nicht im Webhook.
Deployment
npm start
# Reverse Proxy (nginx) → Port 3000
# PREVIEW_DEPLOY_ROOT für statische Vorschau-Dateien
Repositories
Languages
JavaScript
86.2%
HTML
11%
CSS
2.7%