Browse Source

Prevent existing replacement user couples from deletion

pull/65/head
Nafies Luthfi 5 years ago
parent
commit
4403397340
  1. 48
      app/Http/Controllers/UsersController.php
  2. 41
      tests/Feature/UsersDeletionTest.php

48
app/Http/Controllers/UsersController.php

@ -148,6 +148,7 @@ class UsersController extends Controller
DB::beginTransaction(); DB::beginTransaction();
$this->replaceUserOnUsersTable($user->id, $attributes['replacement_user_id']); $this->replaceUserOnUsersTable($user->id, $attributes['replacement_user_id']);
$this->removeDuplicatedCouples($user->id, $attributes['replacement_user_id']);
$this->replaceUserOnCouplesTable($user->id, $attributes['replacement_user_id']); $this->replaceUserOnCouplesTable($user->id, $attributes['replacement_user_id']);
$user->delete(); $user->delete();
DB::commit(); DB::commit();
@ -215,13 +216,6 @@ class UsersController extends Controller
*/ */
private function replaceUserOnCouplesTable($oldUserId, $replacementUserId) 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([ DB::table('couples')->where('husband_id', $oldUserId)->update([
'husband_id' => $replacementUserId, '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. * Get User list based on gender.
* *

41
tests/Feature/UsersDeletionTest.php

@ -287,4 +287,45 @@ class UsersDeletionTest extends TestCase
'wife_id' => $singleWife->id, '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,
]);
}
} }
Loading…
Cancel
Save