Completed
Push — master ( 187043...48cde4 )
by
unknown
01:30
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
        if ($this->ensureAllSortsExist()) {
32
            $this->addRequestedSortsToQuery(); // allowed is known & request is known, add what we can, if there is no request, -wait
33
        }
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(): bool
101
    {
102
        $requestedSortNames = $this->request->sorts()->map(function (string $sort) {
103
            return ltrim($sort, '-');
104
        });
105
106
        $allowedSortNames = $this->allowedSorts->map(function (AllowedSort $sort) {
107
            return $sort->getName();
108
        });
109
110
        $unknownSorts = $requestedSortNames->diff($allowedSortNames);
111
112
        if ($unknownSorts->isNotEmpty()) {
113
            if ($this->throwInvalidQueryExceptions) {
114
                throw InvalidSortQuery::sortsNotAllowed($unknownSorts, $allowedSortNames);
115
            } else {
116
                return false;
117
            }
118
        }
119
120
        return true;
121
    }
122
}
123