From 79b51b7afb6024bc80bf38124cf39e7b96333c01 Mon Sep 17 00:00:00 2001 From: Boy132 Date: Thu, 21 Nov 2024 09:58:11 +0100 Subject: [PATCH] handle server with "conflict state" --- app/Filament/Server/Pages/Console.php | 11 ++++++----- app/Filament/Server/Pages/ServerFormPage.php | 13 +++++++++++++ .../Server/Resources/ActivityResource.php | 15 +++++++++++++++ .../Server/Resources/AllocationResource.php | 15 +++++++++++++++ app/Filament/Server/Resources/BackupResource.php | 15 +++++++++++++++ .../Server/Resources/DatabaseResource.php | 15 +++++++++++++++ app/Filament/Server/Resources/FileResource.php | 15 +++++++++++++++ .../Server/Resources/ScheduleResource.php | 15 +++++++++++++++ app/Filament/Server/Resources/UserResource.php | 13 +++++++++++++ app/Models/Server.php | 13 ++++++------- 10 files changed, 128 insertions(+), 12 deletions(-) diff --git a/app/Filament/Server/Pages/Console.php b/app/Filament/Server/Pages/Console.php index 37d579484d..025784c90c 100644 --- a/app/Filament/Server/Pages/Console.php +++ b/app/Filament/Server/Pages/Console.php @@ -53,15 +53,16 @@ protected function getHeaderActions(): array return [ Action::make('start') ->color('primary') - ->action(fn () => $this->dispatch('setServerState', state: 'start')), - + ->action(fn () => $this->dispatch('setServerState', state: 'start')) + ->disabled(fn () => Filament::getTenant()->isInConflictState()), Action::make('restart') ->color('gray') - ->action(fn () => $this->dispatch('setServerState', state: 'restart')), - + ->action(fn () => $this->dispatch('setServerState', state: 'restart')) + ->disabled(fn () => Filament::getTenant()->isInConflictState()), Action::make('stop') ->color('danger') - ->action(fn () => $this->dispatch('setServerState', state: 'stop')), + ->action(fn () => $this->dispatch('setServerState', state: 'stop')) + ->disabled(fn () => Filament::getTenant()->isInConflictState()), ]; } } diff --git a/app/Filament/Server/Pages/ServerFormPage.php b/app/Filament/Server/Pages/ServerFormPage.php index c5a7697ad6..36c2941cba 100644 --- a/app/Filament/Server/Pages/ServerFormPage.php +++ b/app/Filament/Server/Pages/ServerFormPage.php @@ -66,4 +66,17 @@ public function getRecord(): Server return $server; } + + // TODO: find better way handle server conflict state + public static function canAccess(): bool + { + /** @var Server $server */ + $server = Filament::getTenant(); + + if ($server->isInConflictState()) { + return false; + } + + return parent::canAccess(); + } } diff --git a/app/Filament/Server/Resources/ActivityResource.php b/app/Filament/Server/Resources/ActivityResource.php index 6923bae4a0..5044a7edd6 100644 --- a/app/Filament/Server/Resources/ActivityResource.php +++ b/app/Filament/Server/Resources/ActivityResource.php @@ -4,6 +4,8 @@ use App\Filament\Server\Resources\ActivityResource\Pages; use App\Models\ActivityLog; +use App\Models\Server; +use Filament\Facades\Filament; use Filament\Resources\Resource; class ActivityResource extends Resource @@ -18,6 +20,19 @@ class ActivityResource extends Resource protected static ?string $tenantRelationshipName = 'activity'; // TODO: not displaying anything + // TODO: find better way handle server conflict state + public static function canAccess(): bool + { + /** @var Server $server */ + $server = Filament::getTenant(); + + if ($server->isInConflictState()) { + return false; + } + + return parent::canAccess(); + } + public static function getPages(): array { return [ diff --git a/app/Filament/Server/Resources/AllocationResource.php b/app/Filament/Server/Resources/AllocationResource.php index ee7fa0fb0b..6acdbbbdaf 100644 --- a/app/Filament/Server/Resources/AllocationResource.php +++ b/app/Filament/Server/Resources/AllocationResource.php @@ -4,6 +4,8 @@ use App\Filament\Server\Resources\AllocationResource\Pages; use App\Models\Allocation; +use App\Models\Server; +use Filament\Facades\Filament; use Filament\Resources\Resource; class AllocationResource extends Resource @@ -18,6 +20,19 @@ class AllocationResource extends Resource protected static ?string $navigationIcon = 'tabler-network'; + // TODO: find better way handle server conflict state + public static function canAccess(): bool + { + /** @var Server $server */ + $server = Filament::getTenant(); + + if ($server->isInConflictState()) { + return false; + } + + return parent::canAccess(); + } + public static function getPages(): array { return [ diff --git a/app/Filament/Server/Resources/BackupResource.php b/app/Filament/Server/Resources/BackupResource.php index 0efb752f3c..47885b8875 100644 --- a/app/Filament/Server/Resources/BackupResource.php +++ b/app/Filament/Server/Resources/BackupResource.php @@ -4,6 +4,8 @@ use App\Filament\Server\Resources\BackupResource\Pages; use App\Models\Backup; +use App\Models\Server; +use Filament\Facades\Filament; use Filament\Resources\Resource; class BackupResource extends Resource @@ -16,6 +18,19 @@ class BackupResource extends Resource protected static ?string $navigationIcon = 'tabler-download'; + // TODO: find better way handle server conflict state + public static function canAccess(): bool + { + /** @var Server $server */ + $server = Filament::getTenant(); + + if ($server->isInConflictState()) { + return false; + } + + return parent::canAccess(); + } + public static function getPages(): array { return [ diff --git a/app/Filament/Server/Resources/DatabaseResource.php b/app/Filament/Server/Resources/DatabaseResource.php index 6e6a402afb..d04c1c1cfe 100644 --- a/app/Filament/Server/Resources/DatabaseResource.php +++ b/app/Filament/Server/Resources/DatabaseResource.php @@ -4,6 +4,8 @@ use App\Filament\Server\Resources\DatabaseResource\Pages; use App\Models\Database; +use App\Models\Server; +use Filament\Facades\Filament; use Filament\Resources\Resource; class DatabaseResource extends Resource @@ -14,6 +16,19 @@ class DatabaseResource extends Resource protected static ?string $navigationIcon = 'tabler-database'; + // TODO: find better way handle server conflict state + public static function canAccess(): bool + { + /** @var Server $server */ + $server = Filament::getTenant(); + + if ($server->isInConflictState()) { + return false; + } + + return parent::canAccess(); + } + public static function getPages(): array { return [ diff --git a/app/Filament/Server/Resources/FileResource.php b/app/Filament/Server/Resources/FileResource.php index 8425ad6ae4..b0efa89185 100644 --- a/app/Filament/Server/Resources/FileResource.php +++ b/app/Filament/Server/Resources/FileResource.php @@ -4,6 +4,8 @@ use App\Filament\Server\Resources\FileResource\Pages; use App\Models\File; +use App\Models\Server; +use Filament\Facades\Filament; use Filament\Resources\Resource; class FileResource extends Resource @@ -14,6 +16,19 @@ class FileResource extends Resource protected static ?string $navigationIcon = 'tabler-files'; + // TODO: find better way handle server conflict state + public static function canAccess(): bool + { + /** @var Server $server */ + $server = Filament::getTenant(); + + if ($server->isInConflictState()) { + return false; + } + + return parent::canAccess(); + } + public static function getPages(): array { return [ diff --git a/app/Filament/Server/Resources/ScheduleResource.php b/app/Filament/Server/Resources/ScheduleResource.php index d9e5ae3630..46e4adbb90 100644 --- a/app/Filament/Server/Resources/ScheduleResource.php +++ b/app/Filament/Server/Resources/ScheduleResource.php @@ -5,6 +5,8 @@ use App\Filament\Server\Resources\ScheduleResource\Pages; use App\Filament\Server\Resources\ScheduleResource\RelationManagers\TasksRelationManager; use App\Models\Schedule; +use App\Models\Server; +use Filament\Facades\Filament; use Filament\Forms\Components\Actions; use Filament\Forms\Components\Actions\Action; use Filament\Forms\Components\Section; @@ -23,6 +25,19 @@ class ScheduleResource extends Resource protected static ?string $navigationIcon = 'tabler-clock'; + // TODO: find better way handle server conflict state + public static function canAccess(): bool + { + /** @var Server $server */ + $server = Filament::getTenant(); + + if ($server->isInConflictState()) { + return false; + } + + return parent::canAccess(); + } + public static function form(Form $form): Form { return $form diff --git a/app/Filament/Server/Resources/UserResource.php b/app/Filament/Server/Resources/UserResource.php index f869aa0386..7ce8801416 100644 --- a/app/Filament/Server/Resources/UserResource.php +++ b/app/Filament/Server/Resources/UserResource.php @@ -33,6 +33,19 @@ class UserResource extends Resource protected static ?string $tenantOwnershipRelationshipName = 'subServers'; + // TODO: find better way handle server conflict state + public static function canAccess(): bool + { + /** @var Server $server */ + $server = Filament::getTenant(); + + if ($server->isInConflictState()) { + return false; + } + + return parent::canAccess(); + } + public static function table(Table $table): Table { return $table diff --git a/app/Models/Server.php b/app/Models/Server.php index 0154bcd050..fbad9c9103 100644 --- a/app/Models/Server.php +++ b/app/Models/Server.php @@ -366,6 +366,11 @@ public function resolveChildRouteBinding($childType, $value, $field) }; } + public function isInConflictState(): bool + { + return $this->isSuspended() || $this->node->isUnderMaintenance() || !$this->isInstalled() || $this->status === ServerState::RestoringBackup || !is_null($this->transfer); + } + /** * Checks if the server is currently in a user-accessible state. If not, an * exception is raised. This should be called whenever something needs to make @@ -375,13 +380,7 @@ public function resolveChildRouteBinding($childType, $value, $field) */ public function validateCurrentState(): void { - if ( - $this->isSuspended() || - $this->node->isUnderMaintenance() || - !$this->isInstalled() || - $this->status === ServerState::RestoringBackup || - !is_null($this->transfer) - ) { + if ($this->isInConflictState()) { throw new ServerStateConflictException($this); } }