E-Mail-Ansicht: Postfach-Filter in Trash/Sent durchreichen

Bug: Im Vertrags-Tab (Gesendet/Gelöscht) und im Kunden-Haupt-
Postfach (Gelöscht) wurden Mails aus ALLEN Postfächern angezeigt,
unabhängig vom ausgewählten Postfach. Im Vertrag fehlte zusätzlich
der Vertrags-Filter im Papierkorb.

Backend:
- getEmailsForContract akzeptiert accountId → stressfreiEmailId
- getTrashEmails (controller + service) nimmt {accountId, contractId}
- getFolderCountsForContract bekommt optional stressfreiEmailId und
  zusätzlich trash/trashUnread im Result

Frontend:
- API-Client (getForContract/getTrash/getContractFolderCounts) nimmt
  Filter entgegen
- ContractEmailsSection reicht selectedAccountId in alle drei Queries
  + queryKey durch. Trash-Badge kommt jetzt aus contract-scoped
  Counts statt account-globalem stressfreiEmailApi
- EmailClientTab reicht selectedAccountId in die Trash-Query durch

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-06-21 14:06:24 +02:00
parent f02824fe7d
commit 993f2d10f0
6 changed files with 171 additions and 87 deletions
+28
View File
@@ -97,6 +97,34 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
## ✅ Erledigt
- [x] **🐞 E-Mail-Ansicht: Postfach-Filter griff in Trash/Sent nicht**
- Bug-Bericht 2026-06-21: im Vertrags-Tab (Gesendet/Gelöscht) und im
Kunden-Haupt-Postfach (Gelöscht) wurden E-Mails aus ALLEN Postfächern
des Kunden angezeigt, egal welches Postfach im Selector aktiv war.
Im Vertrag fehlte zusätzlich der Vertrags-Filter für den Papierkorb.
- Backend:
- `getEmailsForContract` controller akzeptiert jetzt `accountId`-
Query-Param und reicht ihn als `stressfreiEmailId` an
`getCachedEmails` weiter (der hat den Filter eh schon implementiert,
nur niemand hat ihn aufgerufen).
- `getTrashEmails` (controller + service) akzeptiert `accountId` und
`contractId` als optionale Filter. Default-Verhalten unverändert,
wenn keiner gesetzt ist.
- `getFolderCountsForContract` akzeptiert optional `stressfreiEmailId`,
bekommt zusätzlich `trash` + `trashUnread` ins Result sonst läge
der Trash-Badge im Vertrag wieder account-global, während die Liste
contract-scoped ist.
- Frontend:
- `cachedEmailApi.getForContract` / `getTrash` / `getContractFolderCounts`
nehmen den Filter entgegen.
- `ContractEmailsSection` reicht `selectedAccountId` in alle drei
Queries durch und nimmt es in den queryKey mit auf sonst greift
der React-Query-Cache beim Postfach-Wechsel nicht. Der Trash-Badge
kommt jetzt aus den contract-scoped Counts, damit Badge und Liste
synchron laufen.
- `EmailClientTab` reicht `selectedAccountId` in die Trash-Query
durch (Inbox/Sent waren schon korrekt).
- [x] **🔒 Pentest R89 Provider-Adressfelder härten**
- R89.1 (MEDIUM): `sanitizeNotes(…, 500)` macht silent `slice(0, 500)`
statt 400 501+ Zeichen wurden auf 500 abgeschnitten und mit