Use afterSave instead of handleRecordUpdate & move transferServer (#1195)

* Use `afterSave` instead of `handleRecordUpdate` & move `transferServer`

* Override `getSavedNotification` instead of `save`
This commit is contained in:
MartinOscar 2025-04-03 15:59:10 +02:00 committed by GitHub
parent e562a35057
commit c0fa8c1cd8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 71 additions and 93 deletions

View File

@ -4,6 +4,7 @@ namespace App\Filament\Admin\Resources\NodeResource\Pages;
use App\Filament\Admin\Resources\NodeResource; use App\Filament\Admin\Resources\NodeResource;
use App\Models\Node; use App\Models\Node;
use App\Repositories\Daemon\DaemonConfigurationRepository;
use App\Services\Helpers\SoftwareVersionService; use App\Services\Helpers\SoftwareVersionService;
use App\Services\Nodes\NodeAutoDeployService; use App\Services\Nodes\NodeAutoDeployService;
use App\Services\Nodes\NodeUpdateService; use App\Services\Nodes\NodeUpdateService;
@ -26,7 +27,7 @@ use Filament\Forms\Set;
use Filament\Notifications\Notification; use Filament\Notifications\Notification;
use Filament\Resources\Pages\EditRecord; use Filament\Resources\Pages\EditRecord;
use Filament\Support\Enums\Alignment; use Filament\Support\Enums\Alignment;
use Illuminate\Database\Eloquent\Model; use Illuminate\Http\Client\ConnectionException;
use Illuminate\Support\HtmlString; use Illuminate\Support\HtmlString;
use Webbingbrasil\FilamentCopyActions\Forms\Actions\CopyAction; use Webbingbrasil\FilamentCopyActions\Forms\Actions\CopyAction;
@ -34,12 +35,13 @@ class EditNode extends EditRecord
{ {
protected static string $resource = NodeResource::class; protected static string $resource = NodeResource::class;
private bool $errored = false; private DaemonConfigurationRepository $daemonConfigurationRepository;
private NodeUpdateService $nodeUpdateService; private NodeUpdateService $nodeUpdateService;
public function boot(NodeUpdateService $nodeUpdateService): void public function boot(DaemonConfigurationRepository $daemonConfigurationRepository, NodeUpdateService $nodeUpdateService): void
{ {
$this->daemonConfigurationRepository = $daemonConfigurationRepository;
$this->nodeUpdateService = $nodeUpdateService; $this->nodeUpdateService = $nodeUpdateService;
} }
@ -597,39 +599,6 @@ class EditNode extends EditRecord
return $data; return $data;
} }
protected function handleRecordUpdate(Model $record, array $data): Model
{
if (!$record instanceof Node) {
return $record;
}
try {
$record = $this->nodeUpdateService->handle($record, $data);
} catch (Exception $exception) {
$this->errored = true;
Notification::make()
->title(trans('admin/node.error_connecting', ['node' => $record->name]))
->body(trans('admin/node.error_connecting_description'))
->color('warning')
->icon('tabler-database')
->warning()
->send();
}
return parent::handleRecordUpdate($record, $data);
}
protected function getSavedNotification(): ?Notification
{
if ($this->errored) {
return null;
}
return parent::getSavedNotification();
}
protected function getFormActions(): array protected function getFormActions(): array
{ {
return []; return [];
@ -648,6 +617,31 @@ class EditNode extends EditRecord
protected function afterSave(): void protected function afterSave(): void
{ {
$this->fillForm(); $this->fillForm();
/** @var Node $node */
$node = $this->record;
$changed = collect($node->getChanges())->except(['updated_at', 'name', 'tags', 'public', 'maintenance_mode', 'memory', 'memory_overallocate', 'disk', 'disk_overallocate', 'cpu', 'cpu_overallocate'])->all();
try {
if ($changed) {
$this->daemonConfigurationRepository->setNode($node)->update($node);
}
parent::getSavedNotification()?->send();
} catch (ConnectionException) {
Notification::make()
->title(trans('admin/node.error_connecting', ['node' => $node->name]))
->body(trans('admin/node.error_connecting_description'))
->color('warning')
->icon('tabler-database')
->warning()
->send();
}
}
protected function getSavedNotification(): ?Notification
{
return null;
} }
protected function getColumnSpan(): ?int protected function getColumnSpan(): ?int

View File

@ -34,6 +34,7 @@ use Filament\Forms;
use Filament\Forms\Components\Actions as FormActions; use Filament\Forms\Components\Actions as FormActions;
use Filament\Forms\Components\Actions\Action; use Filament\Forms\Components\Actions\Action;
use Filament\Forms\Components\CheckboxList; use Filament\Forms\Components\CheckboxList;
use Filament\Forms\Components\Component;
use Filament\Forms\Components\Fieldset; use Filament\Forms\Components\Fieldset;
use Filament\Forms\Components\Grid; use Filament\Forms\Components\Grid;
use Filament\Forms\Components\Hidden; use Filament\Forms\Components\Hidden;
@ -53,7 +54,6 @@ use Filament\Forms\Set;
use Filament\Notifications\Notification; use Filament\Notifications\Notification;
use Filament\Resources\Pages\EditRecord; use Filament\Resources\Pages\EditRecord;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Client\ConnectionException; use Illuminate\Http\Client\ConnectionException;
use Illuminate\Support\Arr; use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Validator;
@ -65,8 +65,6 @@ class EditServer extends EditRecord
{ {
protected static string $resource = ServerResource::class; protected static string $resource = ServerResource::class;
private bool $errored = false;
private DaemonServerRepository $daemonServerRepository; private DaemonServerRepository $daemonServerRepository;
public function boot(DaemonServerRepository $daemonServerRepository): void public function boot(DaemonServerRepository $daemonServerRepository): void
@ -920,6 +918,7 @@ class EditServer extends EditRecord
->label(trans('admin/server.transfer')) ->label(trans('admin/server.transfer'))
->disabled(fn (Server $server) => Node::count() <= 1 || $server->isInConflictState()) ->disabled(fn (Server $server) => Node::count() <= 1 || $server->isInConflictState())
->modalheading(trans('admin/server.transfer')) ->modalheading(trans('admin/server.transfer'))
->form($this->transferServer())
->action(function (TransferServerService $transfer, Server $server, $data) { ->action(function (TransferServerService $transfer, Server $server, $data) {
try { try {
$transfer->handle($server, Arr::get($data, 'node_id'), Arr::get($data, 'allocation_id'), Arr::get($data, 'allocation_additional', [])); $transfer->handle($server, Arr::get($data, 'node_id'), Arr::get($data, 'allocation_id'), Arr::get($data, 'allocation_additional', []));
@ -935,33 +934,7 @@ class EditServer extends EditRecord
->danger() ->danger()
->send(); ->send();
} }
}) }),
->form([
Select::make('node_id')
->label(trans('admin/server.node'))
->prefixIcon('tabler-server-2')
->selectablePlaceholder(false)
->default(fn (Server $server) => Node::whereNot('id', $server->node->id)->first()?->id)
->required()
->live()
->options(fn (Server $server) => Node::whereNot('id', $server->node->id)->pluck('name', 'id')->all()),
Select::make('allocation_id')
->label(trans('admin/server.primary_allocation'))
->required()
->prefixIcon('tabler-network')
->disabled(fn (Get $get) => !$get('node_id'))
->options(fn (Get $get) => Allocation::where('node_id', $get('node_id'))->whereNull('server_id')->get()->mapWithKeys(fn (Allocation $allocation) => [$allocation->id => $allocation->address]))
->searchable(['ip', 'port', 'ip_alias'])
->placeholder(trans('admin/server.select_allocation')),
Select::make('allocation_additional')
->label(trans('admin/server.additional_allocations'))
->multiple()
->prefixIcon('tabler-network')
->disabled(fn (Get $get) => !$get('node_id'))
->options(fn (Get $get) => Allocation::where('node_id', $get('node_id'))->whereNull('server_id')->when($get('allocation_id'), fn ($query) => $query->whereNot('id', $get('allocation_id')))->get()->mapWithKeys(fn (Allocation $allocation) => [$allocation->id => $allocation->address]))
->searchable(['ip', 'port', 'ip_alias'])
->placeholder(trans('admin/server.select_additional')),
]),
])->fullWidth(), ])->fullWidth(),
ToggleButtons::make('') ToggleButtons::make('')
->hint(new HtmlString(trans('admin/server.transfer_help'))), ->hint(new HtmlString(trans('admin/server.transfer_help'))),
@ -1005,17 +978,35 @@ class EditServer extends EditRecord
]); ]);
} }
protected function transferServer(Form $form): Form /** @return Component[] */
protected function transferServer(): array
{ {
return $form return [
->columns() Select::make('node_id')
->schema([ ->label(trans('admin/server.node'))
Select::make('toNode') ->prefixIcon('tabler-server-2')
->label('New Node'), ->selectablePlaceholder(false)
TextInput::make('newAllocation') ->default(fn (Server $server) => Node::whereNot('id', $server->node->id)->first()?->id)
->label('Allocation'), ->required()
]); ->live()
->options(fn (Server $server) => Node::whereNot('id', $server->node->id)->pluck('name', 'id')->all()),
Select::make('allocation_id')
->label(trans('admin/server.primary_allocation'))
->required()
->prefixIcon('tabler-network')
->disabled(fn (Get $get) => !$get('node_id'))
->options(fn (Get $get) => Allocation::where('node_id', $get('node_id'))->whereNull('server_id')->get()->mapWithKeys(fn (Allocation $allocation) => [$allocation->id => $allocation->address]))
->searchable(['ip', 'port', 'ip_alias'])
->placeholder(trans('admin/server.select_allocation')),
Select::make('allocation_additional')
->label(trans('admin/server.additional_allocations'))
->multiple()
->prefixIcon('tabler-network')
->disabled(fn (Get $get) => !$get('node_id'))
->options(fn (Get $get) => Allocation::where('node_id', $get('node_id'))->whereNull('server_id')->when($get('allocation_id'), fn ($query) => $query->whereNot('id', $get('allocation_id')))->get()->mapWithKeys(fn (Allocation $allocation) => [$allocation->id => $allocation->address]))
->searchable(['ip', 'port', 'ip_alias'])
->placeholder(trans('admin/server.select_additional')),
];
} }
protected function getHeaderActions(): array protected function getHeaderActions(): array
@ -1093,39 +1084,32 @@ class EditServer extends EditRecord
return $data; return $data;
} }
protected function handleRecordUpdate(Model $record, array $data): Model protected function afterSave(): void
{ {
if (!$record instanceof Server) { /** @var Server $server */
return $record; $server = $this->record;
}
/** @var Server $record */ $changed = collect($server->getChanges())->except(['updated_at', 'name', 'owner_id', 'condition', 'description', 'external_id', 'tags', 'cpu_pinning', 'allocation_limit', 'database_limit', 'backup_limit', 'skip_scripts'])->all();
$record = parent::handleRecordUpdate($record, $data);
try { try {
$this->daemonServerRepository->setServer($record)->sync(); if ($changed) {
$this->daemonServerRepository->setServer($server)->sync();
}
parent::getSavedNotification()?->send();
} catch (ConnectionException) { } catch (ConnectionException) {
$this->errored = true;
Notification::make() Notification::make()
->title(trans('admin/server.notifications.error_connecting', ['node' => $record->node->name])) ->title(trans('admin/server.notifications.error_connecting', ['node' => $server->node->name]))
->body(trans('admin/server.notifications.error_connecting_description')) ->body(trans('admin/server.notifications.error_connecting_description'))
->color('warning') ->color('warning')
->icon('tabler-database') ->icon('tabler-database')
->warning() ->warning()
->send(); ->send();
} }
return $record;
} }
protected function getSavedNotification(): ?Notification protected function getSavedNotification(): ?Notification
{ {
if ($this->errored) { return null;
return null;
}
return parent::getSavedNotification();
} }
public function getRelationManagers(): array public function getRelationManagers(): array