Allow admins to change server egg (#811)

* add service that handles egg changing

* add "change egg" action to EditServer page

* add toggle for keeping old variables or not
This commit is contained in:
Boy132 2024-12-10 23:38:40 +01:00 committed by GitHub
parent ef1ae72d06
commit 0051d9fefc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 73 additions and 2 deletions

View File

@ -15,6 +15,7 @@ use App\Models\Server;
use App\Models\ServerVariable;
use App\Services\Databases\DatabaseManagementService;
use App\Services\Databases\DatabasePasswordService;
use App\Services\Eggs\EggChangerService;
use App\Services\Servers\RandomWordService;
use App\Services\Servers\ReinstallServerService;
use App\Services\Servers\ServerDeletionService;
@ -38,6 +39,7 @@ use Filament\Forms\Components\Tabs\Tab;
use Filament\Forms\Components\TagsInput;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Toggle;
use Filament\Forms\Components\ToggleButtons;
use Filament\Forms\Form;
use Filament\Forms\Get;
@ -474,7 +476,7 @@ class EditServer extends EditRecord
])
->schema([
Select::make('egg_id')
->disabledOn('edit')
->disabled()
->prefixIcon('tabler-egg')
->columnSpan([
'default' => 6,
@ -485,7 +487,28 @@ class EditServer extends EditRecord
->relationship('egg', 'name')
->searchable()
->preload()
->required()
->hintAction(
Action::make('change_egg')
->action(function (array $data, Server $server, EggChangerService $service) {
$service->handle($server, $data['egg_id'], $data['keepOldVariables']);
// Use redirect instead of fillForm to prevent server variables from duplicating
$this->redirect($this->getUrl(['record' => $server, 'tab' => '-egg-tab']), true);
})
->form(fn (Server $server) => [
Select::make('egg_id')
->label('New Egg')
->prefixIcon('tabler-egg')
->options(fn () => Egg::all()->filter(fn (Egg $egg) => $egg->id !== $server->egg->id)->mapWithKeys(fn (Egg $egg) => [$egg->id => $egg->name]))
->searchable()
->preload()
->required(),
Toggle::make('keepOldVariables')
->label('Keep old variables if possible?')
->default(true),
])
),
ToggleButtons::make('skip_scripts')
->label('Run Egg Install Script?')->inline()

View File

@ -0,0 +1,48 @@
<?php
namespace App\Services\Eggs;
use App\Models\Egg;
use App\Models\Server;
use App\Models\ServerVariable;
class EggChangerService
{
public function handle(Server $server, Egg|int $newEgg, bool $keepOldVariables = true): void
{
if (!$newEgg instanceof Egg) {
$newEgg = Egg::findOrFail($newEgg);
}
if ($server->egg->id === $newEgg->id) {
return;
}
// Change egg id, default image and startup command
$server->forceFill([
'egg_id' => $newEgg->id,
'image' => array_values($newEgg->docker_images)[0],
'startup' => $newEgg->startup,
])->saveOrFail();
$oldVariables = [];
if ($keepOldVariables) {
// Keep copy of old server variables
foreach ($server->serverVariables as $serverVariable) {
$oldVariables[$serverVariable->variable->env_variable] = $serverVariable->variable_value;
}
}
// Delete old server variables
ServerVariable::where('server_id', $server->id)->delete();
// Create new server variables
foreach ($newEgg->variables as $eggVariable) {
ServerVariable::create([
'server_id' => $server->id,
'variable_id' => $eggVariable->id,
'variable_value' => $oldVariables[$eggVariable->env_variable] ?? $eggVariable->default_value,
]);
}
}
}