-
-
Notifications
You must be signed in to change notification settings - Fork 622
Expand file tree
/
Copy pathUsersQuery.php
More file actions
81 lines (66 loc) · 1.97 KB
/
UsersQuery.php
File metadata and controls
81 lines (66 loc) · 1.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
<?php
namespace Statamic\GraphQL\Queries;
use Facades\Statamic\API\FilterAuthorizer;
use GraphQL\Type\Definition\Type;
use Statamic\Facades\GraphQL;
use Statamic\Facades\User;
use Statamic\GraphQL\Middleware\AuthorizeFilters;
use Statamic\GraphQL\Middleware\ResolvePage;
use Statamic\GraphQL\Queries\Concerns\FiltersQuery;
use Statamic\GraphQL\Types\JsonArgument;
use Statamic\GraphQL\Types\UserType;
use Statamic\Query\OrderBy;
use Statamic\Support\Str;
class UsersQuery extends Query
{
use FiltersQuery;
protected $attributes = [
'name' => 'users',
];
protected $middleware = [
ResolvePage::class,
AuthorizeFilters::class,
];
public function type(): Type
{
return GraphQL::paginate(GraphQL::type(UserType::NAME));
}
public function args(): array
{
return [
'limit' => GraphQL::int(),
'page' => GraphQL::int(),
'filter' => GraphQL::type(JsonArgument::NAME),
'sort' => GraphQL::listOf(GraphQL::string()),
];
}
public function resolve($root, $args)
{
$query = User::query();
if ($filters = $args['filter'] ?? null) {
$this->filterQuery($query, $filters);
}
if ($sort = $args['sort'] ?? null) {
$this->sortQuery($query, $sort);
}
return $query->paginate($args['limit'] ?? 1000);
}
private function sortQuery($query, $sorts)
{
foreach ($sorts as $sort) {
$order = 'asc';
if (Str::contains($sort, ' ')) {
[$sort, $order] = explode(' ', $sort);
}
if ($sort = OrderBy::column($sort)) {
$query->orderBy($sort, $order);
}
}
}
public function allowedFilters($args)
{
return collect(FilterAuthorizer::allowedForResource('graphql', 'users'))
->reject(fn ($field) => in_array($field, ['password', 'password_hash']))
->all();
}
}