Path: blob/1.0-develop/app/Http/Requests/Api/Application/Servers/StoreServerRequest.php
10284 views
<?php12namespace Pterodactyl\Http\Requests\Api\Application\Servers;34use Pterodactyl\Models\Server;5use Illuminate\Validation\Rule;6use Illuminate\Validation\Validator;7use Pterodactyl\Services\Acl\Api\AdminAcl;8use Pterodactyl\Models\Objects\DeploymentObject;9use Pterodactyl\Http\Requests\Api\Application\ApplicationApiRequest;1011class StoreServerRequest extends ApplicationApiRequest12{13protected ?string $resource = AdminAcl::RESOURCE_SERVERS;1415protected int $permission = AdminAcl::WRITE;1617/**18* Rules to be applied to this request.19*/20public function rules(): array21{22$rules = Server::getRules();2324return [25'external_id' => $rules['external_id'],26'name' => $rules['name'],27'description' => array_merge(['nullable'], $rules['description']),28'user' => $rules['owner_id'],29'egg' => $rules['egg_id'],30'docker_image' => $rules['image'],31'startup' => $rules['startup'],32'environment' => 'present|array',33'skip_scripts' => 'sometimes|boolean',34'oom_disabled' => 'sometimes|boolean',3536// Resource limitations37'limits' => 'required|array',38'limits.memory' => $rules['memory'],39'limits.swap' => $rules['swap'],40'limits.disk' => $rules['disk'],41'limits.io' => $rules['io'],42'limits.threads' => $rules['threads'],43'limits.cpu' => $rules['cpu'],4445// Application Resource Limits46'feature_limits' => 'required|array',47'feature_limits.databases' => $rules['database_limit'],48'feature_limits.allocations' => $rules['allocation_limit'],49'feature_limits.backups' => $rules['backup_limit'],5051// Placeholders for rules added in withValidator() function.52'allocation.default' => '',53'allocation.additional.*' => '',5455// Automatic deployment rules56'deploy' => 'sometimes|required|array',57'deploy.locations' => 'array',58'deploy.locations.*' => 'integer|min:1',59'deploy.dedicated_ip' => 'required_with:deploy,boolean',60'deploy.port_range' => 'array',61'deploy.port_range.*' => 'string',6263'start_on_completion' => 'sometimes|boolean',64];65}6667/**68* Normalize the data into a format that can be consumed by the service.69*/70public function validated($key = null, $default = null): array71{72$data = parent::validated();7374return [75'external_id' => array_get($data, 'external_id'),76'name' => array_get($data, 'name'),77'description' => array_get($data, 'description'),78'owner_id' => array_get($data, 'user'),79'egg_id' => array_get($data, 'egg'),80'image' => array_get($data, 'docker_image'),81'startup' => array_get($data, 'startup'),82'environment' => array_get($data, 'environment'),83'memory' => array_get($data, 'limits.memory'),84'swap' => array_get($data, 'limits.swap'),85'disk' => array_get($data, 'limits.disk'),86'io' => array_get($data, 'limits.io'),87'cpu' => array_get($data, 'limits.cpu'),88'threads' => array_get($data, 'limits.threads'),89'skip_scripts' => array_get($data, 'skip_scripts', false),90'allocation_id' => array_get($data, 'allocation.default'),91'allocation_additional' => array_get($data, 'allocation.additional'),92'start_on_completion' => array_get($data, 'start_on_completion', false),93'database_limit' => array_get($data, 'feature_limits.databases'),94'allocation_limit' => array_get($data, 'feature_limits.allocations'),95'backup_limit' => array_get($data, 'feature_limits.backups'),96'oom_disabled' => array_get($data, 'oom_disabled'),97];98}99100/*101* Run validation after the rules above have been applied.102*103* @param \Illuminate\Validation\Validator $validator104*/105public function withValidator(Validator $validator): void106{107$validator->sometimes('allocation.default', [108'required', 'integer', 'bail',109Rule::exists('allocations', 'id')->where(function ($query) {110$query->whereNull('server_id');111}),112], function ($input) {113return !$input->deploy;114});115116$validator->sometimes('allocation.additional.*', [117'integer',118Rule::exists('allocations', 'id')->where(function ($query) {119$query->whereNull('server_id');120}),121], function ($input) {122return !$input->deploy;123});124125$validator->sometimes('deploy.locations', 'present', function ($input) {126return $input->deploy;127});128129$validator->sometimes('deploy.port_range', 'present', function ($input) {130return $input->deploy;131});132}133134/**135* Return a deployment object that can be passed to the server creation service.136*/137public function getDeploymentObject(): ?DeploymentObject138{139if (is_null($this->input('deploy'))) {140return null;141}142143$object = new DeploymentObject();144$object->setDedicated($this->input('deploy.dedicated_ip', false));145$object->setLocations($this->input('deploy.locations', []));146$object->setPorts($this->input('deploy.port_range', []));147148return $object;149}150}151152153