Added withTrashed() to handle soft deletes with RMB

Signed-off-by: snipe <snipe@snipe.net>
This commit is contained in:
snipe 2025-02-24 13:38:06 +00:00
parent e589adbe80
commit a5009aa7df
6 changed files with 100 additions and 136 deletions

View file

@ -178,28 +178,16 @@ class AssetModelsController extends Controller
* @since [v1.0] * @since [v1.0]
* @param int $modelId * @param int $modelId
*/ */
public function destroy($modelId) : RedirectResponse public function destroy(AssetModel $model) : RedirectResponse
{ {
$this->authorize('delete', AssetModel::class); $this->authorize('delete', AssetModel::class);
// Check if the model exists
if (is_null($model = AssetModel::find($modelId))) {
return redirect()->route('models.index')->with('error', trans('admin/models/message.does_not_exist'));
}
if ($model->assets()->count() > 0) { if ($model->assets()->count() > 0) {
// Throw an error that this model is associated with assets // Throw an error that this model is associated with assets
return redirect()->route('models.index')->with('error', trans('admin/models/message.assoc_users')); return redirect()->route('models.index')->with('error', trans('admin/models/message.assoc_users'));
} }
if ($model->image) {
try {
Storage::disk('public')->delete('models/'.$model->image);
$model->update(['image' => null]);
} catch (\Exception $e) {
Log::info($e);
}
}
// Delete the model // Delete the model
$model->delete(); $model->delete();
@ -270,23 +258,20 @@ class AssetModelsController extends Controller
* @since [v1.0] * @since [v1.0]
* @param int $modelId * @param int $modelId
*/ */
public function getClone($modelId = null) : View | RedirectResponse public function getClone(AssetModel $model) : View | RedirectResponse
{ {
$this->authorize('create', AssetModel::class); $this->authorize('create', AssetModel::class);
// Check if the model exists
if (is_null($model_to_clone = AssetModel::find($modelId))) {
return redirect()->route('models.index')->with('error', trans('admin/models/message.does_not_exist'));
}
$model = clone $model_to_clone; $cloned_model = clone $model;
$model->id = null; $model->id = null;
$model->deleted_at = null;
// Show the page // Show the page
return view('models/edit') return view('models/edit')
->with('depreciation_list', Helper::depreciationList()) ->with('depreciation_list', Helper::depreciationList())
->with('item', $model) ->with('item', $model)
->with('model_id', $model_to_clone->id) ->with('model_id', $model->id)
->with('clone_model', $model_to_clone); ->with('clone_model', $cloned_model);
} }
@ -305,7 +290,7 @@ class AssetModelsController extends Controller
/** /**
* Returns a view that allows the user to bulk edit model attrbutes * Returns a view that allows the user to bulk edit model attributes
* *
* @author [A. Gianotto] [<snipe@snipe.net>] * @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.7] * @since [v1.7]

View file

@ -58,11 +58,9 @@ class AssetModelsFilesController extends Controller
* @param int $fileId * @param int $fileId
* @since [v1.0] * @since [v1.0]
*/ */
public function show($modelId = null, $fileId = null) : StreamedResponse | Response | RedirectResponse | BinaryFileResponse public function show(AssetModel $model, $fileId = null) : StreamedResponse | Response | RedirectResponse | BinaryFileResponse
{ {
$model = AssetModel::find($modelId);
// the asset is valid
if (isset($model->id)) {
$this->authorize('view', $model); $this->authorize('view', $model);
if (! $log = Actionlog::find($fileId)) { if (! $log = Actionlog::find($fileId)) {
@ -88,12 +86,6 @@ class AssetModelsFilesController extends Controller
return StorageHelper::downloader($file); return StorageHelper::downloader($file);
} }
// Prepare the error message
$error = trans('admin/hardware/message.does_not_exist', ['id' => $fileId]);
// Redirect to the hardware management page
return redirect()->route('hardware.index')->with('error', $error);
}
/** /**
* Delete the associated file * Delete the associated file
@ -103,14 +95,9 @@ class AssetModelsFilesController extends Controller
* @param int $fileId * @param int $fileId
* @since [v1.0] * @since [v1.0]
*/ */
public function destroy($modelId = null, $fileId = null) : RedirectResponse public function destroy(AssetModel $model, $fileId = null) : RedirectResponse
{ {
$model = AssetModel::find($modelId);
$this->authorize('update', $model);
$rel_path = 'private_uploads/assetmodels'; $rel_path = 'private_uploads/assetmodels';
// the asset is valid
if (isset($model->id)) {
$this->authorize('update', $model); $this->authorize('update', $model);
$log = Actionlog::find($fileId); $log = Actionlog::find($fileId);
if ($log) { if ($log) {
@ -123,9 +110,6 @@ class AssetModelsFilesController extends Controller
} }
return redirect()->back()->withFragment('files')->with('success', trans('admin/hardware/message.deletefile.success')); return redirect()->back()->withFragment('files')->with('success', trans('admin/hardware/message.deletefile.success'));
}
// Redirect to the hardware management page
return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.does_not_exist'));
} }
} }

View file

@ -22,15 +22,9 @@ class UserFilesController extends Controller
*@author [A. Gianotto] [<snipe@snipe.net>] *@author [A. Gianotto] [<snipe@snipe.net>]
* @since [v1.6] * @since [v1.6]
*/ */
public function store(UploadFileRequest $request, $userId = null) public function store(UploadFileRequest $request, User $user)
{ {
$user = User::find($userId);
$destinationPath = config('app.private_uploads').'/users';
if (isset($user->id)) {
$this->authorize('update', $user); $this->authorize('update', $user);
$logActions = [];
$files = $request->file('file'); $files = $request->file('file');
if (is_null($files)) { if (is_null($files)) {
@ -53,12 +47,9 @@ class UserFilesController extends Controller
if (! $logAction->save()) { if (! $logAction->save()) {
return JsonResponse::create(['error' => 'Failed validation: '.print_r($logAction->getErrors(), true)], 500); return JsonResponse::create(['error' => 'Failed validation: '.print_r($logAction->getErrors(), true)], 500);
} }
$logActions[] = $logAction;
}
// dd($logActions);
return redirect()->back()->withFragment('files')->with('success', trans('admin/users/message.upload.success')); return redirect()->back()->withFragment('files')->with('success', trans('admin/users/message.upload.success'));
} }
return redirect()->back()->with('error', trans('admin/users/message.upload.nofiles'));
} }
@ -110,7 +101,7 @@ class UserFilesController extends Controller
* @return mixed * @return mixed
* @throws \Illuminate\Auth\Access\AuthorizationException * @throws \Illuminate\Auth\Access\AuthorizationException
*/ */
public function show($userId = null, $fileId = null) public function show(User $user, $fileId = null)
{ {
@ -118,8 +109,6 @@ class UserFilesController extends Controller
return redirect()->route('users.show')->with('error', 'Invalid file request'); return redirect()->route('users.show')->with('error', 'Invalid file request');
} }
if ($user = User::find($userId)) {
$this->authorize('view', $user); $this->authorize('view', $user);
if ($log = Actionlog::whereNotNull('filename')->where('item_id', $user->id)->find($fileId)) { if ($log = Actionlog::whereNotNull('filename')->where('item_id', $user->id)->find($fileId)) {
@ -135,12 +124,6 @@ class UserFilesController extends Controller
// The log record doesn't exist somehow // The log record doesn't exist somehow
return redirect()->route('users.show', ['user' => $user])->with('error', trans('general.log_record_not_found')); return redirect()->route('users.show', ['user' => $user])->with('error', trans('general.log_record_not_found'));
return redirect()->back()->with('error', trans('general.file_not_found'));
}
// Redirect to the user management page if the user doesn't exist
return redirect()->route('users.index')->with('error', trans('admin/users/message.user_not_found', ['id' => $userId]));
} }
} }

