-
-
Notifications
You must be signed in to change notification settings - Fork 632
Expand file tree
/
Copy pathSpecificEntriesQuery.php
More file actions
117 lines (92 loc) · 3.22 KB
/
Copy pathSpecificEntriesQuery.php
File metadata and controls
117 lines (92 loc) · 3.22 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
<?php
namespace Statamic\GraphQL\Queries;
use Facades\Statamic\API\FilterAuthorizer;
use Facades\Statamic\API\QueryScopeAuthorizer;
use GraphQL\Type\Definition\Type;
use Statamic\Facades\Collection;
use Statamic\Facades\Entry;
use Statamic\Facades\GraphQL;
use Statamic\GraphQL\Middleware\AuthorizeFilters;
use Statamic\GraphQL\Middleware\AuthorizeQueryScopes;
use Statamic\GraphQL\Middleware\ResolvePage;
use Statamic\GraphQL\Queries\Concerns\FiltersQuery;
use Statamic\GraphQL\Queries\Concerns\ScopesQuery;
use Statamic\GraphQL\Types\DynamicEntryUnionType;
use Statamic\GraphQL\Types\JsonArgument;
use Statamic\Query\OrderBy;
use Statamic\Support\Str;
class SpecificEntriesQuery extends Query
{
use FiltersQuery {
filterQuery as traitFilterQuery;
}
use ScopesQuery;
protected $middleware = [
ResolvePage::class,
AuthorizeFilters::class,
AuthorizeQueryScopes::class,
];
public function __construct(protected string $collectionHandle)
{
$this->attributes['name'] = Str::camel($collectionHandle);
parent::__construct();
}
public function type(): Type
{
$collection = Collection::findByHandle($this->collectionHandle);
return GraphQL::nonNull(GraphQL::paginate(DynamicEntryUnionType::createTypeFor($collection)));
}
public function args(): array
{
return [
'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', DynamicEntryUnionType::collectionsFor(Collection::findByHandle($this->collectionHandle))->pluck('handle')->toArray());
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 allowedFilters($args)
{
return FilterAuthorizer::allowedForSubResources('graphql', 'collections', $this->collectionHandle);
}
public function allowedScopes($args)
{
return QueryScopeAuthorizer::allowedForSubResources('graphql', 'collections', $this->collectionHandle);
}
}