|
3 | 3 | namespace Pterodactyl\Http\Controllers\Api\Client; |
4 | 4 |
|
5 | 5 | use Pterodactyl\Models\User; |
| 6 | +use Pterodactyl\Models\Server; |
6 | 7 | use Pterodactyl\Models\Permission; |
| 8 | +use Spatie\QueryBuilder\QueryBuilder; |
7 | 9 | use Pterodactyl\Repositories\Eloquent\ServerRepository; |
8 | 10 | use Pterodactyl\Transformers\Api\Client\ServerTransformer; |
9 | 11 | use Pterodactyl\Http\Requests\Api\Client\GetServersRequest; |
@@ -36,32 +38,36 @@ public function __construct(ServerRepository $repository) |
36 | 38 | */ |
37 | 39 | public function index(GetServersRequest $request): array |
38 | 40 | { |
39 | | - // Check for the filter parameter on the request. |
40 | | - switch ($request->input('filter')) { |
41 | | - case 'all': |
42 | | - $filter = User::FILTER_LEVEL_ALL; |
43 | | - break; |
44 | | - case 'admin': |
45 | | - $filter = User::FILTER_LEVEL_ADMIN; |
46 | | - break; |
47 | | - case 'owner': |
48 | | - $filter = User::FILTER_LEVEL_OWNER; |
49 | | - break; |
50 | | - case 'subuser-of': |
51 | | - default: |
52 | | - $filter = User::FILTER_LEVEL_SUBUSER; |
53 | | - break; |
| 41 | + $user = $request->user(); |
| 42 | + $level = $request->getFilterLevel(); |
| 43 | + $transformer = $this->getTransformer(ServerTransformer::class); |
| 44 | + |
| 45 | + // Start the query builder and ensure we eager load any requested relationships from the request. |
| 46 | + $builder = Server::query()->with($this->getIncludesForTransformer($transformer, ['node'])); |
| 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) { |
| 55 | + $builder = $builder->whereIn('id', $user->accessibleServers()->pluck('id')->all()); |
54 | 56 | } |
| 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 | + ); |
55 | 67 |
|
56 | | - $servers = $this->repository |
57 | | - ->setSearchTerm($request->input('query')) |
58 | | - ->filterUserAccessServers( |
59 | | - $request->user(), $filter, config('pterodactyl.paginate.frontend.servers') |
60 | | - ); |
| 68 | + $servers = $builder->paginate(min($request->query('per_page', 50), 100))->appends($request->query()); |
61 | 69 |
|
62 | | - return $this->fractal->collection($servers) |
63 | | - ->transformWith($this->getTransformer(ServerTransformer::class)) |
64 | | - ->toArray(); |
| 70 | + return $this->fractal->transformWith($transformer)->collection($servers)->toArray(); |
65 | 71 | } |
66 | 72 |
|
67 | 73 | /** |
|
0 commit comments