Skip to content

Commit d9593b2

Browse files
committed
Paginate server results when viewing a node, closes pterodactyl#1404
1 parent 50eb2a1 commit d9593b2

File tree

7 files changed

+54
-44
lines changed

7 files changed

+54
-44
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ a server through the API.
1616
* The `PATCH` endpoint for `/api/applications/servers/{server}/build` now accepts an array called `limits` to match
1717
the response from the server `GET` endpoint.
1818

19+
### Added
20+
* The server listing for a node is now paginated to 25 servers per page to improve performance on large nodes.
21+
1922
## v0.7.12 (Derelict Dermodactylus)
2023
### Fixed
2124
* Fixes an issue with the locations API endpoint referencing an invalid namespace.

app/Contracts/Repository/NodeRepositoryInterface.php

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,16 +55,6 @@ public function loadLocationAndServerCount(Node $node, bool $refresh = false): N
5555
*/
5656
public function loadNodeAllocations(Node $node, bool $refresh = false): Node;
5757

58-
/**
59-
* Return a node with all of the servers attached to that node.
60-
*
61-
* @param int $id
62-
* @return \Pterodactyl\Models\Node
63-
*
64-
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
65-
*/
66-
public function getNodeServers(int $id): Node;
67-
6858
/**
6959
* Return a collection of nodes for all locations to use in server creation UI.
7060
*

app/Contracts/Repository/ServerRepositoryInterface.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,4 +152,14 @@ public function isUniqueUuidCombo(string $uuid, string $short): bool;
152152
* @return int
153153
*/
154154
public function getSuspendedServersCount(): int;
155+
156+
/**
157+
* Returns all of the servers that exist for a given node in a paginated response.
158+
*
159+
* @param int $node
160+
* @param int $limit
161+
*
162+
* @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
163+
*/
164+
public function loadAllServersForNode(int $node, int $limit): LengthAwarePaginator;
155165
}

app/Http/Controllers/Admin/NodesController.php

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
use Pterodactyl\Services\Helpers\SoftwareVersionService;
2525
use Pterodactyl\Http\Requests\Admin\Node\NodeFormRequest;
2626
use Pterodactyl\Contracts\Repository\NodeRepositoryInterface;
27+
use Pterodactyl\Contracts\Repository\ServerRepositoryInterface;
2728
use Pterodactyl\Http\Requests\Admin\Node\AllocationFormRequest;
2829
use Pterodactyl\Services\Allocations\AllocationDeletionService;
2930
use Pterodactyl\Contracts\Repository\LocationRepositoryInterface;
@@ -32,6 +33,11 @@
3233

