diff --git a/app/Console/Commands/UpdateGeneralSettings.php b/app/Console/Commands/UpdateGeneralSettings.php new file mode 100644 index 000000000..c9031268f --- /dev/null +++ b/app/Console/Commands/UpdateGeneralSettings.php @@ -0,0 +1,120 @@ +updateSiteName($settings); + $this->updateTimeZone($settings); + $this->updateSchedule($settings); + $this->resetSevers($settings); + + $this->line('✅ Settings updated!'); + } + + protected function resetSevers($settings): void + { + $confirmed = confirm( + label: 'Do you want to reset the server list?', + default: false, + yes: 'Yes, reset it', + no: 'No, keep it' + ); + + if ($confirmed) { + $settings->speedtest_server = []; + + $settings->save(); + } + } + + protected function updateSchedule($settings): void + { + $cron = text( + label: 'What is the schedule?', + placeholder: '0 * * * *', + default: $settings->speedtest_schedule, + required: true, + validate: fn (string $value) => match (true) { + ! CronExpression::isValidExpression($value) => 'The schedule expression is invalid.', + default => null + } + ); + + if ($cron) { + $settings->speedtest_schedule = $cron; + + $settings->save(); + } + } + + protected function updateSiteName($settings): void + { + $name = text( + label: 'What is the site name?', + placeholder: 'Speedtest Tracker', + default: $settings->site_name, + required: true, + validate: fn (string $value) => match (true) { + strlen($value) < 2 => 'The site name must be at least 2 characters.', + strlen($value) > 50 => 'The site name must not exceed 50 characters.', + default => null + } + ); + + if ($name) { + $settings->site_name = $name; + + $settings->save(); + } + } + + protected function updateTimeZone($settings): void + { + $timezone = text( + label: 'What is the time zone?', + placeholder: 'UTC', + default: $settings->timezone, + required: true, + validate: fn (string $value) => match (true) { + ! TimeZoneHelper::validate($value) => 'The time zone must be a valid time zone.', + default => null + } + ); + + if ($timezone) { + $settings->timezone = $timezone; + + $settings->save(); + } + } +} diff --git a/app/Helpers/TimeZoneHelper.php b/app/Helpers/TimeZoneHelper.php index e02f1ad77..7a7ecfafd 100644 --- a/app/Helpers/TimeZoneHelper.php +++ b/app/Helpers/TimeZoneHelper.php @@ -2,7 +2,9 @@ namespace App\Helpers; +use DateTimeZone; use Illuminate\Support\Facades\Cache; +use Illuminate\Support\Str; class TimeZoneHelper { @@ -25,4 +27,17 @@ public static function list() return collect($timezone)->sortKeys(); }); } + + /** + * Validates the time zone string provided. + * + * Ref: https://github.com/laravel/framework/blob/10.x/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L2406-L2420 + */ + public static function validate($value, $parameters = []) + { + return in_array($value, timezone_identifiers_list( + constant(DateTimeZone::class.'::'.Str::upper($parameters[0] ?? 'ALL')), + isset($parameters[1]) ? Str::upper($parameters[1]) : null, + ), true); + } }