Files
panel/app/Http/Controllers/Admin/UserController.php

147 lines
4.1 KiB
PHP
Raw Normal View History

<?php
2016-12-07 22:46:38 +00:00
2024-03-12 22:39:16 -04:00
namespace App\Http\Controllers\Admin;
2024-03-17 13:46:01 -04:00
use Illuminate\Http\JsonResponse;
use Illuminate\View\View;
2016-12-07 22:46:38 +00:00
use Illuminate\Http\Request;
2024-03-12 22:39:16 -04:00
use App\Models\User;
use Illuminate\Http\RedirectResponse;
use Prologue\Alerts\AlertsMessageBag;
use Spatie\QueryBuilder\QueryBuilder;
use Illuminate\View\Factory as ViewFactory;
2024-03-12 22:39:16 -04:00
use App\Http\Controllers\Controller;
2017-08-30 21:14:20 -05:00
use Illuminate\Contracts\Translation\Translator;
2024-03-12 22:39:16 -04:00
use App\Services\Users\UserUpdateService;
use App\Traits\Helpers\AvailableLanguages;
use App\Services\Users\UserCreationService;
use App\Http\Requests\Admin\UserFormRequest;
use App\Http\Requests\Admin\NewUserFormRequest;
class UserController extends Controller
{
2017-12-30 20:25:04 -06:00
use AvailableLanguages;
/**
* UserController constructor.
*/
public function __construct(
protected AlertsMessageBag $alert,
protected UserCreationService $creationService,
protected Translator $translator,
protected UserUpdateService $updateService,
protected ViewFactory $view
) {
}
/**
2017-03-19 19:36:50 -04:00
* Display user index page.
*/
public function index(Request $request): View
{
$users = QueryBuilder::for(
User::query()->select('users.*')
->selectRaw('COUNT(DISTINCT(subusers.id)) as subuser_of_count')
->selectRaw('COUNT(DISTINCT(servers.id)) as servers_count')
->leftJoin('subusers', 'subusers.user_id', '=', 'users.id')
->leftJoin('servers', 'servers.owner_id', '=', 'users.id')
->groupBy('users.id')
)
->allowedFilters(['username', 'email', 'uuid'])
->allowedSorts(['id', 'uuid'])
->paginate(50);
2017-03-04 00:14:21 +01:00
2024-03-16 23:23:07 -04:00
return view('admin.users.index', ['users' => $users]);
}
2017-03-19 19:36:50 -04:00
/**
* Display new user page.
*/
public function create(): View
{
2024-03-16 23:23:07 -04:00
return view('admin.users.new', [
2024-03-23 12:43:01 -04:00
'languages' => $this->getAvailableLanguages(),
2017-12-30 20:25:04 -06:00
]);
}
2017-03-19 19:36:50 -04:00
/**
* Display user view page.
*/
public function view(User $user): View
{
2024-03-16 23:23:07 -04:00
return view('admin.users.view', [
2017-12-30 20:25:04 -06:00
'user' => $user,
2024-03-23 12:43:01 -04:00
'languages' => $this->getAvailableLanguages(),
2017-12-30 20:25:04 -06:00
]);
}
2017-03-19 19:36:50 -04:00
/**
* Delete a user from the system.
2017-03-19 19:36:50 -04:00
*
* @throws \Exception
2024-03-12 22:39:16 -04:00
* @throws \App\Exceptions\DisplayException
2017-03-19 19:36:50 -04:00
*/
2024-03-18 21:23:13 -04:00
public function delete(User $user): RedirectResponse
{
2024-03-18 21:23:13 -04:00
$user->delete();
2016-12-07 22:46:38 +00:00
return redirect()->route('admin.users');
}
2017-03-19 19:36:50 -04:00
/**
* Create a user.
*
* @throws \Exception
* @throws \Throwable
2017-03-19 19:36:50 -04:00
*/
2022-10-23 20:51:20 -04:00
public function store(NewUserFormRequest $request): RedirectResponse
{
$user = $this->creationService->handle($request->normalize());
2019-12-16 21:25:48 -08:00
$this->alert->success($this->translator->get('admin/user.notices.account_created'))->flash();
return redirect()->route('admin.users.view', $user->id);
}
2017-03-19 19:36:50 -04:00
/**
* Update a user on the system.
2017-03-19 19:36:50 -04:00
*
2024-03-12 22:39:16 -04:00
* @throws \App\Exceptions\Model\DataValidationException
2017-03-19 19:36:50 -04:00
*/
public function update(UserFormRequest $request, User $user): RedirectResponse
{
$this->updateService
->setUserLevel(User::USER_LEVEL_ADMIN)
->handle($user, $request->normalize());
$this->alert->success(trans('admin/user.notices.account_updated'))->flash();
2016-12-07 22:46:38 +00:00
return redirect()->route('admin.users.view', $user->id);
}
2017-03-19 19:36:50 -04:00
/**
* Get a JSON response of users on the system.
*/
2024-03-17 13:46:01 -04:00
public function json(Request $request): JsonResponse
{
2024-03-18 21:23:13 -04:00
// Handle single user requests | TODO: Separate this out into its own method
if ($userId = $request->query('user_id')) {
$user = User::query()->findOrFail($userId);
2024-03-17 12:52:22 -04:00
$user['md5'] = md5(strtolower($user->email));
2024-03-17 13:46:01 -04:00
return response()->json($user);
}
2024-03-18 21:23:13 -04:00
// Handle all users list
$userPaginator = QueryBuilder::for(User::query())->allowedFilters(['email'])->paginate(25);
/** @var User[] $users */
$users = $userPaginator->items();
2024-03-17 13:46:01 -04:00
return response()->json(collect($users)->map(function (User $user) {
$user['md5'] = md5(strtolower($user->email));
2024-03-17 13:46:01 -04:00
return $user;
}));
}
}