-
-
Notifications
You must be signed in to change notification settings - Fork 622
Expand file tree
/
Copy pathAssetsQuery.php
More file actions
93 lines (76 loc) · 2.34 KB
/
AssetsQuery.php
File metadata and controls
93 lines (76 loc) · 2.34 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
<?php
namespace Statamic\GraphQL\Queries;
use Facades\Statamic\API\FilterAuthorizer;
use Facades\Statamic\API\ResourceAuthorizer;
use GraphQL\Type\Definition\Type;
use Statamic\Facades\Asset;
use Statamic\Facades\GraphQL;
use Statamic\GraphQL\Middleware\AuthorizeFilters;
use Statamic\GraphQL\Middleware\AuthorizeSubResources;
use Statamic\GraphQL\Middleware\ResolvePage;
use Statamic\GraphQL\Queries\Concerns\FiltersQuery;
use Statamic\GraphQL\Types\AssetInterface;
use Statamic\GraphQL\Types\JsonArgument;
use Statamic\Query\OrderBy;
use Statamic\Support\Str;
class AssetsQuery extends Query
{
use FiltersQuery;
protected $attributes = [
'name' => 'assets',
];
protected $middleware = [
AuthorizeSubResources::class,
ResolvePage::class,
AuthorizeFilters::class,
];
public function type(): Type
{
return GraphQL::paginate(GraphQL::type(AssetInterface::NAME));
}
public function args(): array
{
return [
'container' => GraphQL::nonNull(GraphQL::string()),
'limit' => GraphQL::int(),
'page' => GraphQL::int(),
'filter' => GraphQL::type(JsonArgument::NAME),
'sort' => GraphQL::listOf(GraphQL::string()),
];
}
public function resolve($root, $args)
{
$query = Asset::query()->where('container', $args['container']);
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 subResourceArg()
{
return 'container';
}
public function allowedSubResources()
{
return ResourceAuthorizer::allowedSubResources('graphql', 'assets');
}
public function allowedFilters($args)
{
return FilterAuthorizer::allowedForSubResources('graphql', 'assets', $args['container']);
}
}