mirror of
https://github.com/complexcaresolutions/cms.c2sgmbh.git
synced 2026-03-17 22:04:10 +00:00
docs: update CLAUDE.md and TODO.md with recent features
- Add E-Mail system documentation (tenant-specific SMTP, API endpoint) - Add Redis caching section - Add complete Collections and Globals overview - Update project structure with new directories - Mark Portfolio collections and Email system as completed - Update environment variables documentation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
19fcb4d837
commit
966af755b4
2 changed files with 151 additions and 19 deletions
128
CLAUDE.md
128
CLAUDE.md
|
|
@ -38,10 +38,25 @@ Internet → 37.24.237.181 → Caddy (443) → Payload (3000)
|
|||
/home/payload/payload-cms/ # Projektroot
|
||||
├── src/
|
||||
│ ├── payload.config.ts # Haupt-Konfiguration
|
||||
│ └── collections/
|
||||
│ ├── Users.ts
|
||||
│ ├── Media.ts
|
||||
│ └── Tenants.ts
|
||||
│ ├── collections/ # Alle Collections
|
||||
│ │ ├── Users.ts
|
||||
│ │ ├── Media.ts
|
||||
│ │ ├── Tenants.ts
|
||||
│ │ ├── Posts.ts
|
||||
│ │ ├── Categories.ts
|
||||
│ │ ├── Portfolios.ts
|
||||
│ │ ├── PortfolioCategories.ts
|
||||
│ │ ├── EmailLogs.ts
|
||||
│ │ └── ...
|
||||
│ ├── lib/
|
||||
│ │ ├── email/ # E-Mail-System
|
||||
│ │ │ ├── tenant-email-service.ts
|
||||
│ │ │ └── payload-email-adapter.ts
|
||||
│ │ ├── search.ts # Volltextsuche
|
||||
│ │ └── redis.ts # Redis Cache Client
|
||||
│ └── hooks/ # Collection Hooks
|
||||
│ ├── sendFormNotification.ts
|
||||
│ └── invalidateEmailCache.ts
|
||||
├── .env # Umgebungsvariablen
|
||||
├── ecosystem.config.cjs # PM2 Config
|
||||
└── .next/ # Build Output
|
||||
|
|
@ -56,6 +71,18 @@ PAYLOAD_PUBLIC_SERVER_URL=https://pl.c2sgmbh.de
|
|||
NEXT_PUBLIC_SERVER_URL=https://pl.c2sgmbh.de
|
||||
NODE_ENV=production
|
||||
PORT=3000
|
||||
|
||||
# E-Mail (Global Fallback)
|
||||
SMTP_HOST=smtp.example.com
|
||||
SMTP_PORT=587
|
||||
SMTP_SECURE=false
|
||||
SMTP_USER=user@example.com
|
||||
SMTP_PASS=secret
|
||||
SMTP_FROM_ADDRESS=noreply@c2sgmbh.de
|
||||
SMTP_FROM_NAME=Payload CMS
|
||||
|
||||
# Redis Cache
|
||||
REDIS_URL=redis://localhost:6379
|
||||
```
|
||||
|
||||
## Multi-Tenant Plugin
|
||||
|
|
@ -145,15 +172,102 @@ PGPASSWORD=Finden55 psql -h 10.10.181.101 -U payload -d payload_db -c "\dt *_loc
|
|||
|
||||
- **Admin Panel:** https://pl.c2sgmbh.de/admin
|
||||
- **API:** https://pl.c2sgmbh.de/api
|
||||
- **E-Mail API:** https://pl.c2sgmbh.de/api/send-email (POST, Auth erforderlich)
|
||||
|
||||
## E-Mail-System
|
||||
|
||||
Multi-Tenant E-Mail-System mit tenant-spezifischer SMTP-Konfiguration:
|
||||
|
||||
**Architektur:**
|
||||
- Globaler SMTP als Fallback (via .env)
|
||||
- Tenant-spezifische SMTP in Tenants Collection
|
||||
- Transporter-Caching mit automatischer Invalidierung
|
||||
- EmailLogs Collection für Audit-Trail
|
||||
|
||||
**Tenant E-Mail-Konfiguration:**
|
||||
```
|
||||
Tenants → email → fromAddress, fromName, replyTo
|
||||
→ email → useCustomSmtp (Checkbox)
|
||||
→ email → smtp → host, port, secure, user, pass
|
||||
```
|
||||
|
||||
**API-Endpoint `/api/send-email`:**
|
||||
```bash
|
||||
curl -X POST https://pl.c2sgmbh.de/api/send-email \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Cookie: payload-token=..." \
|
||||
-d '{
|
||||
"to": "empfaenger@example.com",
|
||||
"subject": "Betreff",
|
||||
"html": "<p>Inhalt</p>",
|
||||
"tenantId": 1
|
||||
}'
|
||||
```
|
||||
|
||||
**Sicherheit:**
|
||||
- Authentifizierung erforderlich
|
||||
- Tenant-Zugriffskontrolle (User muss Tenant-Mitglied sein)
|
||||
- Rate-Limiting: 10 E-Mails/Minute pro User
|
||||
- SMTP-Passwort nie in API-Responses
|
||||
|
||||
## Redis Caching
|
||||
|
||||
Redis wird für API-Response-Caching und E-Mail-Transporter-Caching verwendet:
|
||||
|
||||
```typescript
|
||||
import { redis } from '@/lib/redis'
|
||||
|
||||
// Cache setzen (TTL in Sekunden)
|
||||
await redis.set('key', JSON.stringify(data), 'EX', 60)
|
||||
|
||||
// Cache lesen
|
||||
const cached = await redis.get('key')
|
||||
|
||||
// Pattern-basierte Invalidierung
|
||||
await redis.keys('posts:*').then(keys => keys.length && redis.del(...keys))
|
||||
```
|
||||
|
||||
## Datenbank-Direktzugriff
|
||||
|
||||
````bash
|
||||
```bash
|
||||
PGPASSWORD=Finden55 psql -h 10.10.181.101 -U payload -d payload_db
|
||||
|
||||
# Nützliche Queries
|
||||
SELECT * FROM tenants;
|
||||
SELECT * FROM users_tenants;
|
||||
SELECT * FROM email_logs ORDER BY created_at DESC LIMIT 10;
|
||||
\dt -- Alle Tabellen
|
||||
```All
|
||||
````
|
||||
```
|
||||
|
||||
## Collections Übersicht
|
||||
|
||||
| Collection | Slug | Beschreibung |
|
||||
|------------|------|--------------|
|
||||
| Users | users | Benutzer mit isSuperAdmin Flag |
|
||||
| Tenants | tenants | Mandanten mit E-Mail-Konfiguration |
|
||||
| Media | media | Medien mit 11 responsive Image Sizes |
|
||||
| Pages | pages | Seiten mit Blocks |
|
||||
| Posts | posts | Blog/News/Presse mit Kategorien |
|
||||
| Categories | categories | Kategorien für Posts |
|
||||
| Portfolios | portfolios | Portfolio-Galerien (Fotografie) |
|
||||
| PortfolioCategories | portfolio-categories | Kategorien für Portfolios |
|
||||
| Testimonials | testimonials | Kundenbewertungen |
|
||||
| NewsletterSubscribers | newsletter-subscribers | Newsletter mit Double Opt-In |
|
||||
| SocialLinks | social-links | Social Media Links |
|
||||
| Forms | forms | Formular-Builder |
|
||||
| FormSubmissions | form-submissions | Formular-Einsendungen |
|
||||
| EmailLogs | email-logs | E-Mail-Protokollierung |
|
||||
| CookieConfigurations | cookie-configurations | Cookie-Banner Konfiguration |
|
||||
| CookieInventory | cookie-inventory | Cookie-Inventar |
|
||||
| ConsentLogs | consent-logs | Consent-Protokollierung |
|
||||
|
||||
## Globals
|
||||
|
||||
| Global | Slug | Beschreibung |
|
||||
|--------|------|--------------|
|
||||
| SiteSettings | site-settings | Allgemeine Website-Einstellungen |
|
||||
| Navigation | navigation | Navigationsmenü |
|
||||
| SEOSettings | seo-settings | SEO-Einstellungen |
|
||||
| PrivacyPolicySettings | privacy-policy-settings | Datenschutz-Einstellungen |
|
||||
|
||||
*Letzte Aktualisierung: 07.12.2025*
|
||||
|
|
|
|||
|
|
@ -86,10 +86,18 @@
|
|||
- DNS-Einträge prüfen
|
||||
- Caddy-Konfiguration für alle Domains
|
||||
|
||||
- [ ] **[!] E-Mail-Adapter einrichten**
|
||||
- SMTP-Konfiguration
|
||||
- Newsletter Double Opt-In E-Mails
|
||||
- Kontaktformular-Benachrichtigungen
|
||||
- [x] **E-Mail-System** (Erledigt: 06.12.2025)
|
||||
- [x] Multi-Tenant Email Adapter für Payload CMS
|
||||
- [x] Tenant-spezifische SMTP-Konfiguration in Tenants Collection
|
||||
- [x] EmailLogs Collection für Protokollierung aller E-Mails
|
||||
- [x] REST-Endpoint `/api/send-email` mit:
|
||||
- [x] Authentifizierung & Tenant-Zugriffskontrolle
|
||||
- [x] Rate-Limiting (10 E-Mails/Minute pro User)
|
||||
- [x] Form-Submission Notifications
|
||||
- [x] Cache-Invalidierung bei Config-Änderungen
|
||||
- [x] SMTP-Passwort-Schutz (nie in API-Responses)
|
||||
- [ ] SMTP-Credentials in `.env` konfigurieren (TODO)
|
||||
- [ ] Newsletter Double Opt-In E-Mails (TODO)
|
||||
|
||||
- [ ] **[!] Frontend-Komponenten entwickeln**
|
||||
- React/Next.js Komponenten für alle Blocks
|
||||
|
|
@ -162,10 +170,11 @@
|
|||
- [ ] Google Ads API Credentials in Backend .env
|
||||
- Dokumentation: `docs/anleitungen/ANALYTICS_IMPLEMENTATION_GUIDE.md`
|
||||
|
||||
- [ ] **Caching-Strategie**
|
||||
- Redis-Cache für API
|
||||
- CDN-Integration (Cloudflare)
|
||||
- Invalidierung bei Updates
|
||||
- [x] **Redis Caching** (Erledigt: 05.12.2025)
|
||||
- [x] Redis-Cache für API-Responses
|
||||
- [x] TTL-basierte Invalidierung
|
||||
- [x] Pattern-basierte Cache-Invalidierung
|
||||
- [ ] CDN-Integration (Cloudflare) (TODO)
|
||||
|
||||
- [~] **Backup-System**
|
||||
- [x] Manuelle Datenbank-Backups (pg_dump)
|
||||
|
|
@ -195,9 +204,18 @@
|
|||
- [ ] Leistungs-Übersicht
|
||||
- [ ] Karriere-Seite mit Stellenangeboten
|
||||
|
||||
### gunshin.de
|
||||
- [ ] Portfolio-Collection
|
||||
- [ ] Projekt-Galerie
|
||||
### gunshin.de / Fotografin-Portfolio
|
||||
- [x] Portfolio-Categories Collection (Erledigt: 06.12.2025)
|
||||
- [x] Name, Slug, Beschreibung (lokalisiert)
|
||||
- [x] Cover-Bild, Reihenfolge, Aktiv-Status
|
||||
- [x] Portfolios Collection (Erledigt: 06.12.2025)
|
||||
- [x] Titel, Beschreibung, Excerpt (lokalisiert)
|
||||
- [x] Kategorie-Beziehung
|
||||
- [x] Cover-Bild + Galerie-Bilder mit Captions
|
||||
- [x] Projekt-Details (Kunde, Ort, Datum, Ausrüstung)
|
||||
- [x] Status (draft/published/archived)
|
||||
- [x] isFeatured, SEO-Felder
|
||||
- [ ] Projekt-Galerie Frontend
|
||||
- [ ] Referenzen-Slider
|
||||
|
||||
### zweitmein.ng
|
||||
|
|
@ -281,4 +299,4 @@
|
|||
|
||||
---
|
||||
|
||||
*Letzte Aktualisierung: 05.12.2025 (Git & GitHub Setup, isSuperAdmin Feld, Techstack-Dokumentation)*
|
||||
*Letzte Aktualisierung: 07.12.2025 (E-Mail-System, Portfolio-Collections, Redis Caching)*
|
||||
|
|
|
|||
Loading…
Reference in a new issue