diff --git a/app/Http/Controllers/UsersController.php b/app/Http/Controllers/UsersController.php index 5043e0c..2b2df4e 100644 --- a/app/Http/Controllers/UsersController.php +++ b/app/Http/Controllers/UsersController.php @@ -4,8 +4,8 @@ namespace App\Http\Controllers; use App\Couple; use App\Http\Requests\Users\UpdateRequest; +use App\Jobs\Users\DeleteAndReplaceUser; use App\User; -use DB; use Illuminate\Http\Request; use Storage; @@ -146,12 +146,7 @@ class UsersController extends Controller 'replacement_user_id.required' => __('validation.user.replacement_user_id.required'), ]); - 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(); + $this->dispatchNow(new DeleteAndReplaceUser($user, $attributes['replacement_user_id'])); return redirect()->route('users.show', $attributes['replacement_user_id']); } @@ -191,83 +186,6 @@ class UsersController extends Controller } /** - * Replace User Ids on users table. - * - * @param string $oldUserId - * @param string $replacementUserId - * @return void - */ - private function replaceUserOnUsersTable($oldUserId, $replacementUserId) - { - foreach (['father_id', 'mother_id', 'manager_id'] as $field) { - DB::table('users')->where($field, $oldUserId)->update([ - $field => $replacementUserId, - ]); - } - } - - /** - * Replace User Ids on couples table. - * - * @param string $oldUserId - * @param string $replacementUserId - * - * @return void - */ - private function replaceUserOnCouplesTable($oldUserId, $replacementUserId) - { - DB::table('couples')->where('husband_id', $oldUserId)->update([ - 'husband_id' => $replacementUserId, - ]); - DB::table('couples')->where('wife_id', $oldUserId)->update([ - 'wife_id' => $replacementUserId, - ]); - DB::table('couples')->where('manager_id', $oldUserId)->update([ - 'manager_id' => $replacementUserId, - ]); - } - - 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. * * @param int $genderId diff --git a/app/Jobs/Users/DeleteAndReplaceUser.php b/app/Jobs/Users/DeleteAndReplaceUser.php new file mode 100644 index 0000000..0f775b6 --- /dev/null +++ b/app/Jobs/Users/DeleteAndReplaceUser.php @@ -0,0 +1,95 @@ +user = $user; + $this->replacementUserId = $replacementUserId; + } + + public function handle() + { + $user = $this->user; + $replacementUserId = $this->replacementUserId; + + DB::beginTransaction(); + $this->replaceUserOnUsersTable($user->id, $replacementUserId); + $this->removeDuplicatedCouples($user->id, $replacementUserId); + $this->replaceUserOnCouplesTable($user->id, $replacementUserId); + $user->delete(); + DB::commit(); + } + + private function replaceUserOnCouplesTable($oldUserId, $replacementUserId) + { + DB::table('couples')->where('husband_id', $oldUserId)->update([ + 'husband_id' => $replacementUserId, + ]); + DB::table('couples')->where('wife_id', $oldUserId)->update([ + 'wife_id' => $replacementUserId, + ]); + DB::table('couples')->where('manager_id', $oldUserId)->update([ + 'manager_id' => $replacementUserId, + ]); + } + + private function removeDuplicatedCouples(string $oldUserId, string $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(); + } + } + + private function replaceUserOnUsersTable(string $oldUserId, string $replacementUserId) + { + foreach (['father_id', 'mother_id', 'manager_id'] as $field) { + DB::table('users')->where($field, $oldUserId)->update([ + $field => $replacementUserId, + ]); + } + } +}