diff --git a/app/Filament/Admin/Resources/ServerResource/Pages/EditServer.php b/app/Filament/Admin/Resources/ServerResource/Pages/EditServer.php index 493c8dfd0..18e6fecc2 100644 --- a/app/Filament/Admin/Resources/ServerResource/Pages/EditServer.php +++ b/app/Filament/Admin/Resources/ServerResource/Pages/EditServer.php @@ -55,6 +55,7 @@ use Filament\Resources\Pages\EditRecord; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; use Illuminate\Http\Client\ConnectionException; +use Illuminate\Support\Arr; use Illuminate\Support\Facades\Validator; use Illuminate\Support\HtmlString; use LogicException; @@ -921,7 +922,7 @@ class EditServer extends EditRecord ->modalheading(trans('admin/server.transfer')) ->action(function (TransferServerService $transfer, Server $server, $data) { try { - $transfer->handle($server, $data); + $transfer->handle($server, Arr::get($data, 'node_id'), Arr::get($data, 'allocation_id'), Arr::get($data, 'allocation_additional', [])); Notification::make() ->title('Transfer started') diff --git a/app/Http/Controllers/Api/Application/Servers/ServerManagementController.php b/app/Http/Controllers/Api/Application/Servers/ServerManagementController.php index 09a9c689d..bd6babb41 100644 --- a/app/Http/Controllers/Api/Application/Servers/ServerManagementController.php +++ b/app/Http/Controllers/Api/Application/Servers/ServerManagementController.php @@ -13,6 +13,7 @@ use App\Services\Servers\TransferServerService; use Dedoc\Scramble\Attributes\Group; use Illuminate\Http\Client\ConnectionException; use Illuminate\Http\Response; +use Illuminate\Support\Arr; #[Group('Server', weight: 4)] class ServerManagementController extends ApplicationApiController @@ -82,15 +83,24 @@ class ServerManagementController extends ApplicationApiController $validatedData = $request->validate([ 'node_id' => 'required|exists:nodes,id', 'allocation_id' => 'required|bail|unique:servers|exists:allocations,id', - 'allocation_additional' => 'nullable', + 'allocation_additional' => 'nullable|array', + 'allocation_additional.*' => 'integer|exists:allocations,id', ]); - if ($this->transferServerService->handle($server, $validatedData)) { - // Transfer started + if ($this->transferServerService->handle($server, Arr::get($validatedData, 'node_id'), Arr::get($validatedData, 'allocation_id'), Arr::get($validatedData, 'allocation_additional', []))) { + /** + * Transfer started + * + * @status 204 + */ return $this->returnNoContent(); } - // Node was not viable + /** + * Node was not viable + * + * @status 406 + */ return $this->returnNotAcceptable(); } @@ -104,7 +114,11 @@ class ServerManagementController extends ApplicationApiController public function cancelTransfer(ServerWriteRequest $request, Server $server): Response { if (!$transfer = $server->transfer) { - // Server is not transferring + /** + * Server is not transferring + * + * @status 406 + */ return $this->returnNotAcceptable(); } @@ -113,6 +127,11 @@ class ServerManagementController extends ApplicationApiController $this->daemonServerRepository->setServer($server)->cancelTransfer(); + /** + * Transfer cancelled + * + * @status 204 + */ return $this->returnNoContent(); } } diff --git a/app/Services/Servers/TransferServerService.php b/app/Services/Servers/TransferServerService.php index dec6d435a..f394f4c7c 100644 --- a/app/Services/Servers/TransferServerService.php +++ b/app/Services/Servers/TransferServerService.php @@ -22,37 +22,28 @@ class TransferServerService private NodeJWTService $nodeJWTService, ) {} - private function notify(Server $server, Plain $token): void + private function notify(ServerTransfer $transfer, Plain $token): void { - Http::daemon($server->node)->post('/api/transfer', [ - 'json' => [ - 'server_id' => $server->uuid, - 'url' => $server->node->getConnectionAddress() . "/api/servers/$server->uuid/archive", - 'token' => 'Bearer ' . $token->toString(), - 'server' => [ - 'uuid' => $server->uuid, - 'start_on_completion' => false, - ], + Http::daemon($transfer->oldNode)->post("/api/servers/{$transfer->server->uuid}/transfer", [ + 'url' => $transfer->newNode->getConnectionAddress() . '/api/transfers', + 'token' => 'Bearer ' . $token->toString(), + 'server' => [ + 'uuid' => $transfer->server->uuid, + 'start_on_completion' => false, ], - ])->toPsrResponse(); + ]); } /** * Starts a transfer of a server to a new node. * - * @param array{ - * allocation_id: int, - * node_id: int, - * allocation_additional?: ?int[], - * } $data + * @param int[] $additional_allocations * * @throws \Throwable */ - public function handle(Server $server, array $data): bool + public function handle(Server $server, int $node_id, int $allocation_id, array $additional_allocations): bool { - $node_id = $data['node_id']; - $allocation_id = intval($data['allocation_id']); - $additional_allocations = array_map(intval(...), $data['allocation_additional'] ?? []); + $additional_allocations = array_map(intval(...), $additional_allocations); // Check if the node is viable for the transfer. $node = Node::query() @@ -94,7 +85,7 @@ class TransferServerService ->handle($transfer->newNode, $server->uuid, 'sha256'); // Notify the source node of the pending outgoing transfer. - $this->notify($server, $token); + $this->notify($transfer, $token); return $transfer; });