-
-
Notifications
You must be signed in to change notification settings - Fork 622
Expand file tree
/
Copy pathEntriesQuery.php
More file actions
125 lines (100 loc) · 3.31 KB
/
EntriesQuery.php
File metadata and controls
125 lines (100 loc) · 3.31 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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
<?php
namespace Statamic\GraphQL\Queries;
use Facades\Statamic\API\FilterAuthorizer;
use Facades\Statamic\API\QueryScopeAuthorizer;
use Facades\Statamic\API\ResourceAuthorizer;
use GraphQL\Type\Definition\Type;
use Statamic\Facades\Entry;
use Statamic\Facades\GraphQL;
use Statamic\GraphQL\Middleware\AuthorizeFilters;
use Statamic\GraphQL\Middleware\AuthorizeQueryScopes;
use Statamic\GraphQL\Middleware\AuthorizeSubResources;
use Statamic\GraphQL\Middleware\ResolvePage;
use Statamic\GraphQL\Queries\Concerns\FiltersQuery;
use Statamic\GraphQL\Queries\Concerns\ScopesQuery;
use Statamic\GraphQL\Types\EntryInterface;
use Statamic\GraphQL\Types\JsonArgument;
use Statamic\Query\OrderBy;
use Statamic\Support\Str;
class EntriesQuery extends Query
{
use FiltersQuery {
filterQuery as traitFilterQuery;
}
use ScopesQuery;
protected $attributes = [
'name' => 'entries',
];
protected $middleware = [
AuthorizeSubResources::class,
ResolvePage::class,
AuthorizeFilters::class,
AuthorizeQueryScopes::class,
];
public function type(): Type
{
return GraphQL::paginate(GraphQL::type(EntryInterface::NAME));
}
public function args(): array
{
return [
'collection' => GraphQL::listOf(GraphQL::string()),
'limit' => GraphQL::int(),
'page' => GraphQL::int(),
'filter' => GraphQL::type(JsonArgument::NAME),
'query_scope' => GraphQL::type(JsonArgument::NAME),
'sort' => GraphQL::listOf(GraphQL::string()),
'site' => GraphQL::string(),
];
}
public function resolve($root, $args)
{
$query = Entry::query();
$query->whereIn('collection', $args['collection'] ?? $this->allowedSubResources());
if ($site = $args['site'] ?? null) {
$query->where('site', $site);
}
$this->filterQuery($query, $args['filter'] ?? []);
$this->scopeQuery($query, $args['query_scope'] ?? []);
$this->sortQuery($query, $args['sort'] ?? []);
return $query->paginate($args['limit'] ?? 1000);
}
private function filterQuery($query, $filters)
{
if (! isset($filters['status']) && ! isset($filters['published'])) {
$filters['status'] = 'published';
}
$this->traitFilterQuery($query, $filters);
}
private function sortQuery($query, $sorts)
{
if (empty($sorts)) {
$sorts = ['id'];
}
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 subResourceArg()
{
return 'collection';
}
public function allowedSubResources()
{
return ResourceAuthorizer::allowedSubResources('graphql', 'collections');
}
public function allowedFilters($args)
{
return FilterAuthorizer::allowedForSubResources('graphql', 'collections', $args['collection'] ?? '*');
}
public function allowedScopes($args)
{
return QueryScopeAuthorizer::allowedForSubResources('graphql', 'collections', $args['collection'] ?? '*');
}
}