Completed
Push — master ( 187043...48cde4 )
by
unknown
01:30
created

src/Concerns/SortsQuery.php (1 issue)

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