Passed
Push — master ( 0bf4b3...eb79c4 )
by Eugene
03:30
created

ResourceResponseMiddlewareAbstract::getUri()   B

Complexity

Conditions 5
Paths 16

Size

Total Lines 20
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 30

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 20
ccs 0
cts 17
cp 0
rs 8.8571
cc 5
eloc 13
nc 16
nop 1
crap 30
1
<?php
2
namespace Staticus\Resources\Middlewares;
3
4
use Staticus\Diactoros\Response\FileContentResponse;
5
use Staticus\Diactoros\Response\FileUploadedResponse;
6
use Staticus\Diactoros\Response\ResourceDoResponse;
7
use Staticus\Middlewares\MiddlewareAbstract;
8
use Psr\Http\Message\ResponseInterface;
9
use Psr\Http\Message\ServerRequestInterface;
10
use Staticus\Resources\ResourceDOInterface;
11
use Zend\Diactoros\Response\EmptyResponse;
12
use Zend\Diactoros\Response\JsonResponse;
13
14
abstract class ResourceResponseMiddlewareAbstract extends MiddlewareAbstract
15
{
16
    /**
17
     * @var ResourceDOInterface
18
     */
19
    protected $resourceDO;
20
    
21
    public function __construct(ResourceDOInterface $resourceDO)
22
    {
23
        $this->resourceDO = $resourceDO;
24
    }
25
26
    public function __invoke(
27
        ServerRequestInterface $request,
28
        ResponseInterface $response,
29
        callable $next = null
30
    )
31
    {
32
        parent::__invoke($request, $response, $next);
33
        if ($this->isSupportedResponse($response)) {
34
            $uri = $this->getUri($this->resourceDO);
35
            $data = [
36
                'resource' => $this->resourceDO->toArray(),
37
                'uri' => $uri,
38
            ];
39
            if (!empty($data)) {
40
                $headers = $response->getHeaders();
41
                $headers['Content-Type'] = 'application/json';
42
43
                // here is relative link without host url
44
                $headers['Link'] = '<' . rawurlencode($uri) . '>; rel="canonical"';
45
                $response = $this->getResponseObject($data, $response->getStatusCode(), $headers);
46
            }
47
        }
48
49
        return $next($request, $response);
50
    }
51
52
    /**
53
     * @return ResponseInterface
54
     */
55
    protected function getResponseObject($data, $status, array $headers)
56
    {
57
        $return = new JsonResponse($data, $status, $headers);
58
59
        return $return;
60
    }
61
62
    protected function getUri(ResourceDOInterface $resourceDO)
63
    {
64
        $uri = $resourceDO->getName() . '.' . $resourceDO->getType();
65
        $query = [];
66
        if (ResourceDOInterface::DEFAULT_VARIANT !== $resourceDO->getVariant()) {
67
            $query['var'] = $resourceDO->getVariant();
68
        }
69
        if (ResourceDOInterface::DEFAULT_NAME_ALTERNATIVE !== $resourceDO->getNameAlternative()) {
70
            $query['alt'] = $resourceDO->getNameAlternative();
71
        }
72
        if (ResourceDOInterface::DEFAULT_VERSION !== $resourceDO->getVersion()) {
73
            $query['v'] = $resourceDO->getVersion();
74
        }
75
        $query = http_build_query($query);
76
        if ($query) {
77
            $uri .= '?' . $query;
78
        }
79
80
        return $uri;
81
    }
82
83
    /**
84
     * @param ResponseInterface $response
85
     * @return bool
86
     */
87
    protected function isSupportedResponse(ResponseInterface $response)
88
    {
89
        return $response instanceof EmptyResponse
90
        || $response instanceof FileContentResponse
91
        || $response instanceof FileUploadedResponse
92
        || $response instanceof ResourceDoResponse;
93
    }
94
}
95