diff --git a/app/Actions/Assets/DestroyAssetAction.php b/app/Actions/Assets/DestroyAssetAction.php index 46b5f20c0b..095f703e62 100644 --- a/app/Actions/Assets/DestroyAssetAction.php +++ b/app/Actions/Assets/DestroyAssetAction.php @@ -2,11 +2,37 @@ namespace App\Actions\Assets; +use App\Events\CheckoutableCheckedIn; +use App\Models\Asset; +use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Log; +use Illuminate\Support\Facades\Storage; + class DestroyAssetAction { - public static function run() + public static function run(Asset $asset) { + if ($asset->assignedTo) { + $target = $asset->assignedTo; + $checkin_at = date('Y-m-d H:i:s'); + $originalValues = $asset->getRawOriginal(); + event(new CheckoutableCheckedIn($asset, $target, auth()->user(), 'Checkin on delete', $checkin_at, $originalValues)); + DB::table('assets') + ->where('id', $asset->id) + ->update(['assigned_to' => null]); + } + + + if ($asset->image) { + try { + Storage::disk('public')->delete('assets'.'/'.$asset->image); + } catch (\Exception $e) { + Log::debug($e); + } + } + + $asset->delete(); } } \ No newline at end of file diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 2b8eaa3627..4b98391b31 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -2,6 +2,7 @@ namespace App\Exceptions; +use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; use App\Helpers\Helper; use Illuminate\Validation\ValidationException; @@ -73,6 +74,14 @@ class Handler extends ExceptionHandler return response()->json(Helper::formatStandardApiResponse('error', null, 'Invalid JSON'), 422); } + //if ($e instanceof ModelNotFoundException) { + // $class = get_class($e); + // match($class) { + // + // }; + // return redirect()->route()->with('error', trans('general.model_not_found', ['model' => $e])); + //} + // Handle SCIM exceptions if ($e instanceof SCIMException) { try { diff --git a/app/Http/Controllers/Api/AssetsController.php b/app/Http/Controllers/Api/AssetsController.php index aad21f01aa..09de4fbccd 100644 --- a/app/Http/Controllers/Api/AssetsController.php +++ b/app/Http/Controllers/Api/AssetsController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\Api; +use App\Actions\Assets\DestroyAssetAction; use App\Actions\Assets\StoreAssetAction; use App\Events\CheckoutableCheckedIn; use App\Exceptions\CheckoutNotAllowed; @@ -735,30 +736,18 @@ class AssetsController extends Controller * @param int $assetId * @since [v4.0] */ - public function destroy($id) : JsonResponse + public function destroy(Asset $asset): JsonResponse { - $this->authorize('delete', Asset::class); - - if ($asset = Asset::find($id)) { - $this->authorize('delete', $asset); - - if ($asset->assignedTo) { - - $target = $asset->assignedTo; - $checkin_at = date('Y-m-d H:i:s'); - $originalValues = $asset->getRawOriginal(); - event(new CheckoutableCheckedIn($asset, $target, auth()->user(), 'Checkin on delete', $checkin_at, $originalValues)); - DB::table('assets') - ->where('id', $asset->id) - ->update(['assigned_to' => null]); - } - - $asset->delete(); - + //this is probably wrong + //$this->authorize('delete', Asset::class); + $this->authorize('delete', $asset); + try { + DestroyAssetAction::run($asset); return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/hardware/message.delete.success'))); + } catch (\Exception $e) { + report($e); + return response()->json(Helper::formatStandardApiResponse('error', null, 'something went wrong: ')); } - - return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.does_not_exist')), 200); } diff --git a/app/Http/Controllers/Assets/AssetsController.php b/app/Http/Controllers/Assets/AssetsController.php index a127f2d0e3..71ffde0aed 100755 --- a/app/Http/Controllers/Assets/AssetsController.php +++ b/app/Http/Controllers/Assets/AssetsController.php @@ -2,15 +2,18 @@ namespace App\Http\Controllers\Assets; +use App\Actions\Assets\DestroyAssetAction; use App\Actions\Assets\StoreAssetAction; use App\Events\CheckoutableCheckedIn; use App\Exceptions\CheckoutNotAllowed; use App\Helpers\Helper; use App\Http\Controllers\Controller; +use App\Http\Requests\Assets\DestroyAssetRequest; use App\Http\Requests\ImageUploadRequest; use App\Http\Requests\Assets\StoreAssetRequest; use App\Models\Actionlog; use App\Http\Requests\UploadFileRequest; +use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Support\Facades\Log; use App\Models\Asset; use App\Models\AssetModel; @@ -107,7 +110,7 @@ class AssetsController extends Controller $custom_fields = $request->collect()->filter(function ($value, $key) { return starts_with($key, '_snipeit_'); }); - + //DB::transaction(function () use ($request, $asset_tags, $serials, $custom_fields) { foreach ($asset_tags as $key => $asset_tag) { $asset = StoreAssetAction::run( @@ -360,39 +363,16 @@ class AssetsController extends Controller * @param int $assetId * @since [v1.0] */ - public function destroy(Request $request, $assetId) : RedirectResponse + public function destroy(Asset $asset): RedirectResponse { - // Check if the asset exists - if (is_null($asset = Asset::find($assetId))) { - // Redirect to the asset management page with error - return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist')); - } - $this->authorize('delete', $asset); - - if ($asset->assignedTo) { - - $target = $asset->assignedTo; - $checkin_at = date('Y-m-d H:i:s'); - $originalValues = $asset->getRawOriginal(); - event(new CheckoutableCheckedIn($asset, $target, auth()->user(), 'Checkin on delete', $checkin_at, $originalValues)); - DB::table('assets') - ->where('id', $asset->id) - ->update(['assigned_to' => null]); + try { + DestroyAssetAction::run($asset); + return redirect()->route('hardware.index')->with('success', trans('admin/hardware/message.delete.success')); + } catch (\Exception $e) { + report($e); + return redirect()->back()->withInput()->withErrors($e->getMessage()); } - - - if ($asset->image) { - try { - Storage::disk('public')->delete('assets'.'/'.$asset->image); - } catch (\Exception $e) { - Log::debug($e); - } - } - - $asset->delete(); - - return redirect()->route('hardware.index')->with('success', trans('admin/hardware/message.delete.success')); } /** diff --git a/app/Http/Requests/Assets/DestroyAssetRequest.php b/app/Http/Requests/Assets/DestroyAssetRequest.php new file mode 100644 index 0000000000..564233ae95 --- /dev/null +++ b/app/Http/Requests/Assets/DestroyAssetRequest.php @@ -0,0 +1,29 @@ +asset); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array|string> + */ + public function rules(): array + { + return [ + // + ]; + } +} diff --git a/routes/api.php b/routes/api.php index 0581a04682..a33132ef92 100644 --- a/routes/api.php +++ b/routes/api.php @@ -573,15 +573,16 @@ Route::group(['prefix' => 'v1', 'middleware' => ['api', 'throttle:api']], functi Route::put('/hardware/{asset}', [Api\AssetsController::class, 'update'])->name('api.assets.put-update'); + Route::delete('/hardware/{asset}', [Api\AssetsController::class, 'destroy'])->name('api.assets.destroy'); + Route::resource('hardware', Api\AssetsController::class, ['names' => [ 'index' => 'api.assets.index', 'show' => 'api.assets.show', 'store' => 'api.assets.store', - 'destroy' => 'api.assets.destroy', ], - 'except' => ['create', 'edit', 'update'], + 'except' => ['create', 'edit', 'update', 'destroy'], 'parameters' => ['asset' => 'asset_id'], ] ); // end assets API routes diff --git a/routes/web/hardware.php b/routes/web/hardware.php index ee888aa1db..aa8b0c087b 100644 --- a/routes/web/hardware.php +++ b/routes/web/hardware.php @@ -163,6 +163,8 @@ Route::group( }); +Route::delete('/hardware/{asset}', [AssetsController::class, 'destroy'])->name('hardware.destroy'); + Route::resource('hardware', AssetsController::class, [ @@ -172,6 +174,7 @@ Route::resource('hardware', 'show' => 'view', ], ], + 'except' => ['destroy'], ]); Route::get('ht/{any?}',