From 3e3735098ce6a130a456cf1cc92786ea7e8f08e8 Mon Sep 17 00:00:00 2001 From: mahdi purHosseini Date: Thu, 7 Mar 2024 13:16:52 +0330 Subject: [PATCH] fix deleting --- .../Controllers/MedicalCenterController.php | 129 ++++++++++++++---- app/Http/Controllers/UserController.php | 71 +++++++++- app/Policies/MedicalCenterPolicy.php | 4 +- app/Policies/UserPolicy.php | 4 +- 4 files changed, 173 insertions(+), 35 deletions(-) diff --git a/app/Http/Controllers/MedicalCenterController.php b/app/Http/Controllers/MedicalCenterController.php index aa60d3a2..07a3b64c 100644 --- a/app/Http/Controllers/MedicalCenterController.php +++ b/app/Http/Controllers/MedicalCenterController.php @@ -2,23 +2,26 @@ namespace App\Http\Controllers; +use App\InputValue; use Illuminate\Http\Request; use App\MedicalCenter; use App\User; use App\City; use App\Http\Requests\StoreMedicalCenterRequest; +use Illuminate\Support\Facades\DB; +use Packages\Messaging\src\Facades\MessageResponse; class MedicalCenterController extends Controller { - public function index(Request $request) + public function index( Request $request ) { - if (!auth('api')->user()->can('list', MedicalCenter::class)) { - return \MessageResponse::error(trans('messages.access_denied')); + if ( ! auth( 'api' )->user()->can( 'list' , MedicalCenter::class ) ) { + return MessageResponse::error( trans( 'messages.access_denied' ) ); } - $MedicalCenters = MedicalCenter::when($request->has('name') && $request->name, function($query) use($request){ - $query->where('name', 'LIKE', '%'.$request->name.'%'); - })->withCount('users')->paginate(10); - return \MessageResponse::data($MedicalCenters); + $MedicalCenters = MedicalCenter::when( $request->has( 'name' ) && $request->name , function ( $query ) use ( $request ) { + $query->where( 'name' , 'LIKE' , '%' . $request->name . '%' ); + } )->withCount( 'users' )->paginate( 10 ); + return MessageResponse::data( $MedicalCenters ); } public function create() @@ -26,46 +29,116 @@ class MedicalCenterController extends Controller // } - public function store(StoreMedicalCenterRequest $request) + public function store( StoreMedicalCenterRequest $request ) { - MedicalCenter::create($request->all()); - return \MessageResponse::success(trans('messages.success')); + MedicalCenter::create( $request->all() ); + return MessageResponse::success( trans( 'messages.success' ) ); } - public function show($id) + public function show( $id ) { // $MedicalCenter = MedicalCenter::with('users')->findOrFail($id); // return response()->json(['MedicalCenter' => $MedicalCenter]); } - public function edit(MedicalCenter $MedicalCenter) + public function edit( MedicalCenter $MedicalCenter ) { - $MedicalCenter->load('users'); - return \MessageResponse::data($MedicalCenter); + $MedicalCenter->load( 'users' ); + return MessageResponse::data( $MedicalCenter ); } - public function update(StoreMedicalCenterRequest $request, MedicalCenter $MedicalCenter) + public function update( StoreMedicalCenterRequest $request , MedicalCenter $MedicalCenter ) { - $MedicalCenter->update($request->all()); - return \MessageResponse::success(trans('messages.success')); + $MedicalCenter->update( $request->all() ); + return MessageResponse::success( trans( 'messages.success' ) ); } - public function destroy(MedicalCenter $MedicalCenter) + public function destroy( MedicalCenter $MedicalCenter ) { - if (!auth('api')->user()->can('delete', $MedicalCenter)) { - return \MessageResponse::error(trans('messages.access_denied')); + if ( ! auth( 'api' )->user()->can( 'delete' , $MedicalCenter ) ) { + return MessageResponse::error( trans( 'messages.access_denied' ) ); + } + try { + DB::beginTransaction(); + + foreach ( $MedicalCenter->users as $user ) { + + // delete test_results + foreach ( $user->test_results as $test_result ) { + if ( count( $test_result->input_values ) ) { + InputValue::where( 'test_result_id' , $test_result->id )->get()->each->delete(); + } + $test_result->delete(); + } + + // delete test_types + foreach ( $user->test_types as $test_type ) { + $UniqueID = substr( base_convert( sha1( uniqid( mt_rand() ) ) , 16 , 36 ) , 0 , 10 ); + $test_type->unique_code = $test_type->unique_code . '--' . $UniqueID; + $test_type->save(); + $test_type->delete(); + } + + // delete items + foreach ( $user->items as $item ) { + $item->transfersAll()->delete(); + $item->delete(); + } + + // delete packages + foreach ( $user->packages as $package ) { + if ( count( $package->items ) ) { + foreach ( $package->items as $item ) { + $item->update( [ + "package_id" => null + ] ); + } + } + if ( count( $package->labels ) ) { + $package->labels()->delete(); + } + $package->transfersAll()->delete(); + $package->delete(); + } + + // delete labels + foreach ( $user->labels as $label ) { + if ( count( $label->cycles ) ) { + $label->cycles()->detach(); + } + $label->delete(); + } + + // delete cycles + foreach ( $user->cycles as $cycle ) { + if ( count( $cycle->labels ) ) { + $cycle->labels()->detach(); + } + $cycle->delete(); + } + + // delete user + $user->delete(); + } + $MedicalCenter->delete(); + + DB::commit(); + return MessageResponse::success( trans( 'messages.success' ) ); + } catch ( \Exception $exception ) { + DB::rollBack(); + return MessageResponse::error( $exception->getMessage() ); } - $MedicalCenter->delete(); - return \MessageResponse::success(trans('messages.success')); } - public function listMedicalCenters(){ - $MedicalCenters = MedicalCenter::select('id','name')->get(); - return \MessageResponse::data($MedicalCenters); + public function listMedicalCenters() + { + $MedicalCenters = MedicalCenter::select( 'id' , 'name' )->get(); + return MessageResponse::data( $MedicalCenters ); } - public function getCities(){ - $Cities = City::whereNull('parent_id')->get(); - return \MessageResponse::data($Cities); + public function getCities() + { + $Cities = City::whereNull( 'parent_id' )->get(); + return MessageResponse::data( $Cities ); } } diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 8115f9c7..c6d3b293 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers; use App\Http\Requests\UpdateInfoUserRequest; +use App\InputValue; use Illuminate\Http\Request; use App\Http\Requests\StoreUserRequest; use App\MedicalCenter; @@ -17,7 +18,7 @@ class UserController extends Controller { $user = auth( 'api' )->user(); - if ( $user->hasRole( 'User' ) or $user->hasRole( 'Supervisor' ) ) { + if ( $user->hasRole( 'User' ) or $user->hasRole( 'Supervisor' ) ) { $medical_center_id = $user->medical_center_id; } elseif ( $request->has( 'medical_center_id' ) && $request->medical_center_id ) { $medical_center_id = $request->medical_center_id; @@ -90,8 +91,72 @@ class UserController extends Controller if ( auth( 'api' )->user()->cant( 'delete' , $User ) ) { return MessageResponse::error( trans( 'messages.access_denied' ) ); } - $User->delete(); - return MessageResponse::success( trans( 'messages.success' ) ); + try { + DB::beginTransaction(); + + // delete test_results + foreach ( $User->test_results as $test_result ) { + if ( count( $test_result->input_values ) ) { + InputValue::where( 'test_result_id' , $test_result->id )->get()->each->delete(); + } + $test_result->delete(); + } + + // delete test_types + foreach ( $User->test_types as $test_type ) { + $UniqueID = substr( base_convert( sha1( uniqid( mt_rand() ) ) , 16 , 36 ) , 0 , 10 ); + $test_type->unique_code = $test_type->unique_code . '--' . $UniqueID; + $test_type->save(); + $test_type->delete(); + } + + // delete items + foreach ( $User->items as $item ) { + $item->transfersAll()->delete(); + $item->delete(); + } + + // delete packages + foreach ( $User->packages as $package ) { + if ( count( $package->items ) ) { + foreach ( $package->items as $item ) { + $item->update( [ + "package_id" => null + ] ); + } + } + if ( count( $package->labels ) ) { + $package->labels()->delete(); + } + $package->transfersAll()->delete(); + $package->delete(); + } + + // delete labels + foreach ( $User->labels as $label ) { + if ( count( $label->cycles ) ) { + $label->cycles()->detach(); + } + $label->delete(); + } + + // delete cycles + foreach ( $User->cycles as $cycle ) { + if ( count( $cycle->labels ) ) { + $cycle->labels()->detach(); + } + $cycle->delete(); + } + + // delete user + $User->delete(); + + DB::commit(); + return MessageResponse::success(trans('messages.success')); + }catch (\Exception $exception){ + DB::rollBack(); + return MessageResponse::error($exception->getMessage()); + } } public function getByMedicalCenter( MedicalCenter $MedicalCenter ) diff --git a/app/Policies/MedicalCenterPolicy.php b/app/Policies/MedicalCenterPolicy.php index 4102a190..1cce54de 100644 --- a/app/Policies/MedicalCenterPolicy.php +++ b/app/Policies/MedicalCenterPolicy.php @@ -12,9 +12,10 @@ class MedicalCenterPolicy if($User->hasRole('Admin')) return true; } + public function delete(User $User, MedicalCenter $MedicalCenter) { - if($User->hasRole('Admin') && $MedicalCenter->users->count() == 0) + if($User->hasRole('Admin')) return true; } @@ -29,6 +30,7 @@ class MedicalCenterPolicy if($User->hasRole('Admin')) return true; } + public function getByMedicalCenter(User $User, MedicalCenter $MedicalCenter) { if($User->hasRole('Admin') || $MedicalCenter->id == $User->medical_center_id) { diff --git a/app/Policies/UserPolicy.php b/app/Policies/UserPolicy.php index a852852e..3aba6457 100644 --- a/app/Policies/UserPolicy.php +++ b/app/Policies/UserPolicy.php @@ -14,9 +14,7 @@ class UserPolicy public function delete(User $User, User $Operator) { - if($User->hasRole('Admin') && $Operator->test_results->count() == 0 && $Operator->test_types->count() == 0 - && $Operator->items->count() == 0 && $Operator->packages->count() == 0 && $Operator->labels->count() == 0 - && $Operator->cycles->count() == 0) + if($User->hasRole('Admin')) return true; }