From ded133cb1bea5d6375317f8f6d0bbb534a898589 Mon Sep 17 00:00:00 2001 From: Kevin Date: Wed, 23 Sep 2026 15:42:00 +0000 Subject: [PATCH] Geloeschte Berater: Loeschpraefix mit User-ID auch in der User-Bereinigung Log-Analyse 26.08. (P1-3): user:cleanup scheiterte tagelang an derselben E-Mail-Kollision, weil "delete-" beim zweiten Loeschen derselben Adresse doppelt vorkam. UserUtil::buildDeletedEmail() haengt die User-ID an (seit d5ad1ba); die Wiederherstellen-Schaltflaeche entfernt jetzt auch das neue Praefix (stripDeletePrefix) statt nur "delete-". Tests fuer beide Formate. Co-Authored-By: Claude Opus 5.5 (1M context) --- .../AdminUserCleanupController.php | 3 +- tests/Feature/UserDeleteEmailPrefixTest.php | 53 +++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 tests/Feature/UserDeleteEmailPrefixTest.php diff --git a/app/Http/Controllers/AdminUserCleanupController.php b/app/Http/Controllers/AdminUserCleanupController.php index 895dbadf..4c26796c 100644 --- a/app/Http/Controllers/AdminUserCleanupController.php +++ b/app/Http/Controllers/AdminUserCleanupController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers; use App\Models\ShoppingUser; use App\Models\ShoppingUserMemberLog; use App\Models\UserCleanUpLog; +use App\Services\UserUtil; use App\User; use Carbon\Carbon; use Illuminate\Http\Request; @@ -137,7 +138,7 @@ class AdminUserCleanupController extends Controller // Restore-Button für gelöschte User if ($user->pre_deleted_at) { - $html .= ' '; + $html .= ' '; } return $html; diff --git a/tests/Feature/UserDeleteEmailPrefixTest.php b/tests/Feature/UserDeleteEmailPrefixTest.php new file mode 100644 index 00000000..8440ff9e --- /dev/null +++ b/tests/Feature/UserDeleteEmailPrefixTest.php @@ -0,0 +1,53 @@ + $email, + 'password' => bcrypt('secret'), + 'lang' => 'de', + ]); +} + +it('pseudonymises the email with the user id so a second deletion does not collide', function () { + $first = makeDeletableUser('lena.oetjen@googlemail.com'); + UserUtil::deleteUser($first); + + $second = makeDeletableUser('lena.oetjen@googlemail.com'); + UserUtil::deleteUser($second); + + expect($first->fresh()->email)->toBe('delete-'.$first->id.'-lena.oetjen@googlemail.com') + ->and($second->fresh()->email)->toBe('delete-'.$second->id.'-lena.oetjen@googlemail.com'); +}); + +it('restores the original address from both prefix formats', function () { + expect(UserUtil::stripDeletePrefix('delete-1212-lena.oetjen@googlemail.com')) + ->toBe('lena.oetjen@googlemail.com') + ->and(UserUtil::stripDeletePrefix('delete-lena.oetjen@googlemail.com')) + ->toBe('lena.oetjen@googlemail.com') + ->and(UserUtil::stripDeletePrefix('lena.oetjen@googlemail.com')) + ->toBe('lena.oetjen@googlemail.com') + ->and(UserUtil::stripDeletePrefix(null))->toBe(''); +}); + +it('does not double the prefix when a deleted user is deleted again', function () { + $user = makeDeletableUser('doppelt@example.com'); + UserUtil::deleteUser($user); + UserUtil::deleteUser($user->fresh()); + + expect($user->fresh()->email)->toBe('delete-'.$user->id.'-doppelt@example.com'); +}); + +it('keeps the pseudonymised email within the column limit', function () { + $user = makeDeletableUser(str_repeat('a', 240).'@example.com'); + UserUtil::deleteUser($user); + + expect(mb_strlen($user->fresh()->email))->toBeLessThanOrEqual(255); +});