From aa93cd65c10cbd0b334b1478468b5fbf3774ea9f Mon Sep 17 00:00:00 2001 From: Lance Pioch Date: Sat, 16 Mar 2024 23:01:45 -0400 Subject: [PATCH] Remove backup and mount repositories --- .../PruneOrphanedBackupsCommand.php | 12 +--- .../Controllers/Admin/MountController.php | 10 +--- .../Admin/Servers/ServerViewController.php | 10 +++- .../Controllers/Admin/ServersController.php | 2 - .../Api/Client/Servers/BackupController.php | 4 +- app/Models/Server.php | 25 ++++++++ .../Eloquent/BackupRepository.php | 45 --------------- app/Repositories/Eloquent/MountRepository.php | 57 ------------------- .../Backups/InitiateBackupService.php | 8 +-- 9 files changed, 41 insertions(+), 132 deletions(-) delete mode 100644 app/Repositories/Eloquent/BackupRepository.php delete mode 100644 app/Repositories/Eloquent/MountRepository.php diff --git a/app/Console/Commands/Maintenance/PruneOrphanedBackupsCommand.php b/app/Console/Commands/Maintenance/PruneOrphanedBackupsCommand.php index 97d2ebc22..8c10995e7 100644 --- a/app/Console/Commands/Maintenance/PruneOrphanedBackupsCommand.php +++ b/app/Console/Commands/Maintenance/PruneOrphanedBackupsCommand.php @@ -2,9 +2,9 @@ namespace App\Console\Commands\Maintenance; +use App\Models\Backup; use Carbon\CarbonImmutable; use Illuminate\Console\Command; -use App\Repositories\Eloquent\BackupRepository; class PruneOrphanedBackupsCommand extends Command { @@ -12,14 +12,6 @@ class PruneOrphanedBackupsCommand extends Command protected $description = 'Marks all backups older than "n" minutes that have not yet completed as being failed.'; - /** - * PruneOrphanedBackupsCommand constructor. - */ - public function __construct(private BackupRepository $backupRepository) - { - parent::__construct(); - } - public function handle() { $since = $this->option('prune-age') ?? config('backups.prune_age', 360); @@ -27,7 +19,7 @@ class PruneOrphanedBackupsCommand extends Command throw new \InvalidArgumentException('The "--prune-age" argument must be a value greater than 0.'); } - $query = $this->backupRepository->getBuilder() + $query = Backup::query() ->whereNull('completed_at') ->where('created_at', '<=', CarbonImmutable::now()->subMinutes($since)->toDateTimeString()); diff --git a/app/Http/Controllers/Admin/MountController.php b/app/Http/Controllers/Admin/MountController.php index de39ac89a..7ae12f3f6 100644 --- a/app/Http/Controllers/Admin/MountController.php +++ b/app/Http/Controllers/Admin/MountController.php @@ -13,7 +13,6 @@ use Prologue\Alerts\AlertsMessageBag; use Illuminate\View\Factory as ViewFactory; use App\Http\Controllers\Controller; use App\Http\Requests\Admin\MountFormRequest; -use App\Repositories\Eloquent\MountRepository; class MountController extends Controller { @@ -22,7 +21,6 @@ class MountController extends Controller */ public function __construct( protected AlertsMessageBag $alert, - protected MountRepository $repository, protected ViewFactory $view ) { } @@ -33,7 +31,7 @@ class MountController extends Controller public function index(): View { return $this->view->make('admin.mounts.index', [ - 'mounts' => $this->repository->getAllWithDetails(), + 'mounts' => Mount::query()->withCount(['eggs', 'nodes'])->get(), ]); } @@ -44,11 +42,9 @@ class MountController extends Controller */ public function view(string $id): View { - $eggs = Egg::all(); - return $this->view->make('admin.mounts.view', [ - 'mount' => $this->repository->getWithRelations($id), - 'eggs' => $eggs, + 'mount' => Mount::with(['eggs', 'nodes'])->findOrFail($id), + 'eggs' => Egg::all(), ]); } diff --git a/app/Http/Controllers/Admin/Servers/ServerViewController.php b/app/Http/Controllers/Admin/Servers/ServerViewController.php index 1ea32be5c..e75c8fb62 100644 --- a/app/Http/Controllers/Admin/Servers/ServerViewController.php +++ b/app/Http/Controllers/Admin/Servers/ServerViewController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers\Admin\Servers; use App\Models\DatabaseHost; use App\Models\Egg; +use App\Models\Mount; use App\Models\Node; use Illuminate\View\View; use Illuminate\Http\Request; @@ -12,7 +13,6 @@ use App\Exceptions\DisplayException; use App\Http\Controllers\Controller; use App\Services\Servers\EnvironmentService; use Illuminate\Contracts\View\Factory as ViewFactory; -use App\Repositories\Eloquent\MountRepository; use App\Traits\Controllers\JavascriptInjection; class ServerViewController extends Controller @@ -23,7 +23,6 @@ class ServerViewController extends Controller * ServerViewController constructor. */ public function __construct( - private MountRepository $mountRepository, private EnvironmentService $environmentService, private ViewFactory $view ) { @@ -96,8 +95,13 @@ class ServerViewController extends Controller { $server->load('mounts'); + $mounts = Mount::query() + ->whereHas('eggs', fn ($q) => $q->where('id', $server->egg_id)) + ->whereHas('nodes', fn ($q) => $q->where('id', $server->node_id)) + ->get(); + return $this->view->make('admin.servers.view.mounts', [ - 'mounts' => $this->mountRepository->getMountListForServer($server), + 'mounts' => $mounts, 'server' => $server, ]); } diff --git a/app/Http/Controllers/Admin/ServersController.php b/app/Http/Controllers/Admin/ServersController.php index 05d00fc86..1400d36be 100644 --- a/app/Http/Controllers/Admin/ServersController.php +++ b/app/Http/Controllers/Admin/ServersController.php @@ -15,7 +15,6 @@ use App\Exceptions\DisplayException; use App\Http\Controllers\Controller; use Illuminate\Validation\ValidationException; use App\Services\Servers\SuspensionService; -use App\Repositories\Eloquent\MountRepository; use App\Services\Servers\ServerDeletionService; use App\Services\Servers\ReinstallServerService; use App\Exceptions\Model\DataValidationException; @@ -44,7 +43,6 @@ class ServersController extends Controller protected ServerDeletionService $deletionService, protected DetailsModificationService $detailsModificationService, protected ReinstallServerService $reinstallService, - protected MountRepository $mountRepository, protected ServerConfigurationStructureService $serverConfigurationStructureService, protected StartupModificationService $startupModificationService, protected SuspensionService $suspensionService diff --git a/app/Http/Controllers/Api/Client/Servers/BackupController.php b/app/Http/Controllers/Api/Client/Servers/BackupController.php index a9a18461e..5c88666fd 100644 --- a/app/Http/Controllers/Api/Client/Servers/BackupController.php +++ b/app/Http/Controllers/Api/Client/Servers/BackupController.php @@ -11,7 +11,6 @@ use App\Models\Permission; use Illuminate\Auth\Access\AuthorizationException; use App\Services\Backups\DeleteBackupService; use App\Services\Backups\DownloadLinkService; -use App\Repositories\Eloquent\BackupRepository; use App\Services\Backups\InitiateBackupService; use App\Repositories\Daemon\DaemonBackupRepository; use App\Transformers\Api\Client\BackupTransformer; @@ -30,7 +29,6 @@ class BackupController extends ClientApiController private DeleteBackupService $deleteBackupService, private InitiateBackupService $initiateBackupService, private DownloadLinkService $downloadLinkService, - private BackupRepository $repository ) { parent::__construct(); } @@ -52,7 +50,7 @@ class BackupController extends ClientApiController return $this->fractal->collection($server->backups()->paginate($limit)) ->transformWith($this->getTransformer(BackupTransformer::class)) ->addMeta([ - 'backup_count' => $this->repository->getNonFailedBackups($server)->count(), + 'backup_count' => $server->getNonFailedBackups()->count(), ]) ->toArray(); } diff --git a/app/Models/Server.php b/app/Models/Server.php index 0544d351d..290dd5ec4 100644 --- a/app/Models/Server.php +++ b/app/Models/Server.php @@ -3,10 +3,12 @@ namespace App\Models; use App\Exceptions\Http\Connection\DaemonConnectionException; +use Carbon\Carbon; use GuzzleHttp\Exception\GuzzleException; use GuzzleHttp\Exception\TransferException; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Query\JoinClause; +use Illuminate\Support\Collection; use Illuminate\Support\Facades\Http; use Psr\Http\Message\ResponseInterface; use Znck\Eloquent\Traits\BelongsToThrough; @@ -386,4 +388,27 @@ class Server extends Model throw new DaemonConnectionException($exception); } } + + /** + * Determines if too many backups have been generated by the server. + */ + public function getBackupsGeneratedDuringTimespan(int $seconds = 600): array|Collection + { + return self::query() + ->backups() + ->where(fn ($query) => $query->whereNull('completed_at')->orWhere('is_successful', true)) + ->where('created_at', '>=', now()->subSeconds($seconds)) + ->withTrashed() + ->get(); + } + + /** + * Returns a query filtering only non-failed backups for a specific server. + */ + public function getNonFailedBackups(): HasMany + { + return $this->backups()->where( + fn ($query) => $query->whereNull('completed_at')->orWhere('is_successful', true) + ); + } } diff --git a/app/Repositories/Eloquent/BackupRepository.php b/app/Repositories/Eloquent/BackupRepository.php deleted file mode 100644 index ae2fe6d31..000000000 --- a/app/Repositories/Eloquent/BackupRepository.php +++ /dev/null @@ -1,45 +0,0 @@ -getBuilder() - ->withTrashed() - ->where('server_id', $server) - ->where(function ($query) { - $query->whereNull('completed_at') - ->orWhere('is_successful', '=', true); - }) - ->where('created_at', '>=', Carbon::now()->subSeconds($seconds)->toDateTimeString()) - ->get() - ->toBase(); - } - - /** - * Returns a query filtering only non-failed backups for a specific server. - */ - public function getNonFailedBackups(Server $server): HasMany - { - return $server->backups()->where(function ($query) { - $query->whereNull('completed_at') - ->orWhere('is_successful', true); - }); - } -} diff --git a/app/Repositories/Eloquent/MountRepository.php b/app/Repositories/Eloquent/MountRepository.php deleted file mode 100644 index 9a83e85f0..000000000 --- a/app/Repositories/Eloquent/MountRepository.php +++ /dev/null @@ -1,57 +0,0 @@ -getBuilder()->withCount('eggs', 'nodes')->get($this->getColumns()); - } - - /** - * Return all the mounts and their respective relations. - * - * @throws \App\Exceptions\Repository\RecordNotFoundException - */ - public function getWithRelations(string $id): Mount - { - try { - return $this->getBuilder()->with('eggs', 'nodes')->findOrFail($id, $this->getColumns()); - } catch (ModelNotFoundException $exception) { - throw new RecordNotFoundException(); - } - } - - /** - * Return mounts available to a server (ignoring if they are or are not mounted). - */ - public function getMountListForServer(Server $server): Collection - { - return $this->getBuilder() - ->whereHas('eggs', function ($q) use ($server) { - $q->where('id', '=', $server->egg_id); - }) - ->whereHas('nodes', function ($q) use ($server) { - $q->where('id', '=', $server->node_id); - }) - ->get($this->getColumns()); - } -} diff --git a/app/Services/Backups/InitiateBackupService.php b/app/Services/Backups/InitiateBackupService.php index e40345ba7..cf4a0f40b 100644 --- a/app/Services/Backups/InitiateBackupService.php +++ b/app/Services/Backups/InitiateBackupService.php @@ -9,7 +9,6 @@ use App\Models\Backup; use App\Models\Server; use Illuminate\Database\ConnectionInterface; use App\Extensions\Backups\BackupManager; -use App\Repositories\Eloquent\BackupRepository; use App\Repositories\Daemon\DaemonBackupRepository; use App\Exceptions\Service\Backup\TooManyBackupsException; use Symfony\Component\HttpKernel\Exception\TooManyRequestsHttpException; @@ -24,7 +23,6 @@ class InitiateBackupService * InitiateBackupService constructor. */ public function __construct( - private BackupRepository $repository, private ConnectionInterface $connection, private DaemonBackupRepository $daemonBackupRepository, private DeleteBackupService $deleteBackupService, @@ -78,7 +76,7 @@ class InitiateBackupService $limit = config('backups.throttles.limit'); $period = config('backups.throttles.period'); if ($period > 0) { - $previous = $this->repository->getBackupsGeneratedDuringTimespan($server->id, $period); + $previous = $server->getBackupsGeneratedDuringTimespan($period); if ($previous->count() >= $limit) { $message = sprintf('Only %d backups may be generated within a %d second span of time.', $limit, $period); @@ -88,7 +86,7 @@ class InitiateBackupService // Check if the server has reached or exceeded its backup limit. // completed_at == null will cover any ongoing backups, while is_successful == true will cover any completed backups. - $successful = $this->repository->getNonFailedBackups($server); + $successful = $server->getNonFailedBackups(); if (!$server->backup_limit || $successful->count() >= $server->backup_limit) { // Do not allow the user to continue if this server is already at its limit and can't override. if (!$override || $server->backup_limit <= 0) { @@ -109,7 +107,7 @@ class InitiateBackupService return $this->connection->transaction(function () use ($server, $name) { /** @var \App\Models\Backup $backup */ - $backup = $this->repository->create([ + $backup = Backup::query()->create([ 'server_id' => $server->id, 'uuid' => Uuid::uuid4()->toString(), 'name' => trim($name) ?: sprintf('Backup at %s', CarbonImmutable::now()->toDateTimeString()),