Skip to content

Commit 10b357b

Browse files
authored
ui(server): fix used backup count (pterodactyl#3526)
* ui(server): fix used backup count * ui(server): refactor backup count code
1 parent 7e91a33 commit 10b357b

File tree

7 files changed

+41
-32
lines changed

7 files changed

+41
-32
lines changed

app/Http/Controllers/Api/Client/Servers/BackupController.php

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Pterodactyl\Services\Backups\DeleteBackupService;
1313
use Pterodactyl\Services\Backups\DownloadLinkService;
1414
use Pterodactyl\Services\Backups\InitiateBackupService;
15+
use Pterodactyl\Repositories\Eloquent\BackupRepository;
1516
use Pterodactyl\Repositories\Wings\DaemonBackupRepository;
1617
use Pterodactyl\Transformers\Api\Client\BackupTransformer;
1718
use Pterodactyl\Http\Controllers\Api\Client\ClientApiController;
@@ -20,45 +21,33 @@
2021

2122
class BackupController extends ClientApiController
2223
{
23-
/**
24-
* @var \Pterodactyl\Services\Backups\InitiateBackupService
25-
*/
26-
private $initiateBackupService;
27-
28-
/**
29-
* @var \Pterodactyl\Services\Backups\DeleteBackupService
30-
*/
31-
private $deleteBackupService;
32-
33-
/**
34-
* @var \Pterodactyl\Services\Backups\DownloadLinkService
35-
*/
36-
private $downloadLinkService;
37-
38-
/**
39-
* @var \Pterodactyl\Repositories\Wings\DaemonBackupRepository
40-
*/
41-
private $repository;
24+
private InitiateBackupService $initiateBackupService;
25+
private DeleteBackupService $deleteBackupService;
26+
private DownloadLinkService $downloadLinkService;
27+
private DaemonBackupRepository $daemonRepository;
28+
private BackupRepository $repository;
4229

4330
/**
4431
* BackupController constructor.
4532
*/
4633
public function __construct(
47-
DaemonBackupRepository $repository,
34+
DaemonBackupRepository $daemonRepository,
4835
DeleteBackupService $deleteBackupService,
4936
InitiateBackupService $initiateBackupService,
50-
DownloadLinkService $downloadLinkService
37+
DownloadLinkService $downloadLinkService,
38+
BackupRepository $repository
5139
) {
5240
parent::__construct();
5341

5442
$this->repository = $repository;
5543
$this->initiateBackupService = $initiateBackupService;
5644
$this->deleteBackupService = $deleteBackupService;
5745
$this->downloadLinkService = $downloadLinkService;
46+
$this->daemonRepository = $daemonRepository;
5847
}
5948

6049
/**
61-
* Returns all of the backups for a given server instance in a paginated
50+
* Returns all the backups for a given server instance in a paginated
6251
* result set.
6352
*
6453
* @throws \Illuminate\Auth\Access\AuthorizationException
@@ -73,6 +62,9 @@ public function index(Request $request, Server $server): array
7362

7463
return $this->fractal->collection($server->backups()->paginate($limit))
7564
->transformWith($this->getTransformer(BackupTransformer::class))
65+
->addMeta([
66+
'backup_count' => $this->repository->getNonFailedBackups($server)->count(),
67+
])
7668
->toArray();
7769
}
7870

@@ -242,7 +234,7 @@ public function restore(Request $request, Server $server, Backup $backup): JsonR
242234
// actions against it via the Panel API.
243235
$server->update(['status' => Server::STATUS_RESTORING_BACKUP]);
244236

245-
$this->repository->setServer($server)->restore($backup, $url ?? null, $request->input('truncate'));
237+
$this->daemonRepository->setServer($server)->restore($backup, $url ?? null, $request->input('truncate'));
246238
});
247239

248240
return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);

app/Repositories/Eloquent/BackupRepository.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
use Carbon\Carbon;
66
use Pterodactyl\Models\Backup;
7+
use Pterodactyl\Models\Server;
8+
use Illuminate\Database\Eloquent\Relations\HasMany;
79

810
class BackupRepository extends EloquentRepository
911
{
@@ -33,4 +35,17 @@ public function getBackupsGeneratedDuringTimespan(int $server, int $seconds = 60
3335
->get()
3436
->toBase();
3537
}
38+
39+
/**
40+
* Returns a query filtering only non-failed backups for a specific server.
41+
*
42+
* @return \Illuminate\Database\Eloquent\Relations\HasMany
43+
*/
44+
public function getNonFailedBackups(Server $server): HasMany
45+
{
46+
return $server->backups()->where(function ($query) {
47+
$query->whereNull('completed_at')
48+
->orWhere('is_successful', true);
49+
});
50+
}
3651
}

app/Services/Backups/InitiateBackupService.php

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Pterodactyl\Models\Server;
1010
use Illuminate\Database\ConnectionInterface;
1111
use Pterodactyl\Extensions\Backups\BackupManager;
12+
use Illuminate\Database\Eloquent\Relations\HasMany;
1213
use Pterodactyl\Repositories\Eloquent\BackupRepository;
1314
use Pterodactyl\Repositories\Wings\DaemonBackupRepository;
1415
use Pterodactyl\Exceptions\Service\Backup\TooManyBackupsException;
@@ -134,10 +135,7 @@ public function handle(Server $server, string $name = null, bool $override = fal
134135

135136
// Check if the server has reached or exceeded its backup limit.
136137
// completed_at == null will cover any ongoing backups, while is_successful == true will cover any completed backups.
137-
$successful = $server->backups()->where(function ($query) {
138-
$query->whereNull('completed_at')
139-
->orWhere('is_successful', true);
140-
});
138+
$successful = $this->repository->getNonFailedBackups($server);
141139
if (!$server->backup_limit || $successful->count() >= $server->backup_limit) {
142140
// Do not allow the user to continue if this server is already at its limit and can't override.
143141
if (!$override || $server->backup_limit <= 0) {

resources/scripts/api/swr/getServerBackups.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,19 @@ interface ctx {
1212

1313
export const Context = createContext<ctx>({ page: 1, setPage: () => 1 });
1414

15+
type BackupResponse = PaginatedResult<ServerBackup> & { backupCount: number };
16+
1517
export default () => {
1618
const { page } = useContext(Context);
1719
const uuid = ServerContext.useStoreState(state => state.server.data!.uuid);
1820

19-
return useSWR<PaginatedResult<ServerBackup>>([ 'server:backups', uuid, page ], async () => {
21+
return useSWR<BackupResponse>([ 'server:backups', uuid, page ], async () => {
2022
const { data } = await http.get(`/api/client/servers/${uuid}/backups`, { params: { page } });
2123

2224
return ({
2325
items: (data.data || []).map(rawDataToServerBackup),
2426
pagination: getPaginationSet(data.meta.pagination),
27+
backupCount: data.meta.backup_count,
2528
});
2629
});
2730
};

resources/scripts/components/server/backups/BackupContainer.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,12 @@ const BackupContainer = () => {
6565
}
6666
<Can action={'backup.create'}>
6767
<div css={tw`mt-6 sm:flex items-center justify-end`}>
68-
{(backupLimit > 0 && backups.pagination.total > 0) &&
68+
{(backupLimit > 0 && backups.backupCount > 0) &&
6969
<p css={tw`text-sm text-neutral-300 mb-4 sm:mr-6 sm:mb-0`}>
70-
{backups.pagination.total} of {backupLimit} backups have been created for this server.
70+
{backups.backupCount} of {backupLimit} backups have been created for this server.
7171
</p>
7272
}
73-
{backupLimit > 0 && backupLimit !== backups.pagination.total &&
73+
{backupLimit > 0 && backupLimit > backups.backupCount &&
7474
<CreateBackupButton css={tw`w-full sm:w-auto`}/>
7575
}
7676
</div>

resources/scripts/components/server/backups/BackupContextMenu.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ export default ({ backup }: Props) => {
5858
.then(() => mutate(data => ({
5959
...data,
6060
items: data.items.filter(b => b.uuid !== backup.uuid),
61+
backupCount: data.backupCount - 1,
6162
}), false))
6263
.catch(error => {
6364
console.error(error);

resources/scripts/components/server/backups/CreateBackupButton.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ export default () => {
8181
clearFlashes('backups:create');
8282
createServerBackup(uuid, values)
8383
.then(backup => {
84-
mutate(data => ({ ...data, items: data.items.concat(backup) }), false);
84+
mutate(data => ({ ...data, items: data.items.concat(backup), backupCount: data.backupCount + 1 }), false);
8585
setVisible(false);
8686
})
8787
.catch(error => {

0 commit comments

Comments
 (0)