Completed
Push — master ( fc49af...187043 )
by
unknown
02:23
created

src/Concerns/SortsQuery.php (1 issue)

parameters are used.

Unused Code Minor

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
namespace Spatie\QueryBuilder\Concerns;
4
5
use Spatie\QueryBuilder\AllowedSort;
6
use Spatie\QueryBuilder\Exceptions\InvalidSortQuery;
7
8
trait SortsQuery
9
{
10
    /** @var \Illuminate\Support\Collection */
11
    protected $allowedSorts;
12
13
    public function allowedSorts($sorts): self
14
    {
15
        if ($this->request->sorts()->isEmpty()) {
16
            // We haven't got any requested sorts. No need to parse allowed sorts.
17
18
            return $this;
19
        }
20
21
        $sorts = is_array($sorts) ? $sorts : func_get_args();
22
23
        $this->allowedSorts = collect($sorts)->map(function ($sort) {
24
            if ($sort instanceof AllowedSort) {
25
                return $sort;
26
            }
27
28
            return AllowedSort::field(ltrim($sort, '-'));
29
        });
30
31
        $this->ensureAllSortsExist();
32
33
        $this->addRequestedSortsToQuery(); // allowed is known & request is known, add what we can, if there is no request, -wait
34
35
        return $this;
36
    }
37
38
    /**
39
     * @param array|string|\Spatie\QueryBuilder\AllowedSort $sorts
40
     *
41
     * @return \Spatie\QueryBuilder\QueryBuilder
42
     */
43
    public function defaultSort($sorts): self
0 ignored issues
show
The parameter $sorts is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
44
    {
45
        return $this->defaultSorts(func_get_args());
46
    }
47
48
    /**
49
     * @param array|string|\Spatie\QueryBuilder\AllowedSort $sorts
50
     *
51
     * @return \Spatie\QueryBuilder\QueryBuilder
52
     */
53
    public function defaultSorts($sorts): self
54
    {
55
        if ($this->request->sorts()->isNotEmpty()) {
56
            // We've got requested sorts. No need to parse defaults.
57
58
            return $this;
59
        }
60
61
        $sorts = is_array($sorts) ? $sorts : func_get_args();
62
63
        collect($sorts)
64
            ->map(function ($sort) {
65
                if ($sort instanceof AllowedSort) {
66
                    return $sort;
67
                }
68
69
                return AllowedSort::field($sort);
70
            })
71
            ->each(function (AllowedSort $sort) {
72
                $sort->sort($this);
73
            });
74
75
        return $this;
76
    }
77
78
    protected function addRequestedSortsToQuery()
79
    {
80
        $this->request->sorts()
81
            ->each(function (string $property) {
82
                $descending = $property[0] === '-';
83
84
                $key = ltrim($property, '-');
85
86
                $sort = $this->findSort($key);
87
88
                $sort->sort($this, $descending);
89
            });
90
    }
91
92
    protected function findSort(string $property): ?AllowedSort
93
    {
94
        return $this->allowedSorts
95
            ->first(function (AllowedSort $sort) use ($property) {
96
                return $sort->isSort($property);
97
            });
98
    }
99
100
    protected function ensureAllSortsExist(): void
101
    {
102
        if (! $this->throwInvalidQueryExceptions) {
103
            return;
104
        }
105
106
        $requestedSortNames = $this->request->sorts()->map(function (string $sort) {
107
            return ltrim($sort, '-');
108
        });
109
110
        $allowedSortNames = $this->allowedSorts->map(function (AllowedSort $sort) {
111
            return $sort->getName();
112
        });
113
114
        $unknownSorts = $requestedSortNames->diff($allowedSortNames);
115
116
        if ($unknownSorts->isNotEmpty()) {
117
            throw InvalidSortQuery::sortsNotAllowed($unknownSorts, $allowedSortNames);
118
        }
119
    }
120
}
121