Skip to content

Commit e3831c0

Browse files
authored
[Feature] CLI to update general settings (alexjustesen#978)
1 parent e982d98 commit e3831c0

File tree

2 files changed

+135
-0
lines changed

2 files changed

+135
-0
lines changed
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
<?php
2+
3+
namespace App\Console\Commands;
4+
5+
use App\Helpers\TimeZoneHelper;
6+
use App\Settings\GeneralSettings;
7+
use Cron\CronExpression;
8+
use Illuminate\Console\Command;
9+
10+
use function Laravel\Prompts\confirm;
11+
use function Laravel\Prompts\text;
12+
13+
class UpdateGeneralSettings extends Command
14+
{
15+
/**
16+
* The name and signature of the console command.
17+
*
18+
* @var string
19+
*/
20+
protected $signature = 'app:update-general-settings';
21+
22+
/**
23+
* The console command description.
24+
*
25+
* @var string
26+
*/
27+
protected $description = 'CLI to update the general settings.';
28+
29+
/**
30+
* Execute the console command.
31+
*/
32+
public function handle()
33+
{
34+
$settings = new GeneralSettings();
35+
36+
$this->updateSiteName($settings);
37+
$this->updateTimeZone($settings);
38+
$this->updateSchedule($settings);
39+
$this->resetSevers($settings);
40+
41+
$this->line('✅ Settings updated!');
42+
}
43+
44+
protected function resetSevers($settings): void
45+
{
46+
$confirmed = confirm(
47+
label: 'Do you want to reset the server list?',
48+
default: false,
49+
yes: 'Yes, reset it',
50+
no: 'No, keep it'
51+
);
52+
53+
if ($confirmed) {
54+
$settings->speedtest_server = [];
55+
56+
$settings->save();
57+
}
58+
}
59+
60+
protected function updateSchedule($settings): void
61+
{
62+
$cron = text(
63+
label: 'What is the schedule?',
64+
placeholder: '0 * * * *',
65+
default: $settings->speedtest_schedule,
66+
required: true,
67+
validate: fn (string $value) => match (true) {
68+
! CronExpression::isValidExpression($value) => 'The schedule expression is invalid.',
69+
default => null
70+
}
71+
);
72+
73+
if ($cron) {
74+
$settings->speedtest_schedule = $cron;
75+
76+
$settings->save();
77+
}
78+
}
79+
80+
protected function updateSiteName($settings): void
81+
{
82+
$name = text(
83+
label: 'What is the site name?',
84+
placeholder: 'Speedtest Tracker',
85+
default: $settings->site_name,
86+
required: true,
87+
validate: fn (string $value) => match (true) {
88+
strlen($value) < 2 => 'The site name must be at least 2 characters.',
89+
strlen($value) > 50 => 'The site name must not exceed 50 characters.',
90+
default => null
91+
}
92+
);
93+
94+
if ($name) {
95+
$settings->site_name = $name;
96+
97+
$settings->save();
98+
}
99+
}
100+
101+
protected function updateTimeZone($settings): void
102+
{
103+
$timezone = text(
104+
label: 'What is the time zone?',
105+
placeholder: 'UTC',
106+
default: $settings->timezone,
107+
required: true,
108+
validate: fn (string $value) => match (true) {
109+
! TimeZoneHelper::validate($value) => 'The time zone must be a valid time zone.',
110+
default => null
111+
}
112+
);
113+
114+
if ($timezone) {
115+
$settings->timezone = $timezone;
116+
117+
$settings->save();
118+
}
119+
}
120+
}

app/Helpers/TimeZoneHelper.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
namespace App\Helpers;
44

5+
use DateTimeZone;
56
use Illuminate\Support\Facades\Cache;
7+
use Illuminate\Support\Str;
68

79
class TimeZoneHelper
810
{
@@ -25,4 +27,17 @@ public static function list()
2527
return collect($timezone)->sortKeys();
2628
});
2729
}
30+
31+
/**
32+
* Validates the time zone string provided.
33+
*
34+
* Ref: https://github.com/laravel/framework/blob/10.x/src/Illuminate/Validation/Concerns/ValidatesAttributes.php#L2406-L2420
35+
*/
36+
public static function validate($value, $parameters = [])
37+
{
38+
return in_array($value, timezone_identifiers_list(
39+
constant(DateTimeZone::class.'::'.Str::upper($parameters[0] ?? 'ALL')),
40+
isset($parameters[1]) ? Str::upper($parameters[1]) : null,
41+
), true);
42+
}
2843
}

0 commit comments

Comments
 (0)