Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pterodactyl
GitHub Repository: pterodactyl/panel
Path: blob/1.0-develop/app/Http/Controllers/Admin/UserController.php
10284 views
1
<?php
2
3
namespace Pterodactyl\Http\Controllers\Admin;
4
5
use Illuminate\View\View;
6
use Illuminate\Http\Request;
7
use Pterodactyl\Models\User;
8
use Pterodactyl\Models\Model;
9
use Illuminate\Support\Collection;
10
use Illuminate\Http\RedirectResponse;
11
use Prologue\Alerts\AlertsMessageBag;
12
use Spatie\QueryBuilder\QueryBuilder;
13
use Illuminate\View\Factory as ViewFactory;
14
use Pterodactyl\Exceptions\DisplayException;
15
use Pterodactyl\Http\Controllers\Controller;
16
use Illuminate\Contracts\Translation\Translator;
17
use Pterodactyl\Services\Users\UserUpdateService;
18
use Pterodactyl\Traits\Helpers\AvailableLanguages;
19
use Pterodactyl\Services\Users\UserCreationService;
20
use Pterodactyl\Services\Users\UserDeletionService;
21
use Pterodactyl\Http\Requests\Admin\UserFormRequest;
22
use Pterodactyl\Http\Requests\Admin\NewUserFormRequest;
23
use Pterodactyl\Contracts\Repository\UserRepositoryInterface;
24
25
class UserController extends Controller
26
{
27
use AvailableLanguages;
28
29
/**
30
* UserController constructor.
31
*/
32
public function __construct(
33
protected AlertsMessageBag $alert,
34
protected UserCreationService $creationService,
35
protected UserDeletionService $deletionService,
36
protected Translator $translator,
37
protected UserUpdateService $updateService,
38
protected UserRepositoryInterface $repository,
39
protected ViewFactory $view,
40
) {
41
}
42
43
/**
44
* Display user index page.
45
*/
46
public function index(Request $request): View
47
{
48
$users = QueryBuilder::for(
49
User::query()->select('users.*')
50
->selectRaw('COUNT(DISTINCT(subusers.id)) as subuser_of_count')
51
->selectRaw('COUNT(DISTINCT(servers.id)) as servers_count')
52
->leftJoin('subusers', 'subusers.user_id', '=', 'users.id')
53
->leftJoin('servers', 'servers.owner_id', '=', 'users.id')
54
->groupBy('users.id')
55
)
56
->allowedFilters(['username', 'email', 'uuid'])
57
->defaultSort('-root_admin')
58
->allowedSorts(['id', 'uuid'])
59
->paginate(50);
60
61
return view('admin.users.index', ['users' => $users]);
62
}
63
64
/**
65
* Display new user page.
66
*/
67
public function create(): View
68
{
69
return view('admin.users.new', [
70
'languages' => $this->getAvailableLanguages(true),
71
]);
72
}
73
74
/**
75
* Display user view page.
76
*/
77
public function view(User $user): View
78
{
79
return view('admin.users.view', [
80
'user' => $user,
81
'languages' => $this->getAvailableLanguages(true),
82
]);
83
}
84
85
/**
86
* Delete a user from the system.
87
*
88
* @throws \Exception
89
* @throws DisplayException
90
*/
91
public function delete(Request $request, User $user): RedirectResponse
92
{
93
if ($request->user()->is($user)) {
94
throw new DisplayException(__('admin/user.exceptions.delete_self'));
95
}
96
97
$this->deletionService->handle($user);
98
99
return redirect()->route('admin.users');
100
}
101
102
/**
103
* Create a user.
104
*
105
* @throws \Exception
106
* @throws \Throwable
107
*/
108
public function store(NewUserFormRequest $request): RedirectResponse
109
{
110
$user = $this->creationService->handle($request->normalize());
111
$this->alert->success($this->translator->get('admin/user.notices.account_created'))->flash();
112
113
return redirect()->route('admin.users.view', $user->id);
114
}
115
116
/**
117
* Update a user on the system.
118
*
119
* @throws \Pterodactyl\Exceptions\Model\DataValidationException
120
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
121
*/
122
public function update(UserFormRequest $request, User $user): RedirectResponse
123
{
124
$this->updateService
125
->setUserLevel(User::USER_LEVEL_ADMIN)
126
->handle($user, $request->normalize());
127
128
$this->alert->success(trans('admin/user.notices.account_updated'))->flash();
129
130
return redirect()->route('admin.users.view', $user->id);
131
}
132
133
/**
134
* Get a JSON response of users on the system.
135
*/
136
public function json(Request $request): Model|Collection
137
{
138
$users = QueryBuilder::for(User::query())->allowedFilters(['email'])->paginate(25);
139
140
// Handle single user requests.
141
if ($request->query('user_id')) {
142
$user = User::query()->findOrFail($request->input('user_id'));
143
// @phpstan-ignore-next-line property.notFound
144
$user->md5 = md5(strtolower($user->email));
145
146
return $user;
147
}
148
149
return $users->map(function ($item) {
150
// @phpstan-ignore-next-line property.notFound
151
$item->md5 = md5(strtolower($item->email));
152
153
return $item;
154
});
155
}
156
}
157
158