From c2b1a98d292753153de3c07fb65e4973a67e5ab4 Mon Sep 17 00:00:00 2001 From: Boy132 Date: Mon, 19 Aug 2024 08:33:53 +0200 Subject: [PATCH] Convert variable "rules" to array (#507) * convert variable "rules" to array * allow importing eggs with string rules * fix tests * update stock eggs to rules array --- .../Resources/EggResource/Pages/CreateEgg.php | 29 +++++- .../Resources/EggResource/Pages/EditEgg.php | 29 +++++- .../ServerResource/Pages/CreateServer.php | 16 ++-- .../ServerResource/Pages/EditServer.php | 20 ++-- app/Models/EggVariable.php | 9 +- .../Eggs/Sharing/EggImporterService.php | 2 + .../Variables/VariableCreationService.php | 4 +- .../Eggs/Variables/VariableUpdateService.php | 11 +-- .../Api/Client/EggVariableTransformer.php | 2 +- .../eggs/minecraft/egg-bungeecord.json | 13 ++- .../eggs/minecraft/egg-forge-minecraft.json | 24 ++++- .../Seeders/eggs/minecraft/egg-paper.json | 24 ++++- .../minecraft/egg-sponge--sponge-vanilla.json | 12 ++- .../eggs/minecraft/egg-vanilla-minecraft.json | 13 ++- database/Seeders/eggs/rust/egg-rust.json | 96 +++++++++++++++---- ...egg-counter--strike--global-offensive.json | 21 +++- .../egg-custom-source-engine-game.json | 35 +++++-- .../eggs/source-engine/egg-garrys-mod.json | 48 ++++++++-- .../eggs/source-engine/egg-insurgency.json | 12 ++- .../source-engine/egg-team-fortress2.json | 19 +++- .../eggs/voice-servers/egg-mumble-server.json | 8 +- .../voice-servers/egg-teamspeak3-server.json | 38 ++++++-- ...24_07_25_072050_convert_rules_to_array.php | 37 +++++++ .../Startup/UpdateStartupVariableTest.php | 2 +- .../Servers/VariableValidatorServiceTest.php | 2 +- 25 files changed, 408 insertions(+), 118 deletions(-) create mode 100644 database/migrations/2024_07_25_072050_convert_rules_to_array.php diff --git a/app/Filament/Resources/EggResource/Pages/CreateEgg.php b/app/Filament/Resources/EggResource/Pages/CreateEgg.php index 856963fab6..5dfa3b05f8 100644 --- a/app/Filament/Resources/EggResource/Pages/CreateEgg.php +++ b/app/Filament/Resources/EggResource/Pages/CreateEgg.php @@ -134,7 +134,7 @@ public function form(Form $form): Form ->mutateRelationshipDataBeforeCreateUsing(function (array $data): array { $data['default_value'] ??= ''; $data['description'] ??= ''; - $data['rules'] ??= ''; + $data['rules'] ??= []; $data['user_viewable'] ??= ''; $data['user_editable'] ??= ''; @@ -143,7 +143,7 @@ public function form(Form $form): Form ->mutateRelationshipDataBeforeSaveUsing(function (array $data): array { $data['default_value'] ??= ''; $data['description'] ??= ''; - $data['rules'] ??= ''; + $data['rules'] ??= []; $data['user_viewable'] ??= ''; $data['user_editable'] ??= ''; @@ -173,7 +173,30 @@ public function form(Form $form): Form Checkbox::make('user_viewable')->label('Viewable'), Checkbox::make('user_editable')->label('Editable'), ]), - Textarea::make('rules')->columnSpanFull(), + TagsInput::make('rules') + ->columnSpanFull() + ->placeholder('Add Rule') + ->reorderable() + ->suggestions([ + 'required', + 'nullable', + 'string', + 'integer', + 'numeric', + 'boolean', + 'alpha', + 'alpha_dash', + 'alpha_num', + 'url', + 'email', + 'regex:', + 'min:', + 'max:', + 'between:', + 'between:1024,65535', + 'in:', + 'in:true,false', + ]), ]), ]), Tab::make('Install Script') diff --git a/app/Filament/Resources/EggResource/Pages/EditEgg.php b/app/Filament/Resources/EggResource/Pages/EditEgg.php index acd76e4794..ee7bf5bd62 100644 --- a/app/Filament/Resources/EggResource/Pages/EditEgg.php +++ b/app/Filament/Resources/EggResource/Pages/EditEgg.php @@ -144,7 +144,7 @@ public function form(Form $form): Form ->mutateRelationshipDataBeforeCreateUsing(function (array $data): array { $data['default_value'] ??= ''; $data['description'] ??= ''; - $data['rules'] ??= ''; + $data['rules'] ??= []; $data['user_viewable'] ??= ''; $data['user_editable'] ??= ''; @@ -153,7 +153,7 @@ public function form(Form $form): Form ->mutateRelationshipDataBeforeSaveUsing(function (array $data): array { $data['default_value'] ??= ''; $data['description'] ??= ''; - $data['rules'] ??= ''; + $data['rules'] ??= []; $data['user_viewable'] ??= ''; $data['user_editable'] ??= ''; @@ -183,7 +183,30 @@ public function form(Form $form): Form Checkbox::make('user_viewable')->label('Viewable'), Checkbox::make('user_editable')->label('Editable'), ]), - TextInput::make('rules')->columnSpanFull(), + TagsInput::make('rules') + ->columnSpanFull() + ->placeholder('Add Rule') + ->reorderable() + ->suggestions([ + 'required', + 'nullable', + 'string', + 'integer', + 'numeric', + 'boolean', + 'alpha', + 'alpha_dash', + 'alpha_num', + 'url', + 'email', + 'regex:', + 'min:', + 'max:', + 'between:', + 'between:1024,65535', + 'in:', + 'in:true,false', + ]), ]), ]), Tab::make('Install Script') diff --git a/app/Filament/Resources/ServerResource/Pages/CreateServer.php b/app/Filament/Resources/ServerResource/Pages/CreateServer.php index 343c8fa0c0..9f2de64b92 100644 --- a/app/Filament/Resources/ServerResource/Pages/CreateServer.php +++ b/app/Filament/Resources/ServerResource/Pages/CreateServer.php @@ -6,6 +6,7 @@ use App\Models\Allocation; use App\Models\Egg; use App\Models\Node; +use App\Models\ServerVariable; use App\Models\User; use App\Services\Allocations\AssignmentService; use App\Services\Servers\RandomWordService; @@ -443,8 +444,7 @@ public function form(Form $form): Form $text = Forms\Components\TextInput::make('variable_value') ->hidden($this->shouldHideComponent(...)) - ->maxLength(255) - ->required(fn (Forms\Get $get) => in_array('required', explode('|', $get('rules')))) + ->required(fn (ServerVariable $serverVariable) => $serverVariable->variable->getRequiredAttribute()) ->rules( fn (Forms\Get $get): Closure => function (string $attribute, $value, Closure $fail) use ($get) { $validator = Validator::make(['validatorkey' => $value], [ @@ -806,11 +806,9 @@ protected function handleRecordCreation(array $data): Model return $service->handle($data); } - private function shouldHideComponent(Forms\Get $get, Forms\Components\Component $component): bool + private function shouldHideComponent(ServerVariable $serverVariable, Forms\Components\Component $component): bool { - $containsRuleIn = str($get('rules'))->explode('|')->reduce( - fn ($result, $value) => $result === true && !str($value)->startsWith('in:'), true - ); + $containsRuleIn = array_first($serverVariable->variable->rules, fn ($value) => str($value)->startsWith('in:'), false); if ($component instanceof Forms\Components\Select) { return $containsRuleIn; @@ -823,11 +821,9 @@ private function shouldHideComponent(Forms\Get $get, Forms\Components\Component throw new \Exception('Component type not supported: ' . $component::class); } - private function getSelectOptionsFromRules(Forms\Get $get): array + private function getSelectOptionsFromRules(ServerVariable $serverVariable): array { - $inRule = str($get('rules'))->explode('|')->reduce( - fn ($result, $value) => str($value)->startsWith('in:') ? $value : $result, '' - ); + $inRule = array_first($serverVariable->variable->rules, fn ($value) => str($value)->startsWith('in:')); return str($inRule) ->after('in:') diff --git a/app/Filament/Resources/ServerResource/Pages/EditServer.php b/app/Filament/Resources/ServerResource/Pages/EditServer.php index c8726fde54..74cfe70180 100644 --- a/app/Filament/Resources/ServerResource/Pages/EditServer.php +++ b/app/Filament/Resources/ServerResource/Pages/EditServer.php @@ -489,7 +489,7 @@ public function form(Form $form): Form $text = Forms\Components\TextInput::make('variable_value') ->hidden($this->shouldHideComponent(...)) - ->required(fn (ServerVariable $serverVariable) => in_array('required', explode('|', $serverVariable->variable->rules))) + ->required(fn (ServerVariable $serverVariable) => $serverVariable->variable->getRequiredAttribute()) ->rules([ fn (ServerVariable $serverVariable): Closure => function (string $attribute, $value, Closure $fail) use ($serverVariable) { $validator = Validator::make(['validatorkey' => $value], [ @@ -516,7 +516,7 @@ public function form(Form $form): Form ->live(onBlur: true) ->hintIcon('tabler-code') ->label(fn (ServerVariable $serverVariable) => $serverVariable->variable->name) - ->hintIconTooltip(fn (ServerVariable $serverVariable) => $serverVariable->variable->rules) + ->hintIconTooltip(fn (ServerVariable $serverVariable) => implode('|', $serverVariable->variable->rules)) ->prefix(fn (ServerVariable $serverVariable) => '{{' . $serverVariable->variable->env_variable . '}}') ->helperText(fn (ServerVariable $serverVariable) => empty($serverVariable->variable->description) ? '—' : $serverVariable->variable->description); } @@ -757,28 +757,24 @@ public function getRelationManagers(): array ]; } - private function shouldHideComponent(Forms\Get $get, Forms\Components\Component $component): bool + private function shouldHideComponent(ServerVariable $serverVariable, Forms\Components\Component $component): bool { - $containsRuleIn = str($get('rules'))->explode('|')->reduce( - fn ($result, $value) => $result === true && !str($value)->startsWith('in:'), true - ); + $containsRuleIn = array_first($serverVariable->variable->rules, fn ($value) => str($value)->startsWith('in:'), false); if ($component instanceof Forms\Components\Select) { - return $containsRuleIn; + return !$containsRuleIn; } if ($component instanceof Forms\Components\TextInput) { - return !$containsRuleIn; + return $containsRuleIn; } throw new \Exception('Component type not supported: ' . $component::class); } - private function getSelectOptionsFromRules(Forms\Get $get): array + private function getSelectOptionsFromRules(ServerVariable $serverVariable): array { - $inRule = str($get('rules'))->explode('|')->reduce( - fn ($result, $value) => str($value)->startsWith('in:') ? $value : $result, '' - ); + $inRule = array_first($serverVariable->variable->rules, fn ($value) => str($value)->startsWith('in:')); return str($inRule) ->after('in:') diff --git a/app/Models/EggVariable.php b/app/Models/EggVariable.php index c589d95341..2d3a4fb2c5 100644 --- a/app/Models/EggVariable.php +++ b/app/Models/EggVariable.php @@ -15,7 +15,7 @@ * @property string $default_value * @property bool $user_viewable * @property bool $user_editable - * @property string $rules + * @property array $rules * @property \Carbon\CarbonImmutable $created_at * @property \Carbon\CarbonImmutable $updated_at * @property bool $required @@ -58,12 +58,14 @@ class EggVariable extends Model 'default_value' => 'string', 'user_viewable' => 'boolean', 'user_editable' => 'boolean', - 'rules' => 'string', + 'rules' => 'array', + 'rules.*' => 'string', ]; protected $attributes = [ 'user_editable' => 0, 'user_viewable' => 0, + 'rules' => '[]', ]; protected function casts(): array @@ -72,6 +74,7 @@ protected function casts(): array 'egg_id' => 'integer', 'user_viewable' => 'bool', 'user_editable' => 'bool', + 'rules' => 'array', 'created_at' => 'immutable_datetime', 'updated_at' => 'immutable_datetime', ]; @@ -79,7 +82,7 @@ protected function casts(): array public function getRequiredAttribute(): bool { - return in_array('required', explode('|', $this->rules)); + return in_array('required', $this->rules); } public function egg(): HasOne diff --git a/app/Services/Eggs/Sharing/EggImporterService.php b/app/Services/Eggs/Sharing/EggImporterService.php index 1e85923d7d..dc54525a6e 100644 --- a/app/Services/Eggs/Sharing/EggImporterService.php +++ b/app/Services/Eggs/Sharing/EggImporterService.php @@ -54,6 +54,8 @@ public function fromFile(UploadedFile $file, Egg $egg = null): Egg // Update existing variables or create new ones. foreach ($parsed['variables'] ?? [] as $variable) { EggVariable::unguarded(function () use ($egg, $variable) { + $variable['rules'] = is_array($variable['rules']) ? $variable['rules'] : explode('|', $variable['rules']); + $egg->variables()->updateOrCreate([ 'env_variable' => $variable['env_variable'], ], Collection::make($variable)->except(['egg_id', 'env_variable'])->toArray()); diff --git a/app/Services/Eggs/Variables/VariableCreationService.php b/app/Services/Eggs/Variables/VariableCreationService.php index d2213f5be1..c6c7269862 100644 --- a/app/Services/Eggs/Variables/VariableCreationService.php +++ b/app/Services/Eggs/Variables/VariableCreationService.php @@ -40,7 +40,7 @@ public function handle(int $egg, array $data): EggVariable throw new ReservedVariableNameException(sprintf('Cannot use the protected name %s for this environment variable.', array_get($data, 'env_variable'))); } - if (!empty($data['rules'] ?? '')) { + if (!empty($data['rules'] ?? [])) { $this->validateRules($data['rules']); } @@ -55,7 +55,7 @@ public function handle(int $egg, array $data): EggVariable 'default_value' => $data['default_value'] ?? '', 'user_viewable' => in_array('user_viewable', $options), 'user_editable' => in_array('user_editable', $options), - 'rules' => $data['rules'] ?? '', + 'rules' => $data['rules'] ?? [], ]); return $eggVariable; diff --git a/app/Services/Eggs/Variables/VariableUpdateService.php b/app/Services/Eggs/Variables/VariableUpdateService.php index 515cbc2714..e56ae8ea74 100644 --- a/app/Services/Eggs/Variables/VariableUpdateService.php +++ b/app/Services/Eggs/Variables/VariableUpdateService.php @@ -2,7 +2,6 @@ namespace App\Services\Eggs\Variables; -use Illuminate\Support\Str; use App\Models\EggVariable; use App\Exceptions\DisplayException; use App\Traits\Services\ValidatesValidationRules; @@ -54,12 +53,8 @@ public function handle(EggVariable $variable, array $data): mixed } } - if (!empty($data['rules'] ?? '')) { - $this->validateRules( - (is_string($data['rules']) && Str::contains($data['rules'], ';;')) - ? explode(';;', $data['rules']) - : $data['rules'] - ); + if (!empty($data['rules'] ?? [])) { + $this->validateRules($data['rules']); } $options = array_get($data, 'options') ?? []; @@ -71,7 +66,7 @@ public function handle(EggVariable $variable, array $data): mixed 'default_value' => $data['default_value'] ?? '', 'user_viewable' => in_array('user_viewable', $options), 'user_editable' => in_array('user_editable', $options), - 'rules' => $data['rules'] ?? '', + 'rules' => $data['rules'] ?? [], ]); } } diff --git a/app/Transformers/Api/Client/EggVariableTransformer.php b/app/Transformers/Api/Client/EggVariableTransformer.php index bdc2fad152..141f43b618 100644 --- a/app/Transformers/Api/Client/EggVariableTransformer.php +++ b/app/Transformers/Api/Client/EggVariableTransformer.php @@ -27,7 +27,7 @@ public function transform(EggVariable $variable): array 'default_value' => $variable->default_value, 'server_value' => $variable->server_value, 'is_editable' => $variable->user_editable, - 'rules' => $variable->rules, + 'rules' => implode('|', $variable->rules), ]; } } diff --git a/database/Seeders/eggs/minecraft/egg-bungeecord.json b/database/Seeders/eggs/minecraft/egg-bungeecord.json index f9b3895601..49bc8be50b 100644 --- a/database/Seeders/eggs/minecraft/egg-bungeecord.json +++ b/database/Seeders/eggs/minecraft/egg-bungeecord.json @@ -4,7 +4,7 @@ "version": "PTDL_v2", "update_url": "https:\/\/github.com\/pelican-dev\/panel\/raw\/main\/database\/Seeders\/eggs\/minecraft\/egg-bungeecord.json" }, - "exported_at": "2024-07-03T14:33:51+00:00", + "exported_at": "2024-07-25T12:03:12+00:00", "name": "Bungeecord", "author": "panel@example.com", "uuid": "9e6b409e-4028-4947-aea8-50a2c404c271", @@ -44,7 +44,11 @@ "default_value": "latest", "user_viewable": true, "user_editable": true, - "rules": "required|alpha_num|between:1,6", + "rules": [ + "required", + "alpha_num", + "between:1,6" + ], "sort": null, "field_type": "text" }, @@ -55,7 +59,10 @@ "default_value": "bungeecord.jar", "user_viewable": true, "user_editable": true, - "rules": "required|regex:\/^([\\w\\d._-]+)(\\.jar)$\/", + "rules": [ + "required", + "regex:\/^([\\w\\d._-]+)(\\.jar)$\/" + ], "sort": null, "field_type": "text" } diff --git a/database/Seeders/eggs/minecraft/egg-forge-minecraft.json b/database/Seeders/eggs/minecraft/egg-forge-minecraft.json index 693e299db2..13afe9748a 100644 --- a/database/Seeders/eggs/minecraft/egg-forge-minecraft.json +++ b/database/Seeders/eggs/minecraft/egg-forge-minecraft.json @@ -4,7 +4,7 @@ "version": "PTDL_v2", "update_url": "https:\/\/github.com\/pelican-dev\/panel\/raw\/main\/database\/Seeders\/eggs\/minecraft\/egg-forge-minecraft.json" }, - "exported_at": "2024-07-03T14:33:51+00:00", + "exported_at": "2024-07-25T12:03:19+00:00", "name": "Forge Minecraft", "author": "panel@example.com", "uuid": "ed072427-f209-4603-875c-f540c6dd5a65", @@ -44,7 +44,10 @@ "default_value": "server.jar", "user_viewable": true, "user_editable": true, - "rules": "required|regex:\/^([\\w\\d._-]+)(\\.jar)$\/", + "rules": [ + "required", + "regex:\/^([\\w\\d._-]+)(\\.jar)$\/" + ], "sort": 1, "field_type": "text" }, @@ -55,7 +58,11 @@ "default_value": "latest", "user_viewable": true, "user_editable": true, - "rules": "required|string|max:9", + "rules": [ + "required", + "string", + "max:9" + ], "sort": 2, "field_type": "text" }, @@ -66,7 +73,11 @@ "default_value": "recommended", "user_viewable": true, "user_editable": true, - "rules": "required|string|in:recommended,latest", + "rules": [ + "required", + "string", + "in:recommended,latest" + ], "sort": 3, "field_type": "text" }, @@ -77,7 +88,10 @@ "default_value": "", "user_viewable": true, "user_editable": true, - "rules": "nullable|regex:\/^[0-9\\.\\-]+$\/", + "rules": [ + "nullable", + "regex:\/^[0-9\\.\\-]+$\/" + ], "sort": 4, "field_type": "text" } diff --git a/database/Seeders/eggs/minecraft/egg-paper.json b/database/Seeders/eggs/minecraft/egg-paper.json index 39463b0e98..d8a73b9f40 100644 --- a/database/Seeders/eggs/minecraft/egg-paper.json +++ b/database/Seeders/eggs/minecraft/egg-paper.json @@ -4,7 +4,7 @@ "version": "PTDL_v2", "update_url": "https:\/\/github.com\/pelican-dev\/panel\/raw\/main\/database\/Seeders\/eggs\/minecraft\/egg-paper.json" }, - "exported_at": "2024-07-03T14:33:52+00:00", + "exported_at": "2024-07-25T12:03:43+00:00", "name": "Paper", "author": "parker@example.com", "uuid": "5da37ef6-58da-4169-90a6-e683e1721247", @@ -44,7 +44,11 @@ "default_value": "latest", "user_viewable": true, "user_editable": true, - "rules": "nullable|string|max:20", + "rules": [ + "nullable", + "string", + "max:20" + ], "sort": 1, "field_type": "text" }, @@ -55,7 +59,10 @@ "default_value": "server.jar", "user_viewable": true, "user_editable": true, - "rules": "required|regex:\/^([\\w\\d._-]+)(\\.jar)$\/", + "rules": [ + "required", + "regex:\/^([\\w\\d._-]+)(\\.jar)$\/" + ], "sort": 2, "field_type": "text" }, @@ -66,7 +73,10 @@ "default_value": "", "user_viewable": false, "user_editable": false, - "rules": "nullable|string", + "rules": [ + "nullable", + "string" + ], "sort": 3, "field_type": "text" }, @@ -77,7 +87,11 @@ "default_value": "latest", "user_viewable": true, "user_editable": true, - "rules": "required|string|max:20", + "rules": [ + "required", + "string", + "max:20" + ], "sort": 4, "field_type": "text" } diff --git a/database/Seeders/eggs/minecraft/egg-sponge--sponge-vanilla.json b/database/Seeders/eggs/minecraft/egg-sponge--sponge-vanilla.json index 278f58a6cc..1a72aefe77 100644 --- a/database/Seeders/eggs/minecraft/egg-sponge--sponge-vanilla.json +++ b/database/Seeders/eggs/minecraft/egg-sponge--sponge-vanilla.json @@ -4,7 +4,7 @@ "version": "PTDL_v2", "update_url": "https:\/\/github.com\/pelican-dev\/panel\/raw\/main\/database\/Seeders\/eggs\/minecraft\/egg-sponge--sponge-vanilla.json" }, - "exported_at": "2024-07-03T14:34:02+00:00", + "exported_at": "2024-07-25T12:03:55+00:00", "name": "Sponge (SpongeVanilla)", "author": "panel@example.com", "uuid": "f0d2f88f-1ff3-42a0-b03f-ac44c5571e6d", @@ -44,7 +44,10 @@ "default_value": "1.12.2-7.3.0", "user_viewable": true, "user_editable": true, - "rules": "required|regex:\/^([a-zA-Z0-9.\\-_]+)$\/", + "rules": [ + "required", + "regex:\/^([a-zA-Z0-9.\\-_]+)$\/" + ], "sort": 1, "field_type": "text" }, @@ -55,7 +58,10 @@ "default_value": "server.jar", "user_viewable": true, "user_editable": true, - "rules": "required|regex:\/^([\\w\\d._-]+)(\\.jar)$\/", + "rules": [ + "required", + "regex:\/^([\\w\\d._-]+)(\\.jar)$\/" + ], "sort": 2, "field_type": "text" } diff --git a/database/Seeders/eggs/minecraft/egg-vanilla-minecraft.json b/database/Seeders/eggs/minecraft/egg-vanilla-minecraft.json index 94f2578633..71d71938e1 100644 --- a/database/Seeders/eggs/minecraft/egg-vanilla-minecraft.json +++ b/database/Seeders/eggs/minecraft/egg-vanilla-minecraft.json @@ -4,7 +4,7 @@ "version": "PTDL_v2", "update_url": "https:\/\/github.com\/pelican-dev\/panel\/raw\/main\/database\/Seeders\/eggs\/minecraft\/egg-vanilla-minecraft.json" }, - "exported_at": "2024-07-03T14:34:02+00:00", + "exported_at": "2024-07-25T12:04:05+00:00", "name": "Vanilla Minecraft", "author": "panel@example.com", "uuid": "9ac39f3d-0c34-4d93-8174-c52ab9e6c57b", @@ -44,7 +44,10 @@ "default_value": "server.jar", "user_viewable": true, "user_editable": true, - "rules": "required|regex:\/^([\\w\\d._-]+)(\\.jar)$\/", + "rules": [ + "required", + "regex:\/^([\\w\\d._-]+)(\\.jar)$\/" + ], "sort": 1, "field_type": "text" }, @@ -55,7 +58,11 @@ "default_value": "latest", "user_viewable": true, "user_editable": true, - "rules": "required|string|between:3,15", + "rules": [ + "required", + "string", + "between:3,15" + ], "sort": 2, "field_type": "text" } diff --git a/database/Seeders/eggs/rust/egg-rust.json b/database/Seeders/eggs/rust/egg-rust.json index 5b763bd7c1..e74368604a 100644 --- a/database/Seeders/eggs/rust/egg-rust.json +++ b/database/Seeders/eggs/rust/egg-rust.json @@ -4,7 +4,7 @@ "version": "PTDL_v2", "update_url": "https:\/\/github.com\/pelican-dev\/panel\/raw\/main\/database\/Seeders\/eggs\/rust\/egg-rust.json" }, - "exported_at": "2024-07-03T14:34:09+00:00", + "exported_at": "2024-07-25T12:06:17+00:00", "name": "Rust", "author": "panel@example.com", "uuid": "bace2dfb-209c-452a-9459-7d6f340b07ae", @@ -38,7 +38,11 @@ "default_value": "A Rust Server", "user_viewable": true, "user_editable": true, - "rules": "required|string|max:60", + "rules": [ + "required", + "string", + "max:60" + ], "sort": 1, "field_type": "text" }, @@ -49,7 +53,10 @@ "default_value": "vanilla", "user_viewable": true, "user_editable": true, - "rules": "required|in:vanilla,oxide,carbon", + "rules": [ + "required", + "in:vanilla,oxide,carbon" + ], "sort": 2, "field_type": "text" }, @@ -60,7 +67,11 @@ "default_value": "Procedural Map", "user_viewable": true, "user_editable": true, - "rules": "required|string|max:20", + "rules": [ + "required", + "string", + "max:20" + ], "sort": 3, "field_type": "text" }, @@ -71,7 +82,10 @@ "default_value": "Powered by Panel", "user_viewable": true, "user_editable": true, - "rules": "required|string", + "rules": [ + "required", + "string" + ], "sort": 4, "field_type": "text" }, @@ -82,7 +96,10 @@ "default_value": "http:\/\/example.com", "user_viewable": true, "user_editable": true, - "rules": "nullable|url", + "rules": [ + "nullable", + "url" + ], "sort": 5, "field_type": "text" }, @@ -93,7 +110,10 @@ "default_value": "3000", "user_viewable": true, "user_editable": true, - "rules": "required|integer", + "rules": [ + "required", + "integer" + ], "sort": 6, "field_type": "text" }, @@ -104,7 +124,10 @@ "default_value": "", "user_viewable": true, "user_editable": true, - "rules": "nullable|string", + "rules": [ + "nullable", + "string" + ], "sort": 7, "field_type": "text" }, @@ -115,7 +138,10 @@ "default_value": "40", "user_viewable": true, "user_editable": true, - "rules": "required|integer", + "rules": [ + "required", + "integer" + ], "sort": 8, "field_type": "text" }, @@ -126,7 +152,10 @@ "default_value": "", "user_viewable": true, "user_editable": true, - "rules": "nullable|url", + "rules": [ + "nullable", + "url" + ], "sort": 9, "field_type": "text" }, @@ -137,7 +166,10 @@ "default_value": "27017", "user_viewable": true, "user_editable": false, - "rules": "required|integer", + "rules": [ + "required", + "integer" + ], "sort": 10, "field_type": "text" }, @@ -148,7 +180,10 @@ "default_value": "28016", "user_viewable": true, "user_editable": false, - "rules": "required|integer", + "rules": [ + "required", + "integer" + ], "sort": 11, "field_type": "text" }, @@ -159,7 +194,11 @@ "default_value": "", "user_viewable": true, "user_editable": true, - "rules": "required|regex:\/^[\\w.-]*$\/|max:64", + "rules": [ + "required", + "regex:\/^[\\w.-]*$\/", + "max:64" + ], "sort": 12, "field_type": "text" }, @@ -170,7 +209,10 @@ "default_value": "60", "user_viewable": true, "user_editable": true, - "rules": "required|integer", + "rules": [ + "required", + "integer" + ], "sort": 13, "field_type": "text" }, @@ -181,7 +223,10 @@ "default_value": "", "user_viewable": true, "user_editable": true, - "rules": "nullable|string", + "rules": [ + "nullable", + "string" + ], "sort": 14, "field_type": "text" }, @@ -192,7 +237,10 @@ "default_value": "28082", "user_viewable": true, "user_editable": false, - "rules": "required|integer", + "rules": [ + "required", + "integer" + ], "sort": 15, "field_type": "text" }, @@ -203,7 +251,10 @@ "default_value": "", "user_viewable": true, "user_editable": true, - "rules": "nullable|url", + "rules": [ + "nullable", + "url" + ], "sort": 16, "field_type": "text" }, @@ -214,7 +265,10 @@ "default_value": "", "user_viewable": true, "user_editable": true, - "rules": "nullable|url", + "rules": [ + "nullable", + "url" + ], "sort": 17, "field_type": "text" }, @@ -225,7 +279,11 @@ "default_value": "258550", "user_viewable": false, "user_editable": false, - "rules": "required|string|in:258550", + "rules": [ + "required", + "string", + "in:258550" + ], "sort": 18, "field_type": "text" } diff --git a/database/Seeders/eggs/source-engine/egg-counter--strike--global-offensive.json b/database/Seeders/eggs/source-engine/egg-counter--strike--global-offensive.json index 6f450834c5..1c092bd213 100644 --- a/database/Seeders/eggs/source-engine/egg-counter--strike--global-offensive.json +++ b/database/Seeders/eggs/source-engine/egg-counter--strike--global-offensive.json @@ -4,7 +4,7 @@ "version": "PTDL_v2", "update_url": "https:\/\/github.com\/pelican-dev\/panel\/raw\/main\/database\/Seeders\/eggs\/source-engine\/egg-counter--strike--global-offensive.json" }, - "exported_at": "2024-07-03T14:34:03+00:00", + "exported_at": "2024-07-25T12:04:25+00:00", "name": "Counter-Strike: Global Offensive", "author": "panel@example.com", "uuid": "437c367d-06be-498f-a604-fdad135504d7", @@ -39,7 +39,11 @@ "default_value": "de_dust2", "user_viewable": true, "user_editable": true, - "rules": "required|string|alpha_dash", + "rules": [ + "required", + "string", + "alpha_dash" + ], "sort": 1, "field_type": "text" }, @@ -50,7 +54,12 @@ "default_value": "", "user_viewable": true, "user_editable": true, - "rules": "required|string|alpha_num|size:32", + "rules": [ + "required", + "string", + "alpha_num", + "size:32" + ], "sort": 2, "field_type": "text" }, @@ -61,7 +70,11 @@ "default_value": "740", "user_viewable": false, "user_editable": false, - "rules": "required|string|max:20", + "rules": [ + "required", + "string", + "max:20" + ], "sort": 3, "field_type": "text" } diff --git a/database/Seeders/eggs/source-engine/egg-custom-source-engine-game.json b/database/Seeders/eggs/source-engine/egg-custom-source-engine-game.json index f2e8bc0884..1126e629f1 100644 --- a/database/Seeders/eggs/source-engine/egg-custom-source-engine-game.json +++ b/database/Seeders/eggs/source-engine/egg-custom-source-engine-game.json @@ -4,7 +4,7 @@ "version": "PTDL_v2", "update_url": "https:\/\/github.com\/pelican-dev\/panel\/raw\/main\/database\/Seeders\/eggs\/source-engine\/egg-custom-source-engine-game.json" }, - "exported_at": "2024-07-03T14:34:04+00:00", + "exported_at": "2024-07-25T12:03:27+00:00", "name": "Custom Source Engine Game", "author": "panel@example.com", "uuid": "2a42d0c2-c0ba-4067-9a0a-9b95d77a3490", @@ -38,7 +38,11 @@ "default_value": "", "user_viewable": true, "user_editable": false, - "rules": "required|numeric|digits_between:1,6", + "rules": [ + "required", + "numeric", + "digits_between:1,6" + ], "sort": 1, "field_type": "text" }, @@ -49,7 +53,11 @@ "default_value": "", "user_viewable": true, "user_editable": false, - "rules": "required|alpha_dash|between:1,100", + "rules": [ + "required", + "alpha_dash", + "between:1,100" + ], "sort": 2, "field_type": "text" }, @@ -60,7 +68,11 @@ "default_value": "", "user_viewable": true, "user_editable": true, - "rules": "required|string|alpha_dash", + "rules": [ + "required", + "string", + "alpha_dash" + ], "sort": 3, "field_type": "text" }, @@ -71,7 +83,10 @@ "default_value": "", "user_viewable": true, "user_editable": true, - "rules": "nullable|string", + "rules": [ + "nullable", + "string" + ], "sort": 4, "field_type": "text" }, @@ -82,7 +97,10 @@ "default_value": "", "user_viewable": true, "user_editable": true, - "rules": "nullable|string", + "rules": [ + "nullable", + "string" + ], "sort": 5, "field_type": "text" }, @@ -93,7 +111,10 @@ "default_value": "", "user_viewable": true, "user_editable": true, - "rules": "nullable|string", + "rules": [ + "nullable", + "string" + ], "sort": 6, "field_type": "text" } diff --git a/database/Seeders/eggs/source-engine/egg-garrys-mod.json b/database/Seeders/eggs/source-engine/egg-garrys-mod.json index 60a6c4298c..21a289cd5e 100644 --- a/database/Seeders/eggs/source-engine/egg-garrys-mod.json +++ b/database/Seeders/eggs/source-engine/egg-garrys-mod.json @@ -4,7 +4,7 @@ "version": "PTDL_v2", "update_url": "https:\/\/github.com\/pelican-dev\/panel\/raw\/main\/database\/Seeders\/eggs\/source-engine\/egg-garrys-mod.json" }, - "exported_at": "2024-07-03T14:34:04+00:00", + "exported_at": "2024-07-25T12:05:02+00:00", "name": "Garrys Mod", "author": "panel@example.com", "uuid": "60ef81d4-30a2-4d98-ab64-f59c69e2f915", @@ -39,7 +39,11 @@ "default_value": "gm_flatgrass", "user_viewable": true, "user_editable": true, - "rules": "required|string|alpha_dash", + "rules": [ + "required", + "string", + "alpha_dash" + ], "sort": 1, "field_type": "text" }, @@ -50,7 +54,12 @@ "default_value": "", "user_viewable": true, "user_editable": true, - "rules": "nullable|string|alpha_num|size:32", + "rules": [ + "nullable", + "string", + "alpha_num", + "size:32" + ], "sort": 2, "field_type": "text" }, @@ -61,7 +70,11 @@ "default_value": "4020", "user_viewable": false, "user_editable": false, - "rules": "required|string|max:20", + "rules": [ + "required", + "string", + "max:20" + ], "sort": 3, "field_type": "text" }, @@ -72,7 +85,10 @@ "default_value": "", "user_viewable": true, "user_editable": true, - "rules": "nullable|integer", + "rules": [ + "nullable", + "integer" + ], "sort": 4, "field_type": "text" }, @@ -83,7 +99,10 @@ "default_value": "sandbox", "user_viewable": true, "user_editable": true, - "rules": "required|string", + "rules": [ + "required", + "string" + ], "sort": 5, "field_type": "text" }, @@ -94,7 +113,11 @@ "default_value": "32", "user_viewable": true, "user_editable": true, - "rules": "required|integer|max:128", + "rules": [ + "required", + "integer", + "max:128" + ], "sort": 6, "field_type": "text" }, @@ -105,7 +128,11 @@ "default_value": "22", "user_viewable": true, "user_editable": true, - "rules": "required|integer|max:100", + "rules": [ + "required", + "integer", + "max:100" + ], "sort": 7, "field_type": "text" }, @@ -116,7 +143,10 @@ "default_value": "0", "user_viewable": true, "user_editable": true, - "rules": "required|boolean", + "rules": [ + "required", + "boolean" + ], "sort": 8, "field_type": "text" } diff --git a/database/Seeders/eggs/source-engine/egg-insurgency.json b/database/Seeders/eggs/source-engine/egg-insurgency.json index b246dabbe3..1c7e1525f4 100644 --- a/database/Seeders/eggs/source-engine/egg-insurgency.json +++ b/database/Seeders/eggs/source-engine/egg-insurgency.json @@ -4,7 +4,7 @@ "version": "PTDL_v2", "update_url": "https:\/\/github.com\/pelican-dev\/panel\/raw\/main\/database\/Seeders\/eggs\/source-engine\/egg-insurgency.json" }, - "exported_at": "2024-07-03T14:34:05+00:00", + "exported_at": "2024-07-25T12:05:30+00:00", "name": "Insurgency", "author": "panel@example.com", "uuid": "a5702286-655b-4069-bf1e-925c7300b61a", @@ -38,7 +38,10 @@ "default_value": "237410", "user_viewable": true, "user_editable": false, - "rules": "required|regex:\/^(237410)$\/", + "rules": [ + "required", + "regex:\/^(237410)$\/" + ], "sort": 1, "field_type": "text" }, @@ -49,7 +52,10 @@ "default_value": "sinjar", "user_viewable": true, "user_editable": true, - "rules": "required|regex:\/^(\\w{1,20})$\/", + "rules": [ + "required", + "regex:\/^(\\w{1,20})$\/" + ], "sort": 2, "field_type": "text" } diff --git a/database/Seeders/eggs/source-engine/egg-team-fortress2.json b/database/Seeders/eggs/source-engine/egg-team-fortress2.json index 24795824c9..667d045559 100644 --- a/database/Seeders/eggs/source-engine/egg-team-fortress2.json +++ b/database/Seeders/eggs/source-engine/egg-team-fortress2.json @@ -4,7 +4,7 @@ "version": "PTDL_v2", "update_url": "https:\/\/github.com\/pelican-dev\/panel\/raw\/main\/database\/Seeders\/eggs\/source-engine\/egg-team-fortress2.json" }, - "exported_at": "2024-07-03T14:34:06+00:00", + "exported_at": "2024-07-25T12:05:42+00:00", "name": "Team Fortress 2", "author": "panel@example.com", "uuid": "7f8eb681-b2c8-4bf8-b9f4-d79ff70b6e5d", @@ -39,7 +39,10 @@ "default_value": "232250", "user_viewable": true, "user_editable": false, - "rules": "required|in:232250", + "rules": [ + "required", + "in:232250" + ], "sort": 1, "field_type": "text" }, @@ -50,7 +53,10 @@ "default_value": "cp_dustbowl", "user_viewable": true, "user_editable": true, - "rules": "required|regex:\/^(\\w{1,20})$\/", + "rules": [ + "required", + "regex:\/^(\\w{1,20})$\/" + ], "sort": 2, "field_type": "text" }, @@ -61,7 +67,12 @@ "default_value": "", "user_viewable": true, "user_editable": true, - "rules": "required|string|alpha_num|size:32", + "rules": [ + "required", + "string", + "alpha_num", + "size:32" + ], "sort": 3, "field_type": "text" } diff --git a/database/Seeders/eggs/voice-servers/egg-mumble-server.json b/database/Seeders/eggs/voice-servers/egg-mumble-server.json index 6254b856a6..a4c02919f9 100644 --- a/database/Seeders/eggs/voice-servers/egg-mumble-server.json +++ b/database/Seeders/eggs/voice-servers/egg-mumble-server.json @@ -4,7 +4,7 @@ "version": "PTDL_v2", "update_url": "https:\/\/github.com\/pelican-dev\/panel\/raw\/main\/database\/Seeders\/eggs\/voice-servers\/egg-mumble-server.json" }, - "exported_at": "2024-07-03T14:34:07+00:00", + "exported_at": "2024-07-25T12:05:52+00:00", "name": "Mumble Server", "author": "panel@example.com", "uuid": "727ee758-7fb2-4979-972b-d3eba4e1e9f0", @@ -36,7 +36,11 @@ "default_value": "100", "user_viewable": true, "user_editable": false, - "rules": "required|numeric|digits_between:1,5", + "rules": [ + "required", + "numeric", + "digits_between:1,5" + ], "sort": 1, "field_type": "text" } diff --git a/database/Seeders/eggs/voice-servers/egg-teamspeak3-server.json b/database/Seeders/eggs/voice-servers/egg-teamspeak3-server.json index 949d6a03dc..0543a16c04 100644 --- a/database/Seeders/eggs/voice-servers/egg-teamspeak3-server.json +++ b/database/Seeders/eggs/voice-servers/egg-teamspeak3-server.json @@ -4,7 +4,7 @@ "version": "PTDL_v2", "update_url": "https:\/\/github.com\/pelican-dev\/panel\/raw\/main\/database\/Seeders\/eggs\/voice-servers\/egg-teamspeak3-server.json" }, - "exported_at": "2024-07-03T14:34:08+00:00", + "exported_at": "2024-07-25T12:06:05+00:00", "name": "Teamspeak3 Server", "author": "panel@example.com", "uuid": "983b1fac-d322-4d5f-a636-436127326b37", @@ -36,7 +36,11 @@ "default_value": "latest", "user_viewable": true, "user_editable": true, - "rules": "required|string|max:6", + "rules": [ + "required", + "string", + "max:6" + ], "sort": 1, "field_type": "text" }, @@ -47,7 +51,11 @@ "default_value": "30033", "user_viewable": true, "user_editable": false, - "rules": "required|integer|between:1025,65535", + "rules": [ + "required", + "integer", + "between:1025,65535" + ], "sort": 2, "field_type": "text" }, @@ -58,7 +66,11 @@ "default_value": "10011", "user_viewable": true, "user_editable": false, - "rules": "required|integer|between:1025,65535", + "rules": [ + "required", + "integer", + "between:1025,65535" + ], "sort": 3, "field_type": "text" }, @@ -69,7 +81,11 @@ "default_value": "raw,http,ssh", "user_viewable": true, "user_editable": true, - "rules": "required|string|max:12", + "rules": [ + "required", + "string", + "max:12" + ], "sort": 4, "field_type": "text" }, @@ -80,7 +96,11 @@ "default_value": "10022", "user_viewable": true, "user_editable": false, - "rules": "required|integer|between:1025,65535", + "rules": [ + "required", + "integer", + "between:1025,65535" + ], "sort": 5, "field_type": "text" }, @@ -91,7 +111,11 @@ "default_value": "10080", "user_viewable": true, "user_editable": false, - "rules": "required|integer|between:1025,65535", + "rules": [ + "required", + "integer", + "between:1025,65535" + ], "sort": 6, "field_type": "text" } diff --git a/database/migrations/2024_07_25_072050_convert_rules_to_array.php b/database/migrations/2024_07_25_072050_convert_rules_to_array.php new file mode 100644 index 0000000000..8e6473a950 --- /dev/null +++ b/database/migrations/2024_07_25_072050_convert_rules_to_array.php @@ -0,0 +1,37 @@ +json('rules')->change(); + }); + + DB::table('egg_variables')->select(['id', 'rules'])->cursor()->each(function ($eggVariable) { + DB::table('egg_variables')->where('id', $eggVariable->id)->update(['rules' => explode('|', $eggVariable->rules)]); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('api_keys', function (Blueprint $table) { + $table->text('rules')->change(); + }); + + DB::table('egg_variables')->select(['id', 'rules'])->cursor()->each(function ($eggVariable) { + DB::table('egg_variables')->where('id', $eggVariable->id)->update(['rules' => implode('|', json_decode($eggVariable->rules))]); + }); + } +}; diff --git a/tests/Integration/Api/Client/Server/Startup/UpdateStartupVariableTest.php b/tests/Integration/Api/Client/Server/Startup/UpdateStartupVariableTest.php index 02d972fe43..e9c8af97ce 100644 --- a/tests/Integration/Api/Client/Server/Startup/UpdateStartupVariableTest.php +++ b/tests/Integration/Api/Client/Server/Startup/UpdateStartupVariableTest.php @@ -120,7 +120,7 @@ public function testEggVariableWithNullableStringIsNotRequired(): void [$user, $server] = $this->generateTestAccount(); $egg = $this->cloneEggAndVariables($server->egg); - $egg->variables()->first()->update(['rules' => 'nullable|string']); + $egg->variables()->first()->update(['rules' => ['nullable', 'string']]); $server->fill(['egg_id' => $egg->id])->save(); $server->refresh(); diff --git a/tests/Integration/Services/Servers/VariableValidatorServiceTest.php b/tests/Integration/Services/Servers/VariableValidatorServiceTest.php index 113e297624..6f49b97fb2 100644 --- a/tests/Integration/Services/Servers/VariableValidatorServiceTest.php +++ b/tests/Integration/Services/Servers/VariableValidatorServiceTest.php @@ -120,7 +120,7 @@ public function testNullableEnvironmentVariablesCanBeUsedCorrectly(): void $egg = $this->cloneEggAndVariables($this->egg); $egg->variables()->where('env_variable', '!=', 'BUNGEE_VERSION')->delete(); - $egg->variables()->update(['rules' => 'nullable|string']); + $egg->variables()->update(['rules' => ['nullable', 'string']]); $response = $this->getService()->handle($egg->id, []); $this->assertCount(1, $response);