|
2 | 2 |
|
3 | 3 | namespace Pterodactyl\Http\Controllers\Api\Client; |
4 | 4 |
|
5 | | -use Pterodactyl\Models\User; |
6 | 5 | use Pterodactyl\Models\Server; |
7 | 6 | use Pterodactyl\Models\Permission; |
8 | 7 | use Spatie\QueryBuilder\QueryBuilder; |
@@ -39,31 +38,27 @@ public function __construct(ServerRepository $repository) |
39 | 38 | public function index(GetServersRequest $request): array |
40 | 39 | { |
41 | 40 | $user = $request->user(); |
42 | | - $level = $request->getFilterLevel(); |
43 | 41 | $transformer = $this->getTransformer(ServerTransformer::class); |
44 | 42 |
|
45 | 43 | // Start the query builder and ensure we eager load any requested relationships from the request. |
46 | | - $builder = Server::query()->with($this->getIncludesForTransformer($transformer, ['node'])); |
| 44 | + $builder = QueryBuilder::for( |
| 45 | + Server::query()->with($this->getIncludesForTransformer($transformer, ['node'])) |
| 46 | + )->allowedFilters('uuid', 'name', 'external_id'); |
47 | 47 |
|
48 | | - if ($level === User::FILTER_LEVEL_OWNER) { |
49 | | - $builder = $builder->where('owner_id', $request->user()->id); |
50 | | - } |
51 | | - // If set to all, display all servers they can access, including those they access as an |
52 | | - // admin. If set to subuser, only return the servers they can access because they are owner, |
53 | | - // or marked as a subuser of the server. |
54 | | - elseif (($level === User::FILTER_LEVEL_ALL && ! $user->root_admin) || $level === User::FILTER_LEVEL_SUBUSER) { |
| 48 | + // Either return all of the servers the user has access to because they are an admin `?type=admin` or |
| 49 | + // just return all of the servers the user has access to because they are the owner or a subuser of the |
| 50 | + // server. |
| 51 | + if ($request->input('type') === 'admin') { |
| 52 | + $builder = $user->root_admin |
| 53 | + ? $builder->whereNotIn('id', $user->accessibleServers()->pluck('id')->all()) |
| 54 | + // If they aren't an admin but want all the admin servers don't fail the request, just |
| 55 | + // make it a query that will never return any results back. |
| 56 | + : $builder->whereRaw('1 = 2'); |
| 57 | + } elseif ($request->input('type') === 'owner') { |
| 58 | + $builder = $builder->where('owner_id', $user->id); |
| 59 | + } else { |
55 | 60 | $builder = $builder->whereIn('id', $user->accessibleServers()->pluck('id')->all()); |
56 | 61 | } |
57 | | - // If set to admin, only display the servers a user can access because they are an administrator. |
58 | | - // This means only servers the user would not have access to if they were not an admin (because they |
59 | | - // are not an owner or subuser) are returned. |
60 | | - elseif ($level === User::FILTER_LEVEL_ADMIN && $user->root_admin) { |
61 | | - $builder = $builder->whereNotIn('id', $user->accessibleServers()->pluck('id')->all()); |
62 | | - } |
63 | | - |
64 | | - $builder = QueryBuilder::for($builder)->allowedFilters( |
65 | | - 'uuid', 'name', 'external_id' |
66 | | - ); |
67 | 62 |
|
68 | 63 | $servers = $builder->paginate(min($request->query('per_page', 50), 100))->appends($request->query()); |
69 | 64 |
|
|
0 commit comments