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) { $validated = $request->validated(); // Handle address_ids separately $addressIds = $validated['address_ids'] ?? null; unset($validated['address_ids']); // Ensure rate_limit is always present in update data to avoid validation errors if (!isset($validated['rate_limit'])) { $validated['rate_limit'] = $server->rate_limit; } // Update server with validated data $server->update($validated); $this->networkService->updateAddresses($server, $addressIds ?? []); 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(); } }