Completed
Push — master ( be4fa9...41b3a4 )
by John
01:58
created

GenericRequestFactory   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 75
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 6

Test Coverage

Coverage 95.83%

Importance

Changes 0
Metric Value
wmc 7
lcom 1
cbo 6
dl 0
loc 75
ccs 23
cts 24
cp 0.9583
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
B create() 0 30 4
A getURLParser() 0 4 1
A getHeaderParser() 0 4 1
1
<?php
2
namespace LunixREST\APIRequest\RequestFactory;
3
4
use LunixREST\APIRequest\HeaderParser\HeaderParser;
5
use LunixREST\APIRequest\APIRequest;
6
use LunixREST\APIRequest\URLParser\Exceptions\InvalidRequestURLException;
7
use LunixREST\APIRequest\URLParser\URLParser;
8
use Psr\Http\Message\ServerRequestInterface;
9
10
/**
11
 * A generic Request Factory that derives it's behavior from a URLParser, a BodyParserFactory, and a HeaderParser.
12
 * Class GenericRequestFactory
13
 * @package LunixREST\Request\RequestFactory
14
 */
15
class GenericRequestFactory implements RequestFactory {
16
17
    /**
18
     * @var URLParser
19
     */
20
    protected $URLParser;
21
    /**
22
     * @var HeaderParser
23
     */
24
    private $headerParser;
25
26
    /**
27
     * BasicRequestFactory constructor.
28
     * @param URLParser $URLParser
29
     * @param HeaderParser $headerParser
30
     */
31 4
    public function __construct(URLParser $URLParser, HeaderParser $headerParser)
32
    {
33 4
        $this->URLParser = $URLParser;
34 4
        $this->headerParser = $headerParser;
35 4
    }
36
37
    /**
38
     * Creates a request from raw $data and a $url
39
     * @param ServerRequestInterface $serverRequest
40
     * @return APIRequest
41
     * @throws InvalidRequestURLException
42
     */
43 2
    public function create(ServerRequestInterface $serverRequest): APIRequest
44
    {
45 2
        $parsedURL = $this->URLParser->parse($serverRequest->getUri());
46
47
        //TODO: Evaluate if this is still needed, as serverRequest allows getting of specific headers
48 2
        $parsedHeaders = $this->headerParser->parse($serverRequest->getHeaders());
49
50 2
        $urlQueryData = [];
51 2
        if($urlQueryString = $parsedURL->getQueryString()) {
52 2
            parse_str($urlQueryString, $urlQueryData);
53
54
            //In case it's unable to be parsed, default to no params
55 2
            if($urlQueryData === null) {
56
                $urlQueryData = [];
57
            }
58
        }
59
60 2
        $apiKey = $parsedURL->getAPIKey();
61 2
        if($apiKey === null) {
62 1
            $apiKey = $parsedHeaders->getAPIKey();
63
        }
64
65 2
        $acceptableMIMETypes = array_unique(array_merge(
66 2
            $parsedURL->getAcceptableMIMETypes(),
67 2
            $parsedHeaders->getAcceptableMIMETypes()
68
        ));
69
70 2
        return new APIRequest($serverRequest->getMethod(), $parsedURL->getEndpoint(), $parsedURL->getElement(),
71 2
            $acceptableMIMETypes, $parsedURL->getVersion(), $apiKey, $urlQueryData, $serverRequest->getParsedBody());
72
    }
73
74
    /**
75
     * @return URLParser
76
     */
77 2
    public function getURLParser(): URLParser
78
    {
79 2
        return $this->URLParser;
80
    }
81
82
    /**
83
     * @return HeaderParser
84
     */
85 2
    public function getHeaderParser(): HeaderParser
86
    {
87 2
        return $this->headerParser;
88
    }
89
}
90