From dc05d524bb2f7f107e36e964e5d8dfffafc27ca5 Mon Sep 17 00:00:00 2001 From: ste87 Date: Sat, 14 Mar 2026 16:42:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20ServerController.php?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ServerController.php | 151 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 ServerController.php diff --git a/ServerController.php b/ServerController.php new file mode 100644 index 0000000..354268d --- /dev/null +++ b/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(); + } +}