From 9a9868a964cdfc01c2f089466385d68648d562a0 Mon Sep 17 00:00:00 2001 From: ste87 Date: Sat, 14 Mar 2026 16:43:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E8=87=B3?= =?UTF-8?q?=20Speed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Speed/ServerController.php | 151 +++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 Speed/ServerController.php diff --git a/Speed/ServerController.php b/Speed/ServerController.php new file mode 100644 index 0000000..354268d --- /dev/null +++ b/Speed/ServerController.php @@ -0,0 +1,151 @@ +with(['addresses', 'user', 'node']) + ->defaultSort('-id') + ->allowedFilters( + [ + AllowedFilter::custom( + '*', new FiltersServerWildcard(), + ), + AllowedFilter::custom( + 'address_pool_id', + new FiltersServerByAddressPoolId(), + ), + AllowedFilter::exact('node_id'), + AllowedFilter::exact('user_id'), + 'name', + ], + ) + ->paginate(min($request->query('per_page', 50), 100))->appends( + $request->query(), + ); + + return fractal($servers, new ServerBuildTransformer())->parseIncludes($request->include) + ->respond(); + } + + public function show(Request $request, Server $server) + { + $server->load(['addresses', 'user', 'node']); + + return fractal($server, new ServerBuildTransformer())->parseIncludes($request->include) + ->respond(); + } + + public function store(StoreServerRequest $request) + { + $server = $this->creationService->handle($request->validated()); + + $server->load(['addresses', 'user', 'node']); + + return fractal($server, new ServerBuildTransformer())->parseIncludes(['user', 'node']) + ->respond(); + } + + public function update(UpdateGeneralInfoRequest $request, Server $server) + { + $this->connection->transaction(function () use ($request, $server) { + if ($request->hostname !== $server->hostname && !empty($request->hostname)) { + try { + $this->cloudinitService->updateHostname($server, $request->hostname); + } catch (ProxmoxConnectionException) { + throw new ServiceUnavailableHttpException( + message: "Server {$server->uuid} failed to sync hostname.", + ); + } + } + + $server->update($request->validated()); + }); + + $server->load(['addresses', 'user', 'node']); + + return fractal($server, new ServerBuildTransformer())->parseIncludes(['user', 'node']) + ->respond(); + } + + public function updateBuild(UpdateBuildRequest $request, Server $server) + { + $server->update($request->safe()->except('address_ids')); + + $this->networkService->updateAddresses($server, $request->address_ids ?? []); + + try { + $this->buildModificationService->handle($server); + } catch (ProxmoxConnectionException $e) { + // do nothing + } + + $server->load(['addresses', 'user', 'node']); + + return fractal($server, new ServerBuildTransformer())->parseIncludes(['user', 'node']) + ->respond(); + } + + public function suspend(Server $server) + { + $this->suspensionService->toggle($server); + + return $this->returnNoContent(); + } + + public function unsuspend(Server $server) + { + $this->suspensionService->toggle($server, SuspensionAction::UNSUSPEND); + + return $this->returnNoContent(); + } + + public function destroy(Request $request, Server $server) + { + $this->connection->transaction(function () use ($server, $request) { + $server->update(['status' => Status::DELETING->value]); + + $this->deletionService->handle($server, $request->input('no_purge', false)); + }); + + return $this->returnNoContent(); + } +}