From 44033973408193b716e9cc6c9d930058776b196c Mon Sep 17 00:00:00 2001 From: Nafies Luthfi Date: Sun, 20 Dec 2020 00:26:57 +0800 Subject: [PATCH] Prevent existing replacement user couples from deletion --- app/Http/Controllers/UsersController.php | 48 +++++++++++++++++++++++++++----- tests/Feature/UsersDeletionTest.php | 41 +++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 7 deletions(-) diff --git a/app/Http/Controllers/UsersController.php b/app/Http/Controllers/UsersController.php index 5f76f13..5043e0c 100644 --- a/app/Http/Controllers/UsersController.php +++ b/app/Http/Controllers/UsersController.php @@ -148,6 +148,7 @@ class UsersController extends Controller DB::beginTransaction(); $this->replaceUserOnUsersTable($user->id, $attributes['replacement_user_id']); + $this->removeDuplicatedCouples($user->id, $attributes['replacement_user_id']); $this->replaceUserOnCouplesTable($user->id, $attributes['replacement_user_id']); $user->delete(); DB::commit(); @@ -215,13 +216,6 @@ class UsersController extends Controller */ private function replaceUserOnCouplesTable($oldUserId, $replacementUserId) { - $replacementUserCouples = Couple::where('husband_id', $replacementUserId) - ->orWhere('wife_id', $replacementUserId) - ->orWhere('manager_id', $replacementUserId) - ->get(); - if (!$replacementUserCouples->isEmpty()) { - $replacementUserCouples->each->delete(); - } DB::table('couples')->where('husband_id', $oldUserId)->update([ 'husband_id' => $replacementUserId, ]); @@ -233,6 +227,46 @@ class UsersController extends Controller ]); } + private function removeDuplicatedCouples($oldUserId, $replacementUserId) + { + $oldUser = User::find($oldUserId); + $replacementUser = User::find($replacementUserId); + + if ($replacementUser->gender_id == 1) { + $replacementUserCouples = Couple::where('husband_id', $replacementUserId)->get(); + } else { + $replacementUserCouples = Couple::where('wife_id', $replacementUserId)->get(); + } + if ($oldUser->gender_id == 1) { + $oldUserCouples = Couple::where('husband_id', $oldUserId)->get(); + } else { + $oldUserCouples = Couple::where('wife_id', $oldUserId)->get(); + } + + $couplesArray = []; + foreach ($replacementUserCouples as $replacementUserCouple) { + $couplesArray[$replacementUserCouple->id] = $replacementUserCouple->husband_id.'_'.$replacementUserCouple->wife_id; + } + foreach ($oldUserCouples as $oldUserCouple) { + $couplesArray[$oldUserCouple->id] = $oldUserCouple->husband_id.'_'.$oldUserCouple->wife_id; + } + $couplesArray = collect($couplesArray); + $deletableCouples = []; + if ($oldUser->gender_id == 1) { + foreach ($oldUserCouples as $oldUserCouple) { + $deletableCouples[] = $couplesArray->search($replacementUserId.'_'.$oldUserCouple->wife_id); + } + } else { + foreach ($oldUserCouples as $oldUserCouple) { + $deletableCouples[] = $couplesArray->search($oldUserCouple->husband_id.'_'.$replacementUserId); + } + } + + if ($deletableCouples) { + Couple::whereIn('id', $deletableCouples)->delete(); + } + } + /** * Get User list based on gender. * diff --git a/tests/Feature/UsersDeletionTest.php b/tests/Feature/UsersDeletionTest.php index bc7b591..57f9344 100644 --- a/tests/Feature/UsersDeletionTest.php +++ b/tests/Feature/UsersDeletionTest.php @@ -287,4 +287,45 @@ class UsersDeletionTest extends TestCase 'wife_id' => $singleWife->id, ]); } + + /** @test */ + public function bugfix_handle_duplicated_couple_on_user_deletion_with_different_marriages() + { + $manager = $this->loginAsUser(); + $oldUserWife = factory(User::class)->states('female')->create(['manager_id' => $manager->id]); + $replacementUserWife = factory(User::class)->states('female')->create(['manager_id' => $manager->id]); + $oldUser = factory(User::class)->states('male')->create(['manager_id' => $manager->id]); + $replacementUser = factory(User::class)->states('male')->create(['manager_id' => $manager->id]); + $oldUserCouple = factory(Couple::class)->create([ + 'husband_id' => $oldUser->id, + 'wife_id' => $oldUserWife->id, + ]); + $newUserCouple = factory(Couple::class)->create([ + 'husband_id' => $replacementUser->id, + 'wife_id' => $replacementUserWife->id, + ]); + + $this->visit(route('users.edit', [$oldUser, 'action' => 'delete'])); + $this->see(__('user.replace_delete_text')); + + $this->submitForm(__('user.replace_delete_button'), [ + 'replacement_user_id' => $replacementUser->id, + ]); + + $this->dontSeeInDatabase('users', ['id' => $oldUser->id]); + + $this->dontSeeInDatabase('couples', ['husband_id' => $oldUser->id]); + + $this->seeInDatabase('couples', [ + 'id' => $oldUserCouple->id, + 'husband_id' => $replacementUser->id, + 'wife_id' => $oldUserWife->id, + ]); + + $this->seeInDatabase('couples', [ + 'id' => $newUserCouple->id, + 'husband_id' => $replacementUser->id, + 'wife_id' => $replacementUserWife->id, + ]); + } }