Stressfrei-Adressen: Duplikate beim Anlegen ablehnen

Bug: dieselbe E-Mail-Adresse konnte beim selben Kunden mehrfach
angelegt werden – im Screenshot zwei identische Einträge nach
einem Doppel-Submit.

- createEmail: findFirst auf (customerId, email) case-insensitive,
  bei Treffer ApiError(409). Eigene Meldung für inaktive
  Duplikate (Hinweis: alten Eintrag reaktivieren statt neu anlegen).
- updateEmail: gleicher Check beim Umbenennen, NOT id-Exclude.
- Controller: catch-Blöcke honorieren ApiError.statusCode (vorher
  pauschal 400) → 409 kommt sauber an die UI durch.
- Frontend: updateMutation bekam onError, damit der Fehler nicht
  schlucken bleibt.
This commit is contained in:
2026-06-18 14:01:35 +02:00
parent 246999be01
commit 8992bb7a5d
4 changed files with 70 additions and 2 deletions
+14
View File
@@ -97,6 +97,20 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
## ✅ Erledigt
- [x] **🐞 Stressfrei-Adressen: doppelte E-Mails beim Anlegen erlaubt**
- Bug: User konnte dieselbe Adresse zweimal beim selben Kunden
anlegen (siehe Screenshot mit 2× `max.mustermann@...`). `createEmail`
hatte keinen Duplikatscheck, `updateEmail` ebenfalls nicht.
- Service: Vor `prisma.create` jetzt `findFirst` auf
`(customerId, email)` (case-insensitive). Bei Treffer → `ApiError(409)`.
Unterschiedliche Meldung für aktive vs. inaktive Duplikate
(Hinweis bei inaktiv: alten Eintrag reaktivieren statt neu anlegen).
- `updateEmail`: gleicher Check beim Umbenennen, mit `NOT id`-Exclude.
- Controller: `catch`-Blöcke honorieren jetzt den `ApiError.statusCode`
(vorher pauschal 400) → 409 kommt sauber durch.
- Frontend: `updateMutation` bekam ein `onError`, damit der 409 nicht
nur ins Leere lief.
- [x] **🔒 Pentest 71.171.4: Härtung der Zusatz-Weiterleitungen**
- **71.1 MEDIUM:** Reservierte/private TLDs (`local`, `internal`,
`corp`, `lan`, `home`, `private`, `invalid`, `test`, `localhost`,