Alle 22 automatischen Mails gehen jetzt als HTML nach den Vorlagen aus
server/mail-templates raus, dazu eine aus dem HTML erzeugte Textfassung
(multipart/alternative). Werte werden HTML-sicher eingesetzt, optionale
Blöcke (WENN/ENDE) je nach Fall ein- oder ausgeblendet.
- Neu: services/mailTemplates.js (Vorlagen lesen, Platzhalter, Blöcke,
Textfassung); mailer.js nimmt { template, values, blocks }.
- K11 "Passwort geändert" war nicht im Design-Export: aus den Bausteinen
von K02 zusammengesetzt.
- T09 (Widerruf, intern): Fälle "kein Abo gefunden" und "Stripe-Kündigung
fehlgeschlagen" ergänzt; bisher stand dort immer "auf Kündigung gesetzt".
- Einheitlich: Datum TT.MM.JJJJ, Beträge deutsch (T04 "50,00 €"),
"WEBklar" statt "Webklar", Anrede mit Kundennamen, Team-Absender
"WEBklar Kundenportal", Betreff T05 "Kündigung (Stripe)".
- Logo für die Mails: public/webklar-logo.png (192 px, aus dem Design-SVG).
Tests: 52 neue (jede Vorlage: Kopf, Platzhalter, Blöcke, Rendern,
Escaping, Textfassung), npm test 97/97 auf Node 20.19.5; alle 40 Auslöser
einmal durch den Server geschickt (Appwrite-Mock, Stripe-Double,
SMTP-Falle mit STARTTLS).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
80 lines
2.4 KiB
Markdown
80 lines
2.4 KiB
Markdown
# 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
|
||
|
||
```bash
|
||
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](./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_TOKEN` in `.env`
|
||
- Vorschau: `https://<subdomain>.project.webklar.com`
|
||
|
||
`customerId` wird **im Ticketsystem** am `websiteProjects`-Eintrag gesetzt, nicht im Webhook.
|
||
|
||
## E-Mails
|
||
|
||
Alle automatischen Mails sind HTML-Vorlagen mit Textfassung in `server/mail-templates/`
|
||
(K01–K11 an Kunden, T01–T11 ans Team; Design aus Claude Design). Jede Vorlage nennt im
|
||
Kopfkommentar Betreff, Platzhalter (`{{name}}`) und optionale Blöcke
|
||
(`<!-- WENN x --> … <!-- ENDE x -->`). Eine neue Fassung aus dem Design kann die Datei direkt
|
||
ersetzen, solange Platzhalter und Blöcke gleich heißen; `npm test` prüft das. Das Logo in den
|
||
Mails liegt unter `public/webklar-logo.png`.
|
||
|
||
## Deployment
|
||
|
||
```bash
|
||
npm start
|
||
# Reverse Proxy (nginx) → Port 3000
|
||
# PREVIEW_DEPLOY_ROOT für statische Vorschau-Dateien
|
||
```
|
||
|
||
## Repositories
|
||
|
||
- Portal: https://git.webklar.com/knso/Webklar-Kundenbereich.git
|
||
- Template: https://git.webklar.com/knso/webklar-preview-template.git
|