Skip to content

Commit 17f6f3e

Browse files
committed
Add server details modification endpoint to API.
1 parent 3e327b8 commit 17f6f3e

File tree

7 files changed

+160
-267
lines changed

7 files changed

+160
-267
lines changed

app/Http/Controllers/Admin/ServersController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ public function viewDelete(Server $server)
401401
*/
402402
public function setDetails(Request $request, Server $server)
403403
{
404-
$this->detailsModificationService->edit($server, $request->only([
404+
$this->detailsModificationService->handle($server, $request->only([
405405
'owner_id', 'name', 'description',
406406
]));
407407

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
namespace Pterodactyl\Http\Controllers\Api\Application\Servers;
4+
5+
use Pterodactyl\Models\Server;
6+
use Pterodactyl\Services\Servers\DetailsModificationService;
7+
use Pterodactyl\Transformers\Api\Application\ServerTransformer;
8+
use Pterodactyl\Http\Controllers\Api\Application\ApplicationApiController;
9+
use Pterodactyl\Http\Requests\Api\Application\Servers\UpdateServerDetailsRequest;
10+
11+
class ServerDetailsController extends ApplicationApiController
12+
{
13+
/**
14+
* @var \Pterodactyl\Services\Servers\DetailsModificationService
15+
*/
16+
private $modificationService;
17+
18+
/**
19+
* ServerDetailsController constructor.
20+
*
21+
* @param \Pterodactyl\Services\Servers\DetailsModificationService $modificationService
22+
*/
23+
public function __construct(DetailsModificationService $modificationService)
24+
{
25+
parent::__construct();
26+
27+
$this->modificationService = $modificationService;
28+
}
29+
30+
/**
31+
* @param \Pterodactyl\Http\Requests\Api\Application\Servers\UpdateServerDetailsRequest $request
32+
* @param \Pterodactyl\Models\Server $server
33+
* @return array
34+
*
35+
* @throws \Pterodactyl\Exceptions\DisplayException
36+
* @throws \Pterodactyl\Exceptions\Model\DataValidationException
37+
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
38+
*/
39+
public function details(UpdateServerDetailsRequest $request, Server $server): array
40+
{
41+
$server = $this->modificationService->returnUpdatedModel()->handle($server, $request->validated());
42+
43+
return $this->fractal->item($server)
44+
->transformWith($this->getTransformer(ServerTransformer::class))
45+
->toArray();
46+
}
47+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?php
2+
3+
namespace Pterodactyl\Http\Requests\Api\Application\Servers;
4+
5+
use Pterodactyl\Models\Server;
6+
7+
class UpdateServerDetailsRequest extends ServerWriteRequest
8+
{
9+
/**
10+
* Rules to apply to a server details update request.
11+
*
12+
* @return array
13+
*/
14+
public function rules(): array
15+
{
16+
$rules = Server::getUpdateRulesForId($this->route()->parameter('server')->id);
17+
18+
return [
19+
'name' => $rules['name'],
20+
'user' => $rules['owner_id'],
21+
'description' => $rules['description'],
22+
];
23+
}
24+
25+
/**
26+
* Convert the posted data into the correct format that is expected
27+
* by the application.
28+
*
29+
* @return array
30+
*/
31+
public function validated(): array
32+
{
33+
return [
34+
'name' => $this->input('name'),
35+
'owner_id' => $this->input('user'),
36+
'description' => $this->input('description'),
37+
];
38+
}
39+
40+
/**
41+
* Rename some of the attributes in error messages to clarify the field
42+
* being discussed.
43+
*
44+
* @return array
45+
*/
46+
public function attributes(): array
47+
{
48+
return [
49+
'user' => 'User ID',
50+
'name' => 'Server Name',
51+
];
52+
}
53+
}

app/Models/Server.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ class Server extends Model implements CleansAttributes, ValidableContract
8080
*/
8181
protected static $dataIntegrityRules = [
8282
'owner_id' => 'exists:users,id',
83-
'name' => 'regex:/^([\w .-]{1,200})$/',
83+
'name' => 'string|min:1|max:255',
8484
'node_id' => 'exists:nodes,id',
8585
'description' => 'string',
8686
'memory' => 'numeric|min:0',
Lines changed: 16 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,148 +1,86 @@
11
<?php
2-
/**
3-
* Pterodactyl - Panel
4-
* Copyright (c) 2015 - 2017 Dane Everitt <dane@daneeveritt.com>.
5-
*
6-
* This software is licensed under the terms of the MIT license.
7-
* https://opensource.org/licenses/MIT
8-
*/
92

103
namespace Pterodactyl\Services\Servers;
114

12-
use Illuminate\Log\Writer;
135
use Pterodactyl\Models\Server;
14-
use GuzzleHttp\Exception\RequestException;
156
use Illuminate\Database\ConnectionInterface;
16-
use Pterodactyl\Exceptions\DisplayException;
7+
use Pterodactyl\Traits\Services\ReturnsUpdatedModels;
178
use Pterodactyl\Repositories\Eloquent\ServerRepository;
189
use Pterodactyl\Services\DaemonKeys\DaemonKeyCreationService;
1910
use Pterodactyl\Services\DaemonKeys\DaemonKeyDeletionService;
20-
use Pterodactyl\Repositories\Daemon\ServerRepository as DaemonServerRepository;
2111

2212
class DetailsModificationService
2313
{
24-
/**
25-
* @var \Illuminate\Database\ConnectionInterface
26-
*/
27-
protected $connection;
14+
use ReturnsUpdatedModels;
2815

2916
/**
30-
* @var \Pterodactyl\Repositories\Daemon\ServerRepository
17+
* @var \Illuminate\Database\ConnectionInterface
3118
*/
32-
protected $daemonServerRepository;
19+
private $connection;
3320

3421
/**
3522
* @var \Pterodactyl\Services\DaemonKeys\DaemonKeyCreationService
3623
*/
37-
protected $keyCreationService;
24+
private $keyCreationService;
3825

3926
/**
4027
* @var \Pterodactyl\Services\DaemonKeys\DaemonKeyDeletionService
4128
*/
42-
protected $keyDeletionService;
29+
private $keyDeletionService;
4330

4431
/**
4532
* @var \Pterodactyl\Repositories\Eloquent\ServerRepository
4633
*/
47-
protected $repository;
48-
49-
/**
50-
* @var \Illuminate\Log\Writer
51-
*/
52-
protected $writer;
34+
private $repository;
5335

5436
/**
5537
* DetailsModificationService constructor.
5638
*
5739
* @param \Illuminate\Database\ConnectionInterface $connection
5840
* @param \Pterodactyl\Services\DaemonKeys\DaemonKeyCreationService $keyCreationService
5941
* @param \Pterodactyl\Services\DaemonKeys\DaemonKeyDeletionService $keyDeletionService
60-
* @param \Pterodactyl\Repositories\Daemon\ServerRepository $daemonServerRepository
6142
* @param \Pterodactyl\Repositories\Eloquent\ServerRepository $repository
62-
* @param \Illuminate\Log\Writer $writer
6343
*/
6444
public function __construct(
6545
ConnectionInterface $connection,
6646
DaemonKeyCreationService $keyCreationService,
6747
DaemonKeyDeletionService $keyDeletionService,
68-
DaemonServerRepository $daemonServerRepository,
69-
ServerRepository $repository,
70-
Writer $writer
48+
ServerRepository $repository
7149
) {
7250
$this->connection = $connection;
73-
$this->daemonServerRepository = $daemonServerRepository;
7451
$this->keyCreationService = $keyCreationService;
7552
$this->keyDeletionService = $keyDeletionService;
7653
$this->repository = $repository;
77-
$this->writer = $writer;
7854
}
7955

8056
/**
8157
* Update the details for a single server instance.
8258
*
83-
* @param int|\Pterodactyl\Models\Server $server
84-
* @param array $data
59+
* @param \Pterodactyl\Models\Server $server
60+
* @param array $data
61+
* @return bool|\Pterodactyl\Models\Server
8562
*
8663
* @throws \Pterodactyl\Exceptions\DisplayException
8764
* @throws \Pterodactyl\Exceptions\Model\DataValidationException
8865
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
8966
*/
90-
public function edit($server, array $data)
67+
public function handle(Server $server, array $data)
9168
{
92-
if (! $server instanceof Server) {
93-
$server = $this->repository->find($server);
94-
}
95-
9669
$this->connection->beginTransaction();
97-
$this->repository->withoutFreshModel()->update($server->id, [
70+
71+
$response = $this->repository->setFreshModel($this->getUpdatedModel())->update($server->id, [
9872
'owner_id' => array_get($data, 'owner_id'),
9973
'name' => array_get($data, 'name'),
10074
'description' => array_get($data, 'description', ''),
10175
], true, true);
10276

103-
if (array_get($data, 'owner_id') != $server->owner_id) {
77+
if ((int) array_get($data, 'owner_id', 0) !== (int) $server->owner_id) {
10478
$this->keyDeletionService->handle($server, $server->owner_id);
10579
$this->keyCreationService->handle($server->id, array_get($data, 'owner_id'));
10680
}
10781

10882
$this->connection->commit();
109-
}
11083

111-
/**
112-
* Update the docker container for a specified server.
113-
*
114-
* @param int|\Pterodactyl\Models\Server $server
115-
* @param string $image
116-
*
117-
* @throws \Pterodactyl\Exceptions\DisplayException
118-
* @throws \Pterodactyl\Exceptions\Model\DataValidationException
119-
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
120-
*/
121-
public function setDockerImage($server, $image)
122-
{
123-
if (! $server instanceof Server) {
124-
$server = $this->repository->find($server);
125-
}
126-
127-
$this->connection->beginTransaction();
128-
$this->repository->withoutFreshModel()->update($server->id, ['image' => $image]);
129-
130-
try {
131-
$this->daemonServerRepository->setServer($server)->update([
132-
'build' => [
133-
'image' => $image,
134-
],
135-
]);
136-
} catch (RequestException $exception) {
137-
$this->connection->rollBack();
138-
$response = $exception->getResponse();
139-
$this->writer->warning($exception);
140-
141-
throw new DisplayException(trans('admin/server.exceptions.daemon_exception', [
142-
'code' => is_null($response) ? 'E_CONN_REFUSED' : $response->getStatusCode(),
143-
]));
144-
}
145-
146-
$this->connection->commit();
84+
return $response;
14785
}
14886
}

routes/api-application.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@
7272
Route::get('/', 'Servers\ServerController@index')->name('api.application.servers');
7373
Route::get('/{server}', 'Servers\ServerController@view')->name('api.application.servers.view');
7474

75+
Route::patch('/{server}/details', 'Servers\ServerDetailsController@details')->name('api.application.servers.details');
76+
7577
Route::post('/{server}/suspend', 'Servers\ServerManagementController@suspend')->name('api.application.servers.suspend');
7678
Route::post('/{server}/unsuspend', 'Servers\ServerManagementController@unsuspend')->name('api.application.servers.unsuspend');
7779
Route::post('/{server}/reinstall', 'Servers\ServerManagementController@reinstall')->name('api.application.servers.reinstall');

0 commit comments

Comments
 (0)