Remove DaemonPowerRepository

This commit is contained in:
RMartinOscar 2025-09-05 20:00:47 +00:00
parent 925ab26fb4
commit 9556d3a90e
11 changed files with 47 additions and 55 deletions

View File

@ -3,11 +3,11 @@
namespace App\Console\Commands\Server; namespace App\Console\Commands\Server;
use App\Models\Server; use App\Models\Server;
use App\Repositories\Daemon\DaemonServerRepository;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Illuminate\Validation\ValidationException; use Illuminate\Validation\ValidationException;
use Illuminate\Validation\Factory as ValidatorFactory; use Illuminate\Validation\Factory as ValidatorFactory;
use App\Repositories\Daemon\DaemonPowerRepository;
use Exception; use Exception;
class BulkPowerActionCommand extends Command class BulkPowerActionCommand extends Command
@ -19,7 +19,7 @@ class BulkPowerActionCommand extends Command
protected $description = 'Perform bulk power management on large groupings of servers or nodes at once.'; protected $description = 'Perform bulk power management on large groupings of servers or nodes at once.';
public function handle(DaemonPowerRepository $powerRepository, ValidatorFactory $validator): void public function handle(DaemonServerRepository $serverRepository, ValidatorFactory $validator): void
{ {
$action = $this->argument('action'); $action = $this->argument('action');
$nodes = empty($this->option('nodes')) ? [] : explode(',', $this->option('nodes')); $nodes = empty($this->option('nodes')) ? [] : explode(',', $this->option('nodes'));
@ -52,7 +52,7 @@ class BulkPowerActionCommand extends Command
$bar = $this->output->createProgressBar($count); $bar = $this->output->createProgressBar($count);
$this->getQueryBuilder($servers, $nodes)->get()->each(function ($server, int $index) use ($action, $powerRepository, &$bar): mixed { $this->getQueryBuilder($servers, $nodes)->get()->each(function ($server, int $index) use ($action, $serverRepository, &$bar): mixed {
$bar->clear(); $bar->clear();
if (!$server instanceof Server) { if (!$server instanceof Server) {
@ -60,7 +60,7 @@ class BulkPowerActionCommand extends Command
} }
try { try {
$powerRepository->setServer($server)->send($action); $serverRepository->setServer($server)->power($action);
} catch (Exception $exception) { } catch (Exception $exception) {
$this->output->error(trans('command/messages.server.power.action_failed', [ $this->output->error(trans('command/messages.server.power.action_failed', [
'name' => $server->name, 'name' => $server->name,

View File

@ -7,7 +7,7 @@ use App\Facades\Activity;
use App\Models\Permission; use App\Models\Permission;
use App\Models\Server; use App\Models\Server;
use App\Models\ServerVariable; use App\Models\ServerVariable;
use App\Repositories\Daemon\DaemonPowerRepository; use App\Repositories\Daemon\DaemonServerRepository;
use Closure; use Closure;
use Exception; use Exception;
use Filament\Actions\Action; use Filament\Actions\Action;
@ -76,7 +76,7 @@ class GSLTokenSchema implements FeatureSchemaInterface
->prefix(fn () => '{{' . $serverVariable->variable->env_variable . '}}') ->prefix(fn () => '{{' . $serverVariable->variable->env_variable . '}}')
->helperText(fn () => empty($serverVariable->variable->description) ? '—' : $serverVariable->variable->description), ->helperText(fn () => empty($serverVariable->variable->description) ? '—' : $serverVariable->variable->description),
]) ])
->action(function (array $data, DaemonPowerRepository $powerRepository) use ($server, $serverVariable) { ->action(function (array $data, DaemonServerRepository $serverRepository) use ($server, $serverVariable) {
/** @var Server $server */ /** @var Server $server */
$server = Filament::getTenant(); $server = Filament::getTenant();
try { try {
@ -98,7 +98,7 @@ class GSLTokenSchema implements FeatureSchemaInterface
->log(); ->log();
} }
$powerRepository->setServer($server)->send('restart'); $serverRepository->setServer($server)->power('restart');
Notification::make() Notification::make()
->title('GSL Token updated') ->title('GSL Token updated')

View File

@ -6,7 +6,7 @@ use App\Extensions\Features\FeatureSchemaInterface;
use App\Facades\Activity; use App\Facades\Activity;
use App\Models\Permission; use App\Models\Permission;
use App\Models\Server; use App\Models\Server;
use App\Repositories\Daemon\DaemonPowerRepository; use App\Repositories\Daemon\DaemonServerRepository;
use Exception; use Exception;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Facades\Filament; use Filament\Facades\Filament;
@ -59,7 +59,7 @@ class JavaVersionSchema implements FeatureSchemaInterface
->preload() ->preload()
->native(false), ->native(false),
]) ])
->action(function (array $data, DaemonPowerRepository $powerRepository) use ($server) { ->action(function (array $data, DaemonServerRepository $serverRepository) use ($server) {
try { try {
$new = $data['image']; $new = $data['image'];
$original = $server->image; $original = $server->image;
@ -71,7 +71,7 @@ class JavaVersionSchema implements FeatureSchemaInterface
->log(); ->log();
} }
$powerRepository->setServer($server)->send('restart'); $serverRepository->setServer($server)->power('restart');
Notification::make() Notification::make()
->title('Docker image updated') ->title('Docker image updated')

View File

@ -5,7 +5,7 @@ namespace App\Extensions\Features\Schemas;
use App\Extensions\Features\FeatureSchemaInterface; use App\Extensions\Features\FeatureSchemaInterface;
use App\Models\Server; use App\Models\Server;
use App\Repositories\Daemon\DaemonFileRepository; use App\Repositories\Daemon\DaemonFileRepository;
use App\Repositories\Daemon\DaemonPowerRepository; use App\Repositories\Daemon\DaemonServerRepository;
use Exception; use Exception;
use Filament\Actions\Action; use Filament\Actions\Action;
use Filament\Facades\Filament; use Filament\Facades\Filament;
@ -35,14 +35,14 @@ class MinecraftEulaSchema implements FeatureSchemaInterface
->modalHeading('Minecraft EULA') ->modalHeading('Minecraft EULA')
->modalDescription(new HtmlString(Blade::render('By pressing "I Accept" below you are indicating your agreement to the <x-filament::link href="https://minecraft.net/eula" target="_blank">Minecraft EULA </x-filament::link>.'))) ->modalDescription(new HtmlString(Blade::render('By pressing "I Accept" below you are indicating your agreement to the <x-filament::link href="https://minecraft.net/eula" target="_blank">Minecraft EULA </x-filament::link>.')))
->modalSubmitActionLabel('I Accept') ->modalSubmitActionLabel('I Accept')
->action(function (DaemonFileRepository $fileRepository, DaemonPowerRepository $powerRepository) { ->action(function (DaemonFileRepository $fileRepository, DaemonServerRepository $serverRepository) {
try { try {
/** @var Server $server */ /** @var Server $server */
$server = Filament::getTenant(); $server = Filament::getTenant();
$fileRepository->setServer($server)->putContent('eula.txt', 'eula=true'); $fileRepository->setServer($server)->putContent('eula.txt', 'eula=true');
$powerRepository->setServer($server)->send('restart'); $serverRepository->setServer($server)->power('restart');
Notification::make() Notification::make()
->title('Minecraft EULA accepted') ->title('Minecraft EULA accepted')

View File

@ -8,7 +8,7 @@ use App\Filament\Components\Tables\Columns\ServerEntryColumn;
use App\Filament\Server\Pages\Console; use App\Filament\Server\Pages\Console;
use App\Models\Permission; use App\Models\Permission;
use App\Models\Server; use App\Models\Server;
use App\Repositories\Daemon\DaemonPowerRepository; use App\Repositories\Daemon\DaemonServerRepository;
use App\Traits\Filament\CanCustomizeHeaderActions; use App\Traits\Filament\CanCustomizeHeaderActions;
use App\Traits\Filament\CanCustomizeHeaderWidgets; use App\Traits\Filament\CanCustomizeHeaderWidgets;
use Filament\Notifications\Notification; use Filament\Notifications\Notification;
@ -38,11 +38,11 @@ class ListServers extends ListRecords
public const WARNING_THRESHOLD = 0.7; public const WARNING_THRESHOLD = 0.7;
private DaemonPowerRepository $daemonPowerRepository; private DaemonServerRepository $daemonServerRepository;
public function boot(): void public function boot(): void
{ {
$this->daemonPowerRepository = new DaemonPowerRepository(); $this->daemonServerRepository = new DaemonServerRepository();
} }
/** @return Stack[] */ /** @return Stack[] */
@ -204,7 +204,7 @@ class ListServers extends ListRecords
public function powerAction(Server $server, string $action): void public function powerAction(Server $server, string $action): void
{ {
try { try {
$this->daemonPowerRepository->setServer($server)->send($action); $this->daemonServerRepository->setServer($server)->power($action);
Notification::make() Notification::make()
->title(trans('server/dashboard.power_actions')) ->title(trans('server/dashboard.power_actions'))

View File

@ -5,9 +5,9 @@ namespace App\Http\Controllers\Api\Client\Servers;
use Illuminate\Http\Response; use Illuminate\Http\Response;
use App\Models\Server; use App\Models\Server;
use App\Facades\Activity; use App\Facades\Activity;
use App\Repositories\Daemon\DaemonPowerRepository;
use App\Http\Controllers\Api\Client\ClientApiController; use App\Http\Controllers\Api\Client\ClientApiController;
use App\Http\Requests\Api\Client\Servers\SendPowerRequest; use App\Http\Requests\Api\Client\Servers\SendPowerRequest;
use App\Repositories\Daemon\DaemonServerRepository;
use Dedoc\Scramble\Attributes\Group; use Dedoc\Scramble\Attributes\Group;
use Illuminate\Http\Client\ConnectionException; use Illuminate\Http\Client\ConnectionException;
@ -17,7 +17,7 @@ class PowerController extends ClientApiController
/** /**
* PowerController constructor. * PowerController constructor.
*/ */
public function __construct(private DaemonPowerRepository $repository) public function __construct(private DaemonServerRepository $repository)
{ {
parent::__construct(); parent::__construct();
} }
@ -31,7 +31,7 @@ class PowerController extends ClientApiController
*/ */
public function index(SendPowerRequest $request, Server $server): Response public function index(SendPowerRequest $request, Server $server): Response
{ {
$this->repository->setServer($server)->send( $this->repository->setServer($server)->power(
$request->input('signal') $request->input('signal')
); );

View File

@ -5,11 +5,11 @@ namespace App\Jobs\Schedule;
use App\Jobs\Job; use App\Jobs\Job;
use Carbon\CarbonImmutable; use Carbon\CarbonImmutable;
use App\Models\Task; use App\Models\Task;
use App\Repositories\Daemon\DaemonServerRepository;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Contracts\Queue\ShouldQueue;
use App\Services\Backups\InitiateBackupService; use App\Services\Backups\InitiateBackupService;
use App\Repositories\Daemon\DaemonPowerRepository;
use App\Services\Files\DeleteFilesService; use App\Services\Files\DeleteFilesService;
use Exception; use Exception;
use Illuminate\Http\Client\ConnectionException; use Illuminate\Http\Client\ConnectionException;
@ -31,7 +31,7 @@ class RunTaskJob extends Job implements ShouldQueue
*/ */
public function handle( public function handle(
InitiateBackupService $backupService, InitiateBackupService $backupService,
DaemonPowerRepository $powerRepository, DaemonServerRepository $serverRepository,
DeleteFilesService $deleteFilesService DeleteFilesService $deleteFilesService
): void { ): void {
// Do not process a task that is not set to active, unless it's been manually triggered. // Do not process a task that is not set to active, unless it's been manually triggered.
@ -57,7 +57,7 @@ class RunTaskJob extends Job implements ShouldQueue
try { try {
switch ($this->task->action) { switch ($this->task->action) {
case Task::ACTION_POWER: case Task::ACTION_POWER:
$powerRepository->setServer($server)->send($this->task->payload); $serverRepository->setServer($server)->power($this->task->payload);
break; break;
case Task::ACTION_COMMAND: case Task::ACTION_COMMAND:
$server->send($this->task->payload); $server->send($this->task->payload);

View File

@ -1,21 +0,0 @@
<?php
namespace App\Repositories\Daemon;
use Illuminate\Http\Client\ConnectionException;
use Illuminate\Http\Client\Response;
class DaemonPowerRepository extends DaemonRepository
{
/**
* Sends a power action to the server instance.
*
* @throws ConnectionException
*/
public function send(string $action): Response
{
return $this->getHttpClient()->post("/api/servers/{$this->server->uuid}/power",
['action' => $action],
);
}
}

View File

@ -8,6 +8,7 @@ use Exception;
use Filament\Notifications\Notification; use Filament\Notifications\Notification;
use Illuminate\Http\Client\ConnectionException; use Illuminate\Http\Client\ConnectionException;
use Illuminate\Http\Client\RequestException; use Illuminate\Http\Client\RequestException;
use Illuminate\Http\Client\Response;
class DaemonServerRepository extends DaemonRepository class DaemonServerRepository extends DaemonRepository
{ {
@ -149,4 +150,16 @@ class DaemonServerRepository extends DaemonRepository
->throw() ->throw()
->json('data'); ->json('data');
} }
/**
* Sends a power action to the server instance.
*
* @throws ConnectionException
*/
public function power(string $action): Response
{
return $this->getHttpClient()->post("/api/servers/{$this->server->uuid}/power",
['action' => $action],
);
}
} }

View File

@ -4,7 +4,7 @@ namespace App\Tests\Integration\Api\Client\Server;
use Illuminate\Http\Response; use Illuminate\Http\Response;
use App\Models\Permission; use App\Models\Permission;
use App\Repositories\Daemon\DaemonPowerRepository; use App\Repositories\Daemon\DaemonServerRepository;
use App\Tests\Integration\Api\Client\ClientApiIntegrationTestCase; use App\Tests\Integration\Api\Client\ClientApiIntegrationTestCase;
use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\Attributes\DataProvider;
@ -49,8 +49,8 @@ class PowerControllerTest extends ClientApiIntegrationTestCase
#[DataProvider('validPowerActionDataProvider')] #[DataProvider('validPowerActionDataProvider')]
public function test_action_can_be_sent_to_server(string $action, string $permission): void public function test_action_can_be_sent_to_server(string $action, string $permission): void
{ {
$service = \Mockery::mock(DaemonPowerRepository::class); $service = \Mockery::mock(DaemonServerRepository::class);
$this->app->instance(DaemonPowerRepository::class, $service); $this->app->instance(DaemonServerRepository::class, $service);
[$user, $server] = $this->generateTestAccount([$permission]); [$user, $server] = $this->generateTestAccount([$permission]);
@ -60,7 +60,7 @@ class PowerControllerTest extends ClientApiIntegrationTestCase
})) }))
->andReturnSelf() ->andReturnSelf()
->getMock() ->getMock()
->expects('send') ->expects('power')
->with(trim($action)); ->with(trim($action));
$this->actingAs($user) $this->actingAs($user)

View File

@ -10,8 +10,8 @@ use App\Models\Server;
use App\Models\Schedule; use App\Models\Schedule;
use Illuminate\Support\Facades\Bus; use Illuminate\Support\Facades\Bus;
use App\Jobs\Schedule\RunTaskJob; use App\Jobs\Schedule\RunTaskJob;
use App\Repositories\Daemon\DaemonServerRepository;
use App\Tests\Integration\IntegrationTestCase; use App\Tests\Integration\IntegrationTestCase;
use App\Repositories\Daemon\DaemonPowerRepository;
use Illuminate\Http\Client\ConnectionException; use Illuminate\Http\Client\ConnectionException;
use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\Attributes\DataProvider;
@ -84,13 +84,13 @@ class RunTaskJobTest extends IntegrationTestCase
'continue_on_failure' => false, 'continue_on_failure' => false,
]); ]);
$mock = \Mockery::mock(DaemonPowerRepository::class); $mock = \Mockery::mock(DaemonServerRepository::class);
$this->instance(DaemonPowerRepository::class, $mock); $this->instance(DaemonServerRepository::class, $mock);
$mock->expects('setServer')->with(\Mockery::on(function ($value) use ($server) { $mock->expects('setServer')->with(\Mockery::on(function ($value) use ($server) {
return $value instanceof Server && $value->id === $server->id; return $value instanceof Server && $value->id === $server->id;
}))->andReturnSelf(); }))->andReturnSelf();
$mock->expects('send')->with('start'); $mock->expects('power')->with('start');
Bus::dispatchSync(new RunTaskJob($task, $isManualRun)); Bus::dispatchSync(new RunTaskJob($task, $isManualRun));
@ -117,10 +117,10 @@ class RunTaskJobTest extends IntegrationTestCase
'continue_on_failure' => $continueOnFailure, 'continue_on_failure' => $continueOnFailure,
]); ]);
$mock = \Mockery::mock(DaemonPowerRepository::class); $mock = \Mockery::mock(DaemonServerRepository::class);
$this->instance(DaemonPowerRepository::class, $mock); $this->instance(DaemonServerRepository::class, $mock);
$mock->expects('setServer->send')->andThrow(new ConnectionException()); $mock->expects('setServer->power')->andThrow(new ConnectionException());
if (!$continueOnFailure) { if (!$continueOnFailure) {
$this->expectException(ConnectionException::class); $this->expectException(ConnectionException::class);