pelican-panel-mirror/app/Services/Eggs/EggChangerService.php
Boy132 0051d9fefc
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
2024-12-10 23:38:40 +01:00

49 lines
1.4 KiB
PHP

<?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,
]);
}
}
}