Request   A
last analyzed

Complexity

Total Complexity 24

Size/Duplication

Total Lines 112
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 7

Importance

Changes 10
Bugs 2 Features 1
Metric Value
wmc 24
c 10
b 2
f 1
lcom 1
cbo 7
dl 0
loc 112
rs 10

7 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 2
A getQueryParam() 0 4 2
A getIncludedRelationships() 0 14 4
B getSort() 0 17 6
B getPage() 0 14 6
A getFilters() 0 6 1
A getFields() 0 17 3
1
<?php
2
3
/**
4
 * Author: Nil Portugués Calderó <[email protected]>
5
 * Date: 7/26/15
6
 * Time: 1:41 AM.
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
namespace NilPortugues\Api\JsonApi\Http\Request;
12
13
use NilPortugues\Api\JsonApi\Http\Request\Parameters\Fields;
14
use NilPortugues\Api\JsonApi\Http\Request\Parameters\Included;
15
use NilPortugues\Api\JsonApi\Http\Request\Parameters\Page;
16
use NilPortugues\Api\JsonApi\Http\Request\Parameters\Sorting;
17
use Psr\Http\Message\ServerRequestInterface;
18
use Symfony\Bridge\PsrHttpMessage\Factory\DiactorosFactory;
19
use Symfony\Component\HttpFoundation\Request as SymfonyRequest;
20
21
/**
22
 * Class AbstractRequest.
23
 */
24
class Request extends \Zend\Diactoros\Request
25
{
26
    /** @var ServerRequestInterface|\Zend\Diactoros\ServerRequest */
27
    protected $request;
28
29
    /**
30
     * @param ServerRequestInterface $request
31
     */
32
    public function __construct(ServerRequestInterface $request = null)
33
    {
34
        $this->request = ($request) ? $request : (new DiactorosFactory())->createRequest(SymfonyRequest::createFromGlobals());
35
    }
36
37
    /**
38
     * @param string $name
39
     * @param mixed  $default
40
     *
41
     * @return array|string
42
     */
43
    protected function getQueryParam($name, $default = null)
44
    {
45
        return isset($this->request->getQueryParams()[$name]) ? $this->request->getQueryParams()[$name] : $default;
46
    }
47
48
    /**
49
     * @return Included
50
     */
51
    public function getIncludedRelationships()
52
    {
53
        $include = $this->getQueryParam('include', []);
54
        $included = new Included();
55
56
        if (is_string($include) && strlen($include)) {
57
            $includeNames = \explode(',', $include);
58
            foreach ($includeNames as $relationship) {
59
                $included->add($relationship);
60
            }
61
        }
62
63
        return $included;
64
    }
65
66
    /**
67
     * @return \NilPortugues\Api\JsonApi\Http\Request\Parameters\Sorting
68
     */
69
    public function getSort()
70
    {
71
        $sort = $this->getQueryParam('sort');
72
        $sorting = new Sorting();
73
74
        if (!empty($sort) && is_string($sort)) {
75
            $members = \explode(',', $sort);
76
            if (!empty($members)) {
77
                foreach ($members as $field) {
78
                    $key = ltrim($field, '-');
79
                    $sorting->addField($key, ('-' === $field[0]) ? 'descending' : 'ascending');
80
                }
81
            }
82
        }
83
84
        return $sorting;
85
    }
86
87
    /**
88
     * @return \NilPortugues\Api\JsonApi\Http\Request\Parameters\Page
89
     */
90
    public function getPage()
91
    {
92
        $queryParam = $this->getQueryParam('page');
93
94
        $page = new Page(
95
            (!empty($queryParam['number'])) ? $queryParam['number'] : 1,
96
            (!empty($queryParam['cursor'])) ? $queryParam['cursor'] : null,
97
            (!empty($queryParam['limit'])) ? $queryParam['limit'] : null,
98
            (!empty($queryParam['offset'])) ? $queryParam['offset'] : null,
99
            (!empty($queryParam['size'])) ? $queryParam['size'] : null
100
        );
101
102
        return $page;
103
    }
104
105
    /**
106
     * @return array
107
     */
108
    public function getFilters()
109
    {
110
        $filters = (array) $this->getQueryParam('filter', null);
111
112
        return $filters;
113
    }
114
115
    /**
116
     * @return \NilPortugues\Api\JsonApi\Http\Request\Parameters\Fields
117
     */
118
    public function getFields()
119
    {
120
        $fields = (array) $this->getQueryParam('fields', null);
121
        $fields = array_filter($fields);
122
123
        $object = new Fields();
124
        foreach ($fields as $type => &$members) {
125
            $members = \explode(',', $members);
126
            $members = \array_map('trim', $members);
127
128
            foreach ($members as $member) {
129
                $object->addField($type, $member);
130
            }
131
        }
132
133
        return $object;
134
    }
135
}
136