From d924d418c7c8eca8de588fc34f94a90cfb93ed9b Mon Sep 17 00:00:00 2001 From: "Harry (hjbdev)" Date: Tue, 8 Apr 2025 22:33:05 +0100 Subject: [PATCH] Validation, service form improvements --- app/Http/Controllers/ServiceController.php | 22 ++++- config/keystone.php | 103 +++++++++++++++++++++ resources/js/enums/FirewallRuleStatus.js | 2 +- resources/js/pages/services/Create.vue | 59 ++++++++---- 4 files changed, 164 insertions(+), 22 deletions(-) diff --git a/app/Http/Controllers/ServiceController.php b/app/Http/Controllers/ServiceController.php index a796237..102a411 100644 --- a/app/Http/Controllers/ServiceController.php +++ b/app/Http/Controllers/ServiceController.php @@ -2,16 +2,36 @@ namespace App\Http\Controllers; +use App\Enums\ServiceCategory; +use App\Enums\ServiceType; +use App\Models\Server; use Illuminate\Http\Request; +use Illuminate\Validation\Rule; class ServiceController extends Controller { public function create(Request $request) { - $server = $request->route('server'); + $server = Server::findOrFail($request->route('server')); return inertia('services/Create', [ 'server' => $server, + 'services' => config('keystone.services'), + ]); + } + + public function store(Request $request) + { + // dd($request->all()); + $request->validate([ + 'name' => ['required', 'string', 'max:255'], + 'category' => ['required', Rule::enum(ServiceCategory::class)], + 'type' => ['required', Rule::enum(ServiceType::class)], + 'version' => ['required', 'string', function ($key, $value, $fail) use ($request) { + if (!isset(config('keystone.services')[$request->category][$request->type]['versions'][$value])) { + $fail('The selected version is invalid.'); + } + }], ]); } } diff --git a/config/keystone.php b/config/keystone.php index 7e3a8cb..9f851bb 100644 --- a/config/keystone.php +++ b/config/keystone.php @@ -1,6 +1,8 @@ [ @@ -9,4 +11,105 @@ return [ ], ], 'internal_ip_base' => env('INTERNAL_IP_BASE', '192.168.2.'), + + 'services' => [ + ServiceCategory::DATABASE->value => [ + ServiceType::POSTGRES->value => [ + 'name' => ServiceType::POSTGRES, + 'description' => 'PostgreSQL', + 'versions' => [ + '17' => [ + 'name' => 'PostgreSQL 17', + 'description' => 'PostgreSQL 17', + 'image' => 'postgres:17', + ], + ], + ], + ServiceType::MYSQL->value => [ + 'name' => ServiceType::MYSQL, + 'description' => 'MySQL', + 'versions' => [ + '9.0' => [ + 'name' => 'MySQL 9.2', + 'description' => 'MySQL 9.2', + 'image' => 'mysql:9.2' + ], + ], + ], + ], + ServiceCategory::GATEWAY->value => [ + ServiceType::NGINX->value => [ + 'name' => ServiceType::NGINX, + 'description' => 'Nginx', + 'versions' => [ + '1.27' => [ + 'name' => 'Nginx 1.27', + 'description' => 'Nginx 1.27', + 'image' => 'nginx:1.27', + ], + ], + ], + ServiceType::CADDY->value => [ + 'name' => ServiceType::CADDY, + 'description' => 'Caddy', + 'versions' => [ + '2.9' => [ + 'name' => 'Caddy 2.9', + 'description' => 'Caddy 2.9', + 'image' => 'caddy:2.9' + ], + ], + ], + ], + ServiceCategory::APPLICATION->value => [ + ServiceType::PHP_FPM->value => [ + 'name' => ServiceType::PHP_FPM, + 'description' => 'PHP-FPM', + 'versions' => [ + '8.4' => [ + 'name' => 'PHP 8.4', + 'description' => 'PHP 8.4', + 'image' => 'serversideup/php:8.4-fpm-nginx', + ], + ], + ], + ServiceType::FRANKENPHP->value => [ + 'name' => ServiceType::FRANKENPHP, + 'description' => 'FrankenPHP', + 'versions' => [ + '1.5' => [ + 'name' => 'FrankenPHP 1.5', + 'description' => 'FrankenPHP 1.5', + 'image' => 'dunglas/frankenphp:1.5-php8.4-bookworm', + ], + ], + ], + ], + ServiceCategory::CACHE->value => [ + ServiceType::REDIS->value => [ + 'name' => ServiceType::REDIS, + 'description' => 'Redis', + 'versions' => [ + '7.4' => [ + 'name' => 'Redis 7.4', + 'description' => 'Redis 7.4', + 'image' => 'redis:7.4', + ], + ], + ], + ServiceType::VALKEY->value => [ + 'name' => ServiceType::VALKEY, + 'description' => 'Valkey', + 'versions' => [ + '8.1' => [ + 'name' => 'Valkey 8.1', + 'description' => 'Valkey 8.1', + 'image' => 'valkey/valkey:8.1', + ], + ], + ], + ], + ServiceCategory::STORAGE->value => [ + ], + ] ]; diff --git a/resources/js/enums/FirewallRuleStatus.js b/resources/js/enums/FirewallRuleStatus.js index 100adb2..cc0a9ea 100644 --- a/resources/js/enums/FirewallRuleStatus.js +++ b/resources/js/enums/FirewallRuleStatus.js @@ -1,7 +1,7 @@ // This is a generated file. export default { - "UNINSTALLED": "uninstalled", + "NOT_INSTALLED": "not-installed", "INSTALLED": "installed", "FAILED": "failed", "REMOVED": "removed" diff --git a/resources/js/pages/services/Create.vue b/resources/js/pages/services/Create.vue index b67929d..f681d51 100644 --- a/resources/js/pages/services/Create.vue +++ b/resources/js/pages/services/Create.vue @@ -1,20 +1,23 @@