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

SortsQuery::addRequestedSortsToQuery()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 13
rs 9.8333
c 0
b 0
f 0
cc 1
nc 1
nop 0
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()) {
0 ignored issues
show
Bug introduced by
The property request does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
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
Unused Code introduced by
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) {
0 ignored issues
show
Bug introduced by
The property throwInvalidQueryExceptions does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
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