diff --git a/app/Http/Controllers/Api/Remote/ActivityProcessingController.php b/app/Http/Controllers/Api/Remote/ActivityProcessingController.php index ab84eb626..1dae9407a 100644 --- a/app/Http/Controllers/Api/Remote/ActivityProcessingController.php +++ b/app/Http/Controllers/Api/Remote/ActivityProcessingController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\Api\Remote; +use App\Models\Node; use Carbon\Carbon; use Illuminate\Support\Str; use App\Models\User; @@ -14,7 +15,7 @@ class ActivityProcessingController extends Controller { public function __invoke(ActivityEventRequest $request): void { - /** @var \App\Models\Node $node */ + /** @var Node $node */ $node = $request->attributes->get('node'); $servers = $node->servers()->whereIn('uuid', $request->servers())->get()->keyBy('uuid'); @@ -22,7 +23,7 @@ class ActivityProcessingController extends Controller $logs = []; foreach ($request->input('data') as $datum) { - /** @var \App\Models\Server|null $server */ + /** @var Server|null $server */ $server = $servers->get($datum['server']); if (is_null($server) || !Str::startsWith($datum['event'], 'server:')) { continue; diff --git a/app/Http/Controllers/Api/Remote/Servers/ServerContainersController.php b/app/Http/Controllers/Api/Remote/Servers/ServerContainersController.php index 84b6b5473..bd500536b 100644 --- a/app/Http/Controllers/Api/Remote/Servers/ServerContainersController.php +++ b/app/Http/Controllers/Api/Remote/Servers/ServerContainersController.php @@ -2,7 +2,7 @@ namespace App\Http\Controllers\Api\Remote\Servers; -use Illuminate\Http\Request; +use App\Http\Requests\Api\Remote\ServerRequest; use App\Models\Server; use Illuminate\Http\JsonResponse; use App\Http\Controllers\Controller; @@ -12,11 +12,11 @@ class ServerContainersController extends Controller /** * Updates the server container's status on the Panel */ - public function status(Server $server, Request $request): JsonResponse + public function status(ServerRequest $request, Server $server): JsonResponse { $status = fluent($request->json()->all())->get('data.new_state'); - cache()->put("servers.$server->uuid.container.status", $status, now()->addHour()); + cache()->put("servers.$server->uuid.status", $status, now()->addHour()); return new JsonResponse([]); } diff --git a/app/Http/Controllers/Api/Remote/Servers/ServerDetailsController.php b/app/Http/Controllers/Api/Remote/Servers/ServerDetailsController.php index ba32d5553..52828487c 100644 --- a/app/Http/Controllers/Api/Remote/Servers/ServerDetailsController.php +++ b/app/Http/Controllers/Api/Remote/Servers/ServerDetailsController.php @@ -3,7 +3,10 @@ namespace App\Http\Controllers\Api\Remote\Servers; use App\Enums\ServerState; +use App\Http\Requests\Api\Remote\ServerRequest; +use App\Models\ActivityLog; use App\Models\Backup; +use App\Models\Node; use Illuminate\Http\Request; use App\Models\Server; use Illuminate\Http\JsonResponse; @@ -29,7 +32,7 @@ class ServerDetailsController extends Controller * Returns details about the server that allows daemon to self-recover and ensure * that the state of the server matches the Panel at all times. */ - public function __invoke(Server $server): JsonResponse + public function __invoke(ServerRequest $request, Server $server): JsonResponse { return new JsonResponse([ 'settings' => $this->configurationStructureService->handle($server), @@ -42,7 +45,7 @@ class ServerDetailsController extends Controller */ public function list(Request $request): ServerConfigurationCollection { - /** @var \App\Models\Node $node */ + /** @var Node $node */ $node = $request->attributes->get('node'); // Avoid run-away N+1 SQL queries by preloading the relationships that are used @@ -85,9 +88,9 @@ class ServerDetailsController extends Controller ->get(); $this->connection->transaction(function () use ($node, $servers) { - /** @var \App\Models\Server $server */ + /** @var Server $server */ foreach ($servers as $server) { - /** @var \App\Models\ActivityLog|null $activity */ + /** @var ActivityLog|null $activity */ $activity = $server->activity->first(); if (!$activity) { continue; diff --git a/app/Http/Controllers/Api/Remote/Servers/ServerInstallController.php b/app/Http/Controllers/Api/Remote/Servers/ServerInstallController.php index 513d26ef3..eec5744ea 100644 --- a/app/Http/Controllers/Api/Remote/Servers/ServerInstallController.php +++ b/app/Http/Controllers/Api/Remote/Servers/ServerInstallController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers\Api\Remote\Servers; use App\Enums\ServerState; +use App\Http\Requests\Api\Remote\ServerRequest; use Illuminate\Http\Response; use App\Models\Server; use Illuminate\Http\JsonResponse; @@ -15,14 +16,12 @@ class ServerInstallController extends Controller /** * Returns installation information for a server. */ - public function index(Server $server): JsonResponse + public function index(ServerRequest $request, Server $server): JsonResponse { - $egg = $server->egg; - return new JsonResponse([ - 'container_image' => $egg->copy_script_container, - 'entrypoint' => $egg->copy_script_entry, - 'script' => $egg->copy_script_install, + 'container_image' => $server->egg->copy_script_container, + 'entrypoint' => $server->egg->copy_script_entry, + 'script' => $server->egg->copy_script_install, ]); } diff --git a/app/Http/Controllers/Api/Remote/Servers/ServerTransferController.php b/app/Http/Controllers/Api/Remote/Servers/ServerTransferController.php index 514f7f60f..c49b9e534 100644 --- a/app/Http/Controllers/Api/Remote/Servers/ServerTransferController.php +++ b/app/Http/Controllers/Api/Remote/Servers/ServerTransferController.php @@ -2,12 +2,12 @@ namespace App\Http\Controllers\Api\Remote\Servers; +use App\Http\Requests\Api\Remote\ServerRequest; use App\Models\Server; use App\Repositories\Daemon\DaemonServerRepository; use Illuminate\Http\Response; use Illuminate\Http\JsonResponse; use App\Models\Allocation; -use App\Models\ServerTransfer; use Illuminate\Database\ConnectionInterface; use App\Http\Controllers\Controller; use Symfony\Component\HttpKernel\Exception\ConflictHttpException; @@ -28,14 +28,23 @@ class ServerTransferController extends Controller * * @throws \Throwable */ - public function failure(Server $server): JsonResponse + public function failure(ServerRequest $request, Server $server): JsonResponse { $transfer = $server->transfer; if (is_null($transfer)) { throw new ConflictHttpException('Server is not being transferred.'); } - return $this->processFailedTransfer($transfer); + $this->connection->transaction(function () use ($transfer) { + $transfer->forceFill(['successful' => false])->saveOrFail(); + + if ($transfer->new_allocation || $transfer->new_additional_allocations) { + $allocations = array_merge([$transfer->new_allocation], $transfer->new_additional_allocations); + Allocation::query()->whereIn('id', $allocations)->update(['server_id' => null]); + } + }); + + return new JsonResponse([], Response::HTTP_NO_CONTENT); } /** @@ -43,16 +52,17 @@ class ServerTransferController extends Controller * * @throws \Throwable */ - public function success(Server $server): JsonResponse + public function success(ServerRequest $request, Server $server): JsonResponse { $transfer = $server->transfer; if (is_null($transfer)) { throw new ConflictHttpException('Server is not being transferred.'); } - $data = []; - /** @var \App\Models\Server $server */ - $server = $this->connection->transaction(function () use ($server, $transfer, $data) { + /** @var Server $server */ + $server = $this->connection->transaction(function () use ($server, $transfer) { + $data = []; + if ($transfer->old_allocation || $transfer->old_additional_allocations) { $allocations = array_merge([$transfer->old_allocation], $transfer->old_additional_allocations); // Remove the old allocations for the server and re-assign the server to the new @@ -60,6 +70,7 @@ class ServerTransferController extends Controller Allocation::query()->whereIn('id', $allocations)->update(['server_id' => null]); $data['allocation_id'] = $transfer->new_allocation; } + $data['node_id'] = $transfer->new_node; $server->update($data); @@ -82,24 +93,4 @@ class ServerTransferController extends Controller return new JsonResponse([], Response::HTTP_NO_CONTENT); } - - /** - * Release all the reserved allocations for this transfer and mark it as failed in - * the database. - * - * @throws \Throwable - */ - protected function processFailedTransfer(ServerTransfer $transfer): JsonResponse - { - $this->connection->transaction(function () use (&$transfer) { - $transfer->forceFill(['successful' => false])->saveOrFail(); - - if ($transfer->new_allocation || $transfer->new_additional_allocations) { - $allocations = array_merge([$transfer->new_allocation], $transfer->new_additional_allocations); - Allocation::query()->whereIn('id', $allocations)->update(['server_id' => null]); - } - }); - - return new JsonResponse([], Response::HTTP_NO_CONTENT); - } } diff --git a/app/Http/Requests/Api/Remote/InstallationDataRequest.php b/app/Http/Requests/Api/Remote/InstallationDataRequest.php index 99adcef5f..59d52c978 100644 --- a/app/Http/Requests/Api/Remote/InstallationDataRequest.php +++ b/app/Http/Requests/Api/Remote/InstallationDataRequest.php @@ -2,15 +2,8 @@ namespace App\Http\Requests\Api\Remote; -use Illuminate\Foundation\Http\FormRequest; - -class InstallationDataRequest extends FormRequest +class InstallationDataRequest extends ServerRequest { - public function authorize(): bool - { - return true; - } - /** * @return array */ diff --git a/app/Http/Requests/Api/Remote/ServerRequest.php b/app/Http/Requests/Api/Remote/ServerRequest.php new file mode 100644 index 000000000..32e1d2b1e --- /dev/null +++ b/app/Http/Requests/Api/Remote/ServerRequest.php @@ -0,0 +1,21 @@ +attributes->get('node'); + + /** @var ?Server $server */ + $server = $this->route()->parameter('server'); + + return $server && $server->node_id === $node->id; + } +}