From 2b6fc50a93f298da0a0aac50690597a3fcb2d3d7 Mon Sep 17 00:00:00 2001 From: Vincent Bergeron Date: Fri, 26 Sep 2025 08:13:58 -0400 Subject: [PATCH 1/5] Add Redis restart --- README.md | 6 +++ app/Commands/Services/RedisCommand.php | 32 +++++++++++++ .../Commands/ServicesRedisCommandTest.php | 45 +++++++++++++++++++ 3 files changed, 83 insertions(+) create mode 100644 app/Commands/Services/RedisCommand.php create mode 100644 tests/Feature/Commands/ServicesRedisCommandTest.php diff --git a/README.md b/README.md index c801b1b..3f8e0ba 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,12 @@ Nested properties should use dot notation, for example, `database.server`. # Restart PHP on all servers spinupwp services:php --all + # Restart Redis on a server + spinupwp services:redis + + # Restart Redis on all servers + spinupwp services:redis --all + ### Sites # Create a site diff --git a/app/Commands/Services/RedisCommand.php b/app/Commands/Services/RedisCommand.php new file mode 100644 index 0000000..81edea5 --- /dev/null +++ b/app/Commands/Services/RedisCommand.php @@ -0,0 +1,32 @@ +option('all') && $this->forceOrConfirm('Are you sure you want to restart Redis on all servers?')) { + $servers = $this->spinupwp->listServers(); + } else { + $servers = $this->selectServer('restart Redis on'); + } + + $this->queueResources($servers, 'restartRedis', 'Redis restart'); + + return self::SUCCESS; + } +} diff --git a/tests/Feature/Commands/ServicesRedisCommandTest.php b/tests/Feature/Commands/ServicesRedisCommandTest.php new file mode 100644 index 0000000..7a0a6b6 --- /dev/null +++ b/tests/Feature/Commands/ServicesRedisCommandTest.php @@ -0,0 +1,45 @@ +clientMock->shouldReceive('request')->with('GET', 'servers/1', [])->andReturn( + new Response(200, [], json_encode(['data' => ['id' => 1, 'name' => 'hellfish-media']])) + ); + + $this->clientMock->shouldReceive('request')->with('POST', 'servers/1/services/redis/restart', [])->andReturn( + new Response(200, [], json_encode(['event_id' => '100'])) + ); +}); + +afterEach(function () { + deleteTestConfigFile(); +}); + +test('restart redis for a server', function () { + $this->artisan('services:redis 1') + ->expectsConfirmation('Are you sure you want to restart Redis on "hellfish-media"?', 'yes') + ->expectsOutput('==> Server queued for Redis restart.'); +}); + +test('restart redis for a server with force option', function () { + $this->artisan('services:redis 1 --force') + ->expectsOutput('==> Server queued for Redis restart.'); +}); + +test('restart redis on all servers', function () { + $this->clientMock->shouldReceive('request')->once()->with('GET', 'servers?page=1&limit=100', [])->andReturn( + new Response(200, [], listResponseJson([ + ['id' => 1, 'name' => 'hellfish-media'], + ['id' => 2, 'name' => 'staging.hellfish-media'], + ])) + ); + $this->clientMock->shouldReceive('request')->with('POST', 'servers/2/services/redis/restart', [])->andReturn( + new Response(200, [], json_encode(['event_id' => '101'])) + ); + $this->artisan('services:redis --all') + ->expectsConfirmation('Are you sure you want to restart Redis on all servers?', 'yes') + ->expectsOutput('==> Servers queued for Redis restart.'); +}); From 1b3d0a41d913f61a055ed393f96b7558ff7090cd Mon Sep 17 00:00:00 2001 From: vbergerondev Date: Fri, 26 Sep 2025 12:14:26 +0000 Subject: [PATCH 2/5] Apply php-cs-fixer changes --- config/commands.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/commands.php b/config/commands.php index 72518fe..42125fd 100644 --- a/config/commands.php +++ b/config/commands.php @@ -93,7 +93,7 @@ */ 'remove' => [ - \LaravelZero\Framework\Commands\TestMakeCommand::class, + LaravelZero\Framework\Commands\TestMakeCommand::class, ], ]; From b6524f33182ed2c5d0d52fdf22373833f01d6b77 Mon Sep 17 00:00:00 2001 From: Vincent Bergeron Date: Fri, 26 Sep 2025 12:50:26 -0400 Subject: [PATCH 3/5] More robust way to check if the property exists --- app/Commands/Concerns/SpecifyFields.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Commands/Concerns/SpecifyFields.php b/app/Commands/Concerns/SpecifyFields.php index aba1183..0f11e5f 100644 --- a/app/Commands/Concerns/SpecifyFields.php +++ b/app/Commands/Concerns/SpecifyFields.php @@ -31,7 +31,7 @@ protected function specifyFields(Resource $resource, array $fieldsFilter = []): collect($this->fieldsMap)->each(function (Field $field) use ($resource, &$fields) { $label = $field->getDisplayLabel($this->displayFormat() === 'table'); - if (!property_exists($resource, $field->getName())) { + if (!isset($resource->toArray()[$field->getName()])) { return; } From 6fe0bd608e5e198d653537f48df54d154014bfd8 Mon Sep 17 00:00:00 2001 From: Vincent Bergeron Date: Fri, 26 Sep 2025 13:08:17 -0400 Subject: [PATCH 4/5] leverage __isset --- app/Commands/Concerns/SpecifyFields.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Commands/Concerns/SpecifyFields.php b/app/Commands/Concerns/SpecifyFields.php index 0f11e5f..c07eddb 100644 --- a/app/Commands/Concerns/SpecifyFields.php +++ b/app/Commands/Concerns/SpecifyFields.php @@ -31,7 +31,7 @@ protected function specifyFields(Resource $resource, array $fieldsFilter = []): collect($this->fieldsMap)->each(function (Field $field) use ($resource, &$fields) { $label = $field->getDisplayLabel($this->displayFormat() === 'table'); - if (!isset($resource->toArray()[$field->getName()])) { + if (!isset($resource->{$field->getName()})) { return; } From 2b5381c98091077b1ab5a2f4841412e83923ee89 Mon Sep 17 00:00:00 2001 From: Vincent Bergeron Date: Fri, 26 Sep 2025 13:19:42 -0400 Subject: [PATCH 5/5] Transform resource to array --- app/Commands/Concerns/InteractsWithIO.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/Commands/Concerns/InteractsWithIO.php b/app/Commands/Concerns/InteractsWithIO.php index 0bdc10b..09dabc5 100644 --- a/app/Commands/Concerns/InteractsWithIO.php +++ b/app/Commands/Concerns/InteractsWithIO.php @@ -4,6 +4,7 @@ use Illuminate\Support\Collection; use Illuminate\Support\Str; +use SpinupWp\Resources\Resource; use Symfony\Component\Console\Formatter\OutputFormatterStyle; use Symfony\Component\Console\Helper\Table; use Symfony\Component\Console\Question\ChoiceQuestion; @@ -67,10 +68,14 @@ protected function displayFormat(): string */ protected function toJson($resource): void { - if (!is_array($resource)) { + if ($resource instanceof Resource) { $resource = $resource->toArray(); } + if ($resource instanceof Collection) { + $resource = $resource->map(fn ($item) => $item instanceof Resource ? $item->toArray() : $item); + } + $this->line((string) json_encode($resource, JSON_PRETTY_PRINT)); }