Skip to content

Commit 092c942

Browse files
committed
Fix server owner filtering; improve searching for servers; closes pterodactyl#2581
1 parent 39dddba commit 092c942

File tree

4 files changed

+48
-4
lines changed

4 files changed

+48
-4
lines changed

app/Http/Controllers/Admin/Servers/ServerController.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
use Pterodactyl\Models\Server;
77
use Spatie\QueryBuilder\QueryBuilder;
88
use Illuminate\Contracts\View\Factory;
9+
use Spatie\QueryBuilder\AllowedFilter;
910
use Pterodactyl\Http\Controllers\Controller;
11+
use Pterodactyl\Models\Filters\AdminServerFilter;
1012
use Pterodactyl\Repositories\Eloquent\ServerRepository;
1113

1214
class ServerController extends Controller
@@ -45,8 +47,10 @@ public function __construct(
4547
public function index(Request $request)
4648
{
4749
$servers = QueryBuilder::for(Server::query()->with('node', 'user', 'allocation'))
48-
->allowedFilters(['uuid', 'name', 'image'])
49-
->allowedSorts(['id', 'uuid'])
50+
->allowedFilters([
51+
AllowedFilter::exact('owner_id'),
52+
AllowedFilter::custom('*', new AdminServerFilter),
53+
])
5054
->paginate(config()->get('pterodactyl.paginate.admin.servers'));
5155

5256
return $this->view->make('admin.servers.index', ['servers' => $servers]);
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
3+
namespace Pterodactyl\Models\Filters;
4+
5+
use BadMethodCallException;
6+
use Spatie\QueryBuilder\Filters\Filter;
7+
use Illuminate\Database\Eloquent\Builder;
8+
9+
class AdminServerFilter implements Filter
10+
{
11+
/**
12+
* A multi-column filter for the servers table that allows an administrative user to search
13+
* across UUID, name, owner username, and owner email.
14+
*
15+
* @param \Illuminate\Database\Eloquent\Builder $query
16+
* @param string $value
17+
* @param string $property
18+
*/
19+
public function __invoke(Builder $query, $value, string $property)
20+
{
21+
if ($query->getQuery()->from !== 'servers') {
22+
throw new BadMethodCallException(
23+
'Cannot use the AdminServerFilter against a non-server model.'
24+
);
25+
}
26+
$query
27+
->select('servers.*')
28+
->leftJoin('users', 'users.id', '=', 'servers.owner_id')
29+
->where(function (Builder $builder) use ($value) {
30+
$builder->where('servers.uuid', $value)
31+
->orWhere('servers.uuid', 'LIKE', "$value%")
32+
->orWhere('servers.uuidShort', $value)
33+
->orWhere('servers.external_id', $value)
34+
->orWhereRaw('LOWER(users.username) LIKE ?', ["%$value%"])
35+
->orWhereRaw('LOWER(users.email) LIKE ?', ["$value%"])
36+
->orWhereRaw('LOWER(servers.name) LIKE ?', ["%$value%"]);
37+
})
38+
->groupBy('servers.id');
39+
}
40+
}

resources/views/admin/servers/index.blade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
<div class="box-tools search01">
2727
<form action="{{ route('admin.servers') }}" method="GET">
2828
<div class="input-group input-group-sm">
29-
<input type="text" name="filter[name]" class="form-control pull-right" value="{{ request()->input('filter.name') }}" placeholder="Search Servers">
29+
<input type="text" name="filter[*]" class="form-control pull-right" value="{{ request()->input('filter[*]') }}" placeholder="Search Servers">
3030
<div class="input-group-btn">
3131
<button type="submit" class="btn btn-default"><i class="fa fa-search"></i></button>
3232
<a href="{{ route('admin.servers.new') }}"><button type="button" class="btn btn-sm btn-primary" style="border-radius: 0 3px 3px 0;margin-left:-1px;">Create New</button></a>

resources/views/admin/users/index.blade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@
6464
@endif
6565
</td>
6666
<td class="text-center">
67-
<a href="{{ route('admin.servers', ['query' => $user->email]) }}">{{ $user->servers_count }}</a>
67+
<a href="{{ route('admin.servers', ['filter[owner_id]' => $user->id]) }}">{{ $user->servers_count }}</a>
6868
</td>
6969
<td class="text-center">{{ $user->subuser_of_count }}</td>
7070
<td class="text-center"><img src="https://www.gravatar.com/avatar/{{ md5(strtolower($user->email)) }}?s=100" style="height:20px;" class="img-circle" /></td>

0 commit comments

Comments
 (0)