3334
class NodesController extends Controller
3435
{
36+
/**
37+
* @var \Pterodactyl\Services\Allocations\AllocationDeletionService
38+
*/
39+
protected $allocationDeletionService;
40+
3541
/**
3642
* @var \Prologue\Alerts\AlertsMessageBag
3743
*/
@@ -72,6 +78,11 @@ class NodesController extends Controller
7278
*/
7379
protected $repository;
7480

81+
/**
82+
* @var \Pterodactyl\Contracts\Repository\ServerRepositoryInterface
83+
*/
84+
protected $serverRepository;
85+
7586
/**
7687
* @var \Pterodactyl\Services\Nodes\NodeUpdateService
7788
*/
@@ -81,10 +92,6 @@ class NodesController extends Controller
8192
* @var \Pterodactyl\Services\Helpers\SoftwareVersionService
8293
*/
8394
protected $versionService;
84-
/**
85-
* @var \Pterodactyl\Services\Allocations\AllocationDeletionService
86-
*/
87-
private $allocationDeletionService;
8895

8996
/**
9097
* NodesController constructor.
@@ -98,6 +105,7 @@ class NodesController extends Controller
98105
* @param \Pterodactyl\Services\Nodes\NodeDeletionService $deletionService
99106
* @param \Pterodactyl\Contracts\Repository\LocationRepositoryInterface $locationRepository
100107
* @param \Pterodactyl\Contracts\Repository\NodeRepositoryInterface $repository
108+
* @param \Pterodactyl\Contracts\Repository\ServerRepositoryInterface $serverRepository
101109
* @param \Pterodactyl\Services\Nodes\NodeUpdateService $updateService
102110
* @param \Pterodactyl\Services\Helpers\SoftwareVersionService $versionService
103111
*/
@@ -111,6 +119,7 @@ public function __construct(
111119
NodeDeletionService $deletionService,
112120
LocationRepositoryInterface $locationRepository,
113121
NodeRepositoryInterface $repository,
122+
ServerRepositoryInterface $serverRepository,
114123
NodeUpdateService $updateService,
115124
SoftwareVersionService $versionService
116125
) {
@@ -123,6 +132,7 @@ public function __construct(
123132
$this->deletionService = $deletionService;
124133
$this->locationRepository = $locationRepository;
125134
$this->repository = $repository;
135+
$this->serverRepository = $serverRepository;
126136
$this->updateService = $updateService;
127137
$this->versionService = $versionService;
128138
}
@@ -178,8 +188,6 @@ public function store(NodeFormRequest $request)
178188
*
179189
* @param \Pterodactyl\Models\Node $node
180190
* @return \Illuminate\View\View
181-
*
182-
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
183191
*/
184192
public function viewIndex(Node $node)
185193
{
@@ -235,19 +243,17 @@ public function viewAllocation(Node $node)
235243
/**
236244
* Shows the server listing page for a specific node.
237245
*
238-
* @param int $node
246+
* @param \Pterodactyl\Models\Node $node
239247
* @return \Illuminate\View\View
240-
*
241-
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
242248
*/
243-
public function viewServers($node)
249+
public function viewServers(Node $node)
244250
{
245-
$node = $this->repository->getNodeServers($node);
251+
$servers = $this->serverRepository->loadAllServersForNode($node->id, 25);
246252
Javascript::put([
247253
'node' => collect($node->makeVisible('daemonSecret'))->only(['scheme', 'fqdn', 'daemonListen', 'daemonSecret']),
248254
]);
249255

250-
return view('admin.nodes.view.servers', ['node' => $node]);
256+
return view('admin.nodes.view.servers', ['node' => $node, 'servers' => $servers]);
251257
}
252258

253259
/**

app/Repositories/Eloquent/NodeRepository.php

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,8 @@
66
use Pterodactyl\Models\Node;
77
use Illuminate\Support\Collection;
88
use Pterodactyl\Repositories\Concerns\Searchable;
9-
use Illuminate\Database\Eloquent\ModelNotFoundException;
109
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
1110
use Pterodactyl\Contracts\Repository\NodeRepositoryInterface;
12-
use Pterodactyl\Exceptions\Repository\RecordNotFoundException;
1311

1412
class NodeRepository extends EloquentRepository implements NodeRepositoryInterface
1513
{
@@ -140,25 +138,6 @@ public function loadNodeAllocations(Node $node, bool $refresh = false): Node
140138
return $node;
141139
}
142140

143-
/**
144-
* Return a node with all of the servers attached to that node.
145-
*
146-
* @param int $id
147-
* @return \Pterodactyl\Models\Node
148-
*
149-
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
150-
*/
151-
public function getNodeServers(int $id): Node
152-
{
153-
try {
154-
return $this->getBuilder()->with([
155-
'servers.user', 'servers.nest', 'servers.egg',
156-
])->findOrFail($id, $this->getColumns());
157-
} catch (ModelNotFoundException $exception) {
158-
throw new RecordNotFoundException;
159-
}
160-
}
161-
162141
/**
163142
* Return a collection of nodes for all locations to use in server creation UI.
164143
*

app/Repositories/Eloquent/ServerRepository.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Pterodactyl\Repositories\Eloquent;
44

5+
use Pterodactyl\Models\Node;
56
use Pterodactyl\Models\User;
67
use Webmozart\Assert\Assert;
78
use Pterodactyl\Models\Server;
@@ -338,4 +339,20 @@ public function getSuspendedServersCount(): int
338339
{
339340
return $this->getBuilder()->where('suspended', true)->count();
340341
}
342+
343+
/**
344+
* Returns all of the servers that exist for a given node in a paginated response.
345+
*
346+
* @param int $node
347+
* @param int $limit
348+
*
349+
* @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
350+
*/
351+
public function loadAllServersForNode(int $node, int $limit): LengthAwarePaginator
352+
{
353+
return $this->getBuilder()
354+
->with(['user', 'nest', 'egg'])
355+
->where('node_id', '=', $node)
356+
->paginate($limit);
357+
}
341358
}

resources/themes/pterodactyl/admin/nodes/view/servers.blade.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
<th class="text-center">CPU</th>
5252
<th class="text-center">Status</th>
5353
</tr>
54-
@foreach($node->servers as $server)
54+
@foreach($servers as $server)
5555
<tr data-server="{{ $server->uuid }}">
5656
<td><code>{{ $server->uuidShort }}</code></td>
5757
<td><a href="{{ route('admin.servers.view', $server->id) }}">{{ $server->name }}</a></td>
@@ -64,6 +64,11 @@
6464
</tr>
6565
@endforeach
6666
</table>
67+
@if($servers->hasPages())
68+
<div class="box-footer with-border">
69+
<div class="col-md-12 text-center">{!! $servers->render() !!}</div>
70+
</div>
71+
@endif
6772
</div>
6873
</div>
6974
</div>

0 commit comments

Comments
 (0)