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(); + } +}