mirror of
https://github.com/pelican-dev/panel.git
synced 2025-05-20 05:14:46 +02:00
Remove backup and mount repositories
This commit is contained in:
parent
9d3a6ae494
commit
aa93cd65c1
@ -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());
|
||||
|
||||
|
@ -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(),
|
||||
]);
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
]);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -1,45 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Repositories\Eloquent;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use App\Models\Backup;
|
||||
use App\Models\Server;
|
||||
use Illuminate\Support\Collection;
|
||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||
|
||||
class BackupRepository extends EloquentRepository
|
||||
{
|
||||
public function model(): string
|
||||
{
|
||||
return Backup::class;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if too many backups have been generated by the server.
|
||||
*/
|
||||
public function getBackupsGeneratedDuringTimespan(int $server, int $seconds = 600): array|Collection
|
||||
{
|
||||
return $this->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);
|
||||
});
|
||||
}
|
||||
}
|
@ -1,57 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Repositories\Eloquent;
|
||||
|
||||
use App\Models\Mount;
|
||||
use App\Models\Server;
|
||||
use Illuminate\Support\Collection;
|
||||
use Illuminate\Database\Eloquent\ModelNotFoundException;
|
||||
use App\Exceptions\Repository\RecordNotFoundException;
|
||||
|
||||
class MountRepository extends EloquentRepository
|
||||
{
|
||||
/**
|
||||
* Return the model backing this repository.
|
||||
*/
|
||||
public function model(): string
|
||||
{
|
||||
return Mount::class;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return mounts with a count of eggs, nodes, and servers attached to it.
|
||||
*/
|
||||
public function getAllWithDetails(): Collection
|
||||
{
|
||||
return $this->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());
|
||||
}
|
||||
}
|
@ -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()),
|
||||
|
Loading…
x
Reference in New Issue
Block a user