From c4a471f91a06872d062c268dc6152687cd534f72 Mon Sep 17 00:00:00 2001 From: Lance Pioch Date: Mon, 18 Mar 2024 21:23:13 -0400 Subject: [PATCH] Handle deletion better --- .../Commands/User/DeleteUserCommand.php | 13 ++----- app/Http/Controllers/Admin/UserController.php | 28 ++++++--------- .../Api/Application/Users/UserController.php | 9 ++--- app/Models/User.php | 10 ++++++ app/Services/Users/UserDeletionService.php | 36 ------------------- resources/lang/en/admin/user.php | 1 + 6 files changed, 27 insertions(+), 70 deletions(-) delete mode 100644 app/Services/Users/UserDeletionService.php diff --git a/app/Console/Commands/User/DeleteUserCommand.php b/app/Console/Commands/User/DeleteUserCommand.php index 28dcc641c..a6810feee 100644 --- a/app/Console/Commands/User/DeleteUserCommand.php +++ b/app/Console/Commands/User/DeleteUserCommand.php @@ -5,7 +5,6 @@ namespace App\Console\Commands\User; use App\Models\User; use Webmozart\Assert\Assert; use Illuminate\Console\Command; -use App\Services\Users\UserDeletionService; class DeleteUserCommand extends Command { @@ -13,14 +12,6 @@ class DeleteUserCommand extends Command protected $signature = 'p:user:delete {--user=}'; - /** - * DeleteUserCommand constructor. - */ - public function __construct(private UserDeletionService $deletionService) - { - parent::__construct(); - } - public function handle(): int { $search = $this->option('user') ?? $this->ask(trans('command/messages.user.search_users')); @@ -62,7 +53,9 @@ class DeleteUserCommand extends Command } if ($this->confirm(trans('command/messages.user.confirm_delete')) || !$this->input->isInteractive()) { - $this->deletionService->handle($deleteUser); + $user = User::query()->findOrFail($deleteUser); + $user->delete(); + $this->info(trans('command/messages.user.deleted')); } diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index 5c2920afb..6e5e9f47f 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -10,13 +10,11 @@ use Illuminate\Http\RedirectResponse; use Prologue\Alerts\AlertsMessageBag; use Spatie\QueryBuilder\QueryBuilder; use Illuminate\View\Factory as ViewFactory; -use App\Exceptions\DisplayException; use App\Http\Controllers\Controller; use Illuminate\Contracts\Translation\Translator; use App\Services\Users\UserUpdateService; use App\Traits\Helpers\AvailableLanguages; use App\Services\Users\UserCreationService; -use App\Services\Users\UserDeletionService; use App\Http\Requests\Admin\UserFormRequest; use App\Http\Requests\Admin\NewUserFormRequest; @@ -30,7 +28,6 @@ class UserController extends Controller public function __construct( protected AlertsMessageBag $alert, protected UserCreationService $creationService, - protected UserDeletionService $deletionService, protected Translator $translator, protected UserUpdateService $updateService, protected ViewFactory $view @@ -84,13 +81,9 @@ class UserController extends Controller * @throws \Exception * @throws \App\Exceptions\DisplayException */ - public function delete(Request $request, User $user): RedirectResponse + public function delete(User $user): RedirectResponse { - if ($request->user()->id === $user->id) { - throw new DisplayException($this->translator->get('admin/user.exceptions.user_has_servers')); - } - - $this->deletionService->handle($user); + $user->delete(); return redirect()->route('admin.users'); } @@ -130,19 +123,20 @@ class UserController extends Controller */ public function json(Request $request): JsonResponse { - $userPaginator = QueryBuilder::for(User::query())->allowedFilters(['email'])->paginate(25); - - /** @var User[] $users */ - $users = $userPaginator->items(); - - // Handle single user requests. - if ($request->query('user_id')) { - $user = User::query()->findOrFail($request->input('user_id')); + // Handle single user requests | TODO: Separate this out into its own method + if ($userId = $request->query('user_id')) { + $user = User::query()->findOrFail($userId); $user['md5'] = md5(strtolower($user->email)); return response()->json($user); } + // Handle all users list + $userPaginator = QueryBuilder::for(User::query())->allowedFilters(['email'])->paginate(25); + + /** @var User[] $users */ + $users = $userPaginator->items(); + return response()->json(collect($users)->map(function (User $user) { $user['md5'] = md5(strtolower($user->email)); diff --git a/app/Http/Controllers/Api/Application/Users/UserController.php b/app/Http/Controllers/Api/Application/Users/UserController.php index 8ad768fe4..a561da508 100644 --- a/app/Http/Controllers/Api/Application/Users/UserController.php +++ b/app/Http/Controllers/Api/Application/Users/UserController.php @@ -7,7 +7,6 @@ use Illuminate\Http\JsonResponse; use Spatie\QueryBuilder\QueryBuilder; use App\Services\Users\UserUpdateService; use App\Services\Users\UserCreationService; -use App\Services\Users\UserDeletionService; use App\Transformers\Api\Application\UserTransformer; use App\Http\Requests\Api\Application\Users\GetUsersRequest; use App\Http\Requests\Api\Application\Users\StoreUserRequest; @@ -22,7 +21,6 @@ class UserController extends ApplicationApiController */ public function __construct( private UserCreationService $creationService, - private UserDeletionService $deletionService, private UserUpdateService $updateService ) { parent::__construct(); @@ -99,14 +97,11 @@ class UserController extends ApplicationApiController } /** - * Handle a request to delete a user from the Panel. Returns a HTTP/204 response - * on successful deletion. - * - * @throws \App\Exceptions\DisplayException + * Handle a request to delete a user from the Panel. Returns a HTTP/204 response on successful deletion. */ public function delete(DeleteUserRequest $request, User $user): JsonResponse { - $this->deletionService->handle($user); + $user->delete(); return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT); } diff --git a/app/Models/User.php b/app/Models/User.php index 690c8012e..0a21c47d8 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Exceptions\DisplayException; use App\Rules\Username; use App\Facades\Activity; use Illuminate\Support\Collection; @@ -167,6 +168,15 @@ class User extends Model implements AuthenticatableContract, AuthorizableContrac 'totp_secret' => 'nullable|string', ]; + protected static function booted(): void + { + static::deleting(function (self $user) { + throw_if($user->servers()->count() > 0, new DisplayException(__('admin/user.exceptions.user_has_servers'))); + + throw_if(request()->user()?->id === $user->id, new DisplayException(__('admin/user.exceptions.user_is_self'))); + }); + } + /** * Implement language verification by overriding Eloquence's gather * rules function. diff --git a/app/Services/Users/UserDeletionService.php b/app/Services/Users/UserDeletionService.php deleted file mode 100644 index b86bf6b0c..000000000 --- a/app/Services/Users/UserDeletionService.php +++ /dev/null @@ -1,36 +0,0 @@ -servers()->count() > 0) { - throw new DisplayException($this->translator->get('admin/user.exceptions.user_has_servers')); - } - - return $user->delete(); - } -} diff --git a/resources/lang/en/admin/user.php b/resources/lang/en/admin/user.php index 65e227806..4134c15b4 100644 --- a/resources/lang/en/admin/user.php +++ b/resources/lang/en/admin/user.php @@ -3,6 +3,7 @@ return [ 'exceptions' => [ 'user_has_servers' => 'Cannot delete a user with active servers attached to their account. Please delete their servers before continuing.', + 'user_is_self' => 'Cannot delete your own user account.', ], 'notices' => [ 'account_created' => 'Account has been created successfully.',