
sysopsandClaude Sonnet 4.6
b6856af2eb
feat(PROJ-32): Message-ID-basierte Duplikatserkennung
- message_id Spalte + UNIQUE-Index in emails-Tabelle
- Save() prüft Message-ID vor SHA-256-Flow (kein Disk-I/O bei Duplikat)
- lookupByMessageID() als private Hilfsfunktion
- insertMeta() schreibt message_id, gibt error zurück (Race-safe)
- SaveMeta() schreibt message_id idempotent (Backfill)
feat(PROJ-34): Retention-Policy + Löschsperre (GoBD)
- retain_until TIMESTAMPTZ Spalte in emails-Tabelle
- ErrRetentionLock typed error
- Delete() prüft Retention-Frist vor Löschung
- Purge() löscht alle Mails mit abgelaufener Retention
- POST /api/admin/purge Endpunkt (superadmin only)
- config: storage.retention_days
fix: Superadmin-Benutzerübersicht zeigt Mandant-Spalte
- UsersTab: Mandant-Spalte wenn isSuperAdmin
- domain_auditor Rolle im Create-Dialog ergänzt
- storage Modulversion → 1.6
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 01:29:25 +02:00
..
2026-03-31 01:29:25 +02:00
2026-03-14 11:43:19 +01:00
2026-03-20 01:47:48 +01:00
2026-03-20 00:49:37 +01:00
2026-03-20 00:32:25 +01:00
2026-03-18 08:32:30 +01:00
2026-03-18 11:47:10 +01:00
2026-03-20 14:50:20 +01:00
2026-03-18 00:19:00 +01:00
2026-03-17 21:03:40 +01:00
2026-03-18 00:05:47 +01:00
2026-03-31 01:29:25 +02:00
2026-03-20 03:15:34 +01:00
2026-03-31 01:09:19 +02:00