make(StartupCommandService::class); return [ 'server_owner' => $this->getKey()->user_id === $server->owner_id, 'identifier' => $server->uuidShort, 'internal_id' => $server->id, 'uuid' => $server->uuid, 'name' => $server->name, 'node' => $server->node->name, 'sftp_details' => [ 'ip' => $server->node->fqdn, 'port' => $server->node->daemonSFTP, ], 'description' => $server->description, 'limits' => [ 'memory' => $server->memory, 'swap' => $server->swap, 'disk' => $server->disk, 'io' => $server->io, 'cpu' => $server->cpu, ], 'invocation' => $service->handle($server, !$this->getUser()->can(Permission::ACTION_STARTUP_READ, $server)), 'docker_image' => $server->image, 'egg_features' => $server->egg->inherit_features, 'feature_limits' => [ 'databases' => $server->database_limit, 'allocations' => $server->allocation_limit, 'backups' => $server->backup_limit, ], 'is_suspended' => $server->suspended, 'is_installing' => $server->installed !== 1, 'is_transferring' => !is_null($server->transfer), ]; } /** * Returns the allocations associated with this server. * * @return \League\Fractal\Resource\Collection|\League\Fractal\Resource\NullResource * * @throws \Pterodactyl\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeAllocations(Server $server) { $transformer = $this->makeTransformer(AllocationTransformer::class); // While we include this permission, we do need to actually handle it slightly different here // for the purpose of keeping things functionally working. If the user doesn't have read permissions // for the allocations we'll only return the primary server allocation, and any notes associated // with it will be hidden. // // This allows us to avoid too much permission regression, without also hiding information that // is generally needed for the frontend to make sense when browsing or searching results. if (!$this->getUser()->can(Permission::ACTION_ALLOCATION_READ, $server)) { $primary = clone $server->allocation; $primary->notes = null; return $this->collection([$primary], $transformer, Allocation::RESOURCE_NAME); } return $this->collection($server->allocations, $transformer, Allocation::RESOURCE_NAME); } /** * @return \League\Fractal\Resource\Collection|\League\Fractal\Resource\NullResource * * @throws \Pterodactyl\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeVariables(Server $server) { if (!$this->getUser()->can(Permission::ACTION_STARTUP_READ, $server)) { return $this->null(); } return $this->collection( $server->variables->where('user_viewable', true), $this->makeTransformer(EggVariableTransformer::class), EggVariable::RESOURCE_NAME ); } /** * Returns the egg associated with this server. * * @return \League\Fractal\Resource\Item * * @throws \Pterodactyl\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeEgg(Server $server) { return $this->item($server->egg, $this->makeTransformer(EggTransformer::class), Egg::RESOURCE_NAME); } /** * Returns the subusers associated with this server. * * @return \League\Fractal\Resource\Collection|\League\Fractal\Resource\NullResource * * @throws \Pterodactyl\Exceptions\Transformer\InvalidTransformerLevelException */ public function includeSubusers(Server $server) { if (!$this->getUser()->can(Permission::ACTION_USER_READ, $server)) { return $this->null(); } return $this->collection($server->subusers, $this->makeTransformer(SubuserTransformer::class), Subuser::RESOURCE_NAME); } }