View file

@ -49,7 +49,7 @@ class BreadcrumbsServiceProvider extends ServiceProvider
Breadcrumbs::for('hardware.index', fn (Trail $trail) => Breadcrumbs::for('hardware.index', fn (Trail $trail) =>
$trail->parent('home', route('home')) $trail->parent('home', route('home'))
->push(trans('general.assets'), route('hardware.index')) ->push(trans('general.assets'), route('hardware.index'))
->push(request()->status.' Assets', route('hardware.index', ['status' => request()->status])) ->push(request()->status.' '.trans('general.assets'), route('hardware.index', ['status' => request()->status]))
); );
} else { } else {
@ -81,10 +81,20 @@ class BreadcrumbsServiceProvider extends ServiceProvider
/** /**
* Asset Model Breadcrumbs * Asset Model Breadcrumbs
*/ */
if ((request()->is('models*')) && (request()->status=='deleted')) {
Breadcrumbs::for('models.index', fn (Trail $trail) =>
$trail->parent('hardware.index', route('hardware.index'))
->push(trans('general.asset_models'), route('models.index'))
->push(trans('general.deleted_models'), route('models.index', ['status' => request()->status]))
);
} else {
Breadcrumbs::for('models.index', fn (Trail $trail) => Breadcrumbs::for('models.index', fn (Trail $trail) =>
$trail->parent('hardware.index', route('hardware.index')) $trail->parent('hardware.index', route('hardware.index'))
->push(trans('general.asset_models'), route('models.index')) ->push(trans('general.asset_models'), route('models.index'))
); );
}
Breadcrumbs::for('models.create', fn (Trail $trail) => Breadcrumbs::for('models.create', fn (Trail $trail) =>
$trail->parent('models.index', route('models.index')) $trail->parent('models.index', route('models.index'))
@ -511,10 +521,16 @@ class BreadcrumbsServiceProvider extends ServiceProvider
/** /**
* Users Breadcrumbs * Users Breadcrumbs
*/ */
Breadcrumbs::for('users.index', fn (Trail $trail) => if ((request()->is('users*')) && (request()->status=='deleted')) {
$trail->parent('home', route('home')) Breadcrumbs::for('users.index', fn(Trail $trail) => $trail->parent('home', route('home'))
->push(trans('general.users'), route('users.index'))
->push(trans('general.deleted_users'), route('users.index'))
);
} else {
Breadcrumbs::for('users.index', fn(Trail $trail) => $trail->parent('home', route('home'))
->push(trans('general.users'), route('users.index')) ->push(trans('general.users'), route('users.index'))
); );
}
Breadcrumbs::for('users.create', fn (Trail $trail) => Breadcrumbs::for('users.create', fn (Trail $trail) =>
$trail->parent('users.index', route('users.index')) $trail->parent('users.index', route('users.index'))

View file

@ -10,33 +10,33 @@ use Illuminate\Support\Facades\Route;
Route::group(['prefix' => 'models', 'middleware' => ['auth']], function () { Route::group(['prefix' => 'models', 'middleware' => ['auth']], function () {
Route::post('{modelID}/upload', Route::post('{model}/upload',
[AssetModelsFilesController::class, 'store'] [AssetModelsFilesController::class, 'store']
)->name('upload/models'); )->name('upload/models')->withTrashed();
Route::get('{modelID}/showfile/{fileId}/{download?}', Route::get('{model}/showfile/{fileId}/{download?}',
[AssetModelsFilesController::class, 'show'] [AssetModelsFilesController::class, 'show']
)->name('show/modelfile'); )->name('show/modelfile')->withTrashed();
Route::delete('{modelID}/showfile/{fileId}/delete', Route::delete('{model}/showfile/{fileId}/delete',
[AssetModelsFilesController::class, 'destroy'] [AssetModelsFilesController::class, 'destroy']
)->name('delete/modelfile'); )->name('delete/modelfile')->withTrashed();
Route::get( Route::get(
'{modelId}/clone', '{model}/clone',
[ [
AssetModelsController::class, AssetModelsController::class,
'getClone' 'getClone'
] ]
)->name('models.clone.create'); )->name('models.clone.create')->withTrashed();
Route::post( Route::post(
'{modelId}/clone', '{model}/clone',
[ [
AssetModelsController::class, AssetModelsController::class,
'postCreate' 'postCreate'
] ]
)->name('models.clone.store'); )->name('models.clone.store')->withTrashed();
Route::get( Route::get(
'{modelId}/view', '{modelId}/view',
@ -92,5 +92,4 @@ Route::group(['prefix' => 'models', 'middleware' => ['auth']], function () {
Route::resource('models', AssetModelsController::class, [ Route::resource('models', AssetModelsController::class, [
'middleware' => ['auth'], 'middleware' => ['auth'],
'parameters' => ['model' => 'model_id'], ])->withTrashed();
]);

View file

@ -33,20 +33,20 @@ Route::group(['prefix' => 'users', 'middleware' => ['auth']], function () {
)->name('users.export'); )->name('users.export');
Route::get( Route::get(
'{userId}/clone', '{user}/clone',
[ [
Users\UsersController::class, Users\UsersController::class,
'getClone' 'getClone'
] ]
)->name('users.clone.show'); )->name('users.clone.show')->withTrashed();
Route::post( Route::post(
'{userId}/clone', '{user}/clone',
[ [
Users\UsersController::class, Users\UsersController::class,
'postCreate' 'postCreate'
] ]
)->name('users.clone.store'); )->name('users.clone.store')->withTrashed();
Route::post( Route::post(
'{userId}/restore', '{userId}/restore',
@ -65,12 +65,12 @@ Route::group(['prefix' => 'users', 'middleware' => ['auth']], function () {
)->name('unsuspend/user'); )->name('unsuspend/user');
Route::post( Route::post(
'{userId}/upload', '{user}/upload',
[ [
Users\UserFilesController::class, Users\UserFilesController::class,
'store' 'store'
] ]
)->name('upload/user'); )->name('upload/user')->withTrashed();
Route::delete( Route::delete(
'{userId}/deletefile/{fileId}', '{userId}/deletefile/{fileId}',
@ -81,12 +81,12 @@ Route::group(['prefix' => 'users', 'middleware' => ['auth']], function () {
)->name('userfile.destroy'); )->name('userfile.destroy');
Route::get( Route::get(
'{userId}/showfile/{fileId}', '{user}/showfile/{fileId}',
[ [
Users\UserFilesController::class, Users\UserFilesController::class,
'show' 'show'
] ]
)->name('show/userfile'); )->name('show/userfile')->withTrashed();
Route::post( Route::post(
'{userId}/password', '{userId}/password',
@ -145,11 +145,8 @@ Route::group(['prefix' => 'users', 'middleware' => ['auth']], function () {
] ]
)->name('users/bulkeditsave'); )->name('users/bulkeditsave');
// pulling this out of the resource because I need route model binding in the request
Route::match(['put', 'patch'], '/{user}', [Users\UsersController::class, 'update'])->name('users.update');
}); });
Route::resource('users', Users\UsersController::class, [ Route::resource('users', Users\UsersController::class, [
'middleware' => ['auth'], 'middleware' => ['auth']
'except' => ['update'] ])->withTrashed();
]);