Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pterodactyl
GitHub Repository: pterodactyl/panel
Path: blob/1.0-develop/app/Http/Controllers/Admin/Nests/EggController.php
10280 views
1
<?php
2
3
namespace Pterodactyl\Http\Controllers\Admin\Nests;
4
5
use Illuminate\View\View;
6
use Pterodactyl\Models\Egg;
7
use Illuminate\Http\RedirectResponse;
8
use Prologue\Alerts\AlertsMessageBag;
9
use Illuminate\View\Factory as ViewFactory;
10
use Pterodactyl\Http\Controllers\Controller;
11
use Pterodactyl\Services\Eggs\EggUpdateService;
12
use Pterodactyl\Services\Eggs\EggCreationService;
13
use Pterodactyl\Services\Eggs\EggDeletionService;
14
use Pterodactyl\Http\Requests\Admin\Egg\EggFormRequest;
15
use Pterodactyl\Contracts\Repository\EggRepositoryInterface;
16
use Pterodactyl\Contracts\Repository\NestRepositoryInterface;
17
18
class EggController extends Controller
19
{
20
/**
21
* EggController constructor.
22
*/
23
public function __construct(
24
protected AlertsMessageBag $alert,
25
protected EggCreationService $creationService,
26
protected EggDeletionService $deletionService,
27
protected EggRepositoryInterface $repository,
28
protected EggUpdateService $updateService,
29
protected NestRepositoryInterface $nestRepository,
30
protected ViewFactory $view,
31
) {
32
}
33
34
/**
35
* Handle a request to display the Egg creation page.
36
*
37
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
38
*/
39
public function create(): View
40
{
41
$nests = $this->nestRepository->getWithEggs();
42
\JavaScript::put(['nests' => $nests->keyBy('id')]);
43
44
return view('admin.eggs.new', ['nests' => $nests]);
45
}
46
47
/**
48
* Handle request to store a new Egg.
49
*
50
* @throws \Pterodactyl\Exceptions\Model\DataValidationException
51
* @throws \Pterodactyl\Exceptions\Service\Egg\NoParentConfigurationFoundException
52
*/
53
public function store(EggFormRequest $request): RedirectResponse
54
{
55
$data = $request->validated();
56
$data['docker_images'] = $this->normalizeDockerImages($data['docker_images'] ?? null);
57
58
$egg = $this->creationService->handle($data);
59
$this->alert->success(trans('admin/nests.eggs.notices.egg_created'))->flash();
60
61
return redirect()->route('admin.nests.egg.view', $egg->id);
62
}
63
64
/**
65
* Handle request to view a single Egg.
66
*/
67
public function view(Egg $egg): View
68
{
69
return view('admin.eggs.view', [
70
'egg' => $egg,
71
'images' => array_map(
72
fn ($key, $value) => $key === $value ? $value : "$key|$value",
73
array_keys($egg->docker_images),
74
$egg->docker_images,
75
),
76
]);
77
}
78
79
/**
80
* Handle request to update an Egg.
81
*
82
* @throws \Pterodactyl\Exceptions\Model\DataValidationException
83
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
84
* @throws \Pterodactyl\Exceptions\Service\Egg\NoParentConfigurationFoundException
85
*/
86
public function update(EggFormRequest $request, Egg $egg): RedirectResponse
87
{
88
$data = $request->validated();
89
$data['docker_images'] = $this->normalizeDockerImages($data['docker_images'] ?? null);
90
91
$this->updateService->handle($egg, $data);
92
$this->alert->success(trans('admin/nests.eggs.notices.updated'))->flash();
93
94
return redirect()->route('admin.nests.egg.view', $egg->id);
95
}
96
97
/**
98
* Handle request to destroy an egg.
99
*
100
* @throws \Pterodactyl\Exceptions\Service\Egg\HasChildrenException
101
* @throws \Pterodactyl\Exceptions\Service\HasActiveServersException
102
*/
103
public function destroy(Egg $egg): RedirectResponse
104
{
105
$this->deletionService->handle($egg->id);
106
$this->alert->success(trans('admin/nests.eggs.notices.deleted'))->flash();
107
108
return redirect()->route('admin.nests.view', $egg->nest_id);
109
}
110
111
/**
112
* Normalizes a string of docker image data into the expected egg format.
113
*/
114
protected function normalizeDockerImages(?string $input = null): array
115
{
116
$data = array_map(fn ($value) => trim($value), explode("\n", $input ?? ''));
117
118
$images = [];
119
// Iterate over the image data provided and convert it into a name => image
120
// pairing that is used to improve the display on the front-end.
121
foreach ($data as $value) {
122
$parts = explode('|', $value, 2);
123
$images[$parts[0]] = empty($parts[1]) ? $parts[0] : $parts[1];
124
}
125
126
return $images;
127
}
128
}
129
130