diff --git a/app/Filament/Resources/EggResource/Pages/CreateEgg.php b/app/Filament/Resources/EggResource/Pages/CreateEgg.php index 856963fab..5dfa3b05f 100644 --- a/app/Filament/Resources/EggResource/Pages/CreateEgg.php +++ b/app/Filament/Resources/EggResource/Pages/CreateEgg.php @@ -134,7 +134,7 @@ class CreateEgg extends CreateRecord ->mutateRelationshipDataBeforeCreateUsing(function (array $data): array { $data['default_value'] ??= ''; $data['description'] ??= ''; - $data['rules'] ??= ''; + $data['rules'] ??= []; $data['user_viewable'] ??= ''; $data['user_editable'] ??= ''; @@ -143,7 +143,7 @@ class CreateEgg extends CreateRecord ->mutateRelationshipDataBeforeSaveUsing(function (array $data): array { $data['default_value'] ??= ''; $data['description'] ??= ''; - $data['rules'] ??= ''; + $data['rules'] ??= []; $data['user_viewable'] ??= ''; $data['user_editable'] ??= ''; @@ -173,7 +173,30 @@ class CreateEgg extends CreateRecord 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 acd76e479..ee7bf5bd6 100644 --- a/app/Filament/Resources/EggResource/Pages/EditEgg.php +++ b/app/Filament/Resources/EggResource/Pages/EditEgg.php @@ -144,7 +144,7 @@ class EditEgg extends EditRecord ->mutateRelationshipDataBeforeCreateUsing(function (array $data): array { $data['default_value'] ??= ''; $data['description'] ??= ''; - $data['rules'] ??= ''; + $data['rules'] ??= []; $data['user_viewable'] ??= ''; $data['user_editable'] ??= ''; @@ -153,7 +153,7 @@ class EditEgg extends EditRecord ->mutateRelationshipDataBeforeSaveUsing(function (array $data): array { $data['default_value'] ??= ''; $data['description'] ??= ''; - $data['rules'] ??= ''; + $data['rules'] ??= []; $data['user_viewable'] ??= ''; $data['user_editable'] ??= ''; @@ -183,7 +183,30 @@ class EditEgg extends EditRecord 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 343c8fa0c..9f2de64b9 100644 --- a/app/Filament/Resources/ServerResource/Pages/CreateServer.php +++ b/app/Filament/Resources/ServerResource/Pages/CreateServer.php @@ -6,6 +6,7 @@ use App\Filament\Resources\ServerResource; 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 @@ class CreateServer extends CreateRecord $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 @@ class CreateServer extends CreateRecord 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 @@ class CreateServer extends CreateRecord 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 c8726fde5..74cfe7018 100644 --- a/app/Filament/Resources/ServerResource/Pages/EditServer.php +++ b/app/Filament/Resources/ServerResource/Pages/EditServer.php @@ -489,7 +489,7 @@ class EditServer extends EditRecord $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 @@ class EditServer extends EditRecord ->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 @@ class EditServer extends EditRecord ]; } - 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 c589d9534..2d3a4fb2c 100644 --- a/app/Models/EggVariable.php +++ b/app/Models/EggVariable.php @@ -15,7 +15,7 @@ use Illuminate\Database\Eloquent\Relations\HasMany; * @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 @@ class EggVariable extends Model 'egg_id' => 'integer', 'user_viewable' => 'bool', 'user_editable' => 'bool', + 'rules' => 'array', 'created_at' => 'immutable_datetime', 'updated_at' => 'immutable_datetime', ]; @@ -79,7 +82,7 @@ class EggVariable extends Model 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 1e85923d7..dc54525a6 100644 --- a/app/Services/Eggs/Sharing/EggImporterService.php +++ b/app/Services/Eggs/Sharing/EggImporterService.php @@ -54,6 +54,8 @@ class EggImporterService // 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 d2213f5be..c6c726986 100644 --- a/app/Services/Eggs/Variables/VariableCreationService.php +++ b/app/Services/Eggs/Variables/VariableCreationService.php @@ -40,7 +40,7 @@ class VariableCreationService 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 @@ class VariableCreationService '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 515cbc271..e56ae8ea7 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 @@ class VariableUpdateService } } - 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 @@ class VariableUpdateService '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 bdc2fad15..141f43b61 100644 --- a/app/Transformers/Api/Client/EggVariableTransformer.php +++ b/app/Transformers/Api/Client/EggVariableTransformer.php @@ -27,7 +27,7 @@ class EggVariableTransformer extends BaseClientTransformer '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 f9b389560..49bc8be50 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 693e299db..13afe9748 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 39463b0e9..d8a73b9f4 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 278f58a6c..1a72aefe7 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 94f257863..71d71938e 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 5b763bd7c..e74368604 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 6f450834c..1c092bd21 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 f2e8bc088..1126e629f 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 60a6c4298..21a289cd5 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 b246dabbe..1c7e1525f 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 24795824c..667d04555 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 6254b856a..a4c02919f 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 949d6a03d..0543a16c0 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 000000000..8e6473a95 --- /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 02d972fe4..e9c8af97c 100644 --- a/tests/Integration/Api/Client/Server/Startup/UpdateStartupVariableTest.php +++ b/tests/Integration/Api/Client/Server/Startup/UpdateStartupVariableTest.php @@ -120,7 +120,7 @@ class UpdateStartupVariableTest extends ClientApiIntegrationTestCase [$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 113e29762..6f49b97fb 100644 --- a/tests/Integration/Services/Servers/VariableValidatorServiceTest.php +++ b/tests/Integration/Services/Servers/VariableValidatorServiceTest.php @@ -120,7 +120,7 @@ class VariableValidatorServiceTest extends IntegrationTestCase $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);