Passed
Push — master ( d4ca25...19a485 )
by Michael
03:08
created

LinkHandler   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 101
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 9

Test Coverage

Coverage 93.55%

Importance

Changes 0
Metric Value
wmc 8
lcom 1
cbo 9
dl 0
loc 101
ccs 29
cts 31
cp 0.9355
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A toResource() 0 18 2
A createLink() 0 11 1
A resolveParameters() 0 16 3
A fromResource() 0 4 1
1
<?php
2
declare(strict_types = 1);
3
4
namespace Mikemirten\Component\JsonApi\Mapper\Handler;
5
6
use Mikemirten\Component\JsonApi\Document\LinkObject;
7
use Mikemirten\Component\JsonApi\Document\ResourceObject;
8
use Mikemirten\Component\JsonApi\Mapper\Definition\Link as LinkDefinition;
9
use Mikemirten\Component\JsonApi\Mapper\Handler\LinkRepository\Link as LinkData;
10
use Mikemirten\Component\JsonApi\Mapper\Handler\LinkRepository\RepositoryProvider as LinkRepositoryProvider;
11
use Mikemirten\Component\JsonApi\Mapper\Handler\PropertyAccessor\PropertyAccessorInterface;
12
use Mikemirten\Component\JsonApi\Mapper\MappingContext;
13
14
class LinkHandler implements HandlerInterface
15
{
16
    /**
17
     * Provider of links' repositories
18
     *
19
     * @var LinkRepositoryProvider
20
     */
21
    protected $provider;
22
23
    /**
24
     * Property accessor
25
     *
26
     * @var PropertyAccessorInterface
27
     */
28
    protected $accessor;
29
30
    /**
31
     * LinkHandler constructor.
32
     *
33
     * @param LinkRepositoryProvider    $provider
34
     * @param PropertyAccessorInterface $accessor
35
     */
36 1
    public function __construct(LinkRepositoryProvider $provider, PropertyAccessorInterface $accessor)
37
    {
38 1
        $this->provider = $provider;
39 1
        $this->accessor = $accessor;
40 1
    }
41
42
    /**
43
     * {@inheritdoc}
44
     */
45 1
    public function toResource($object, ResourceObject $resource, MappingContext $context)
46
    {
47 1
        foreach ($context->getDefinition()->getLinks() as $linkDefinition)
48
        {
49 1
            $repoName = $linkDefinition->getRepositoryName();
50 1
            $linkName = $linkDefinition->getLinkName();
51
52 1
            $parameters = $this->resolveParameters($object, $linkDefinition);
53
54 1
            $linkData = $this->provider
55 1
                ->getRepository($repoName)
56 1
                ->getLink($linkName, $parameters);
57
58 1
            $link = $this->createLink($linkDefinition, $linkData);
59
60 1
            $resource->setLink($linkDefinition->getName(), $link);
61
        }
62 1
    }
63
64
    /**
65
     * Create link-object
66
     *
67
     * @param  LinkDefinition $definition
68
     * @param  LinkData       $data
69
     * @return LinkObject
70
     */
71 1
    protected function createLink(LinkDefinition $definition, LinkData $data): LinkObject
72
    {
73 1
        $reference = $data->getReference();
74
75 1
        $metadata = array_replace(
76 1
            $data->getMetadata(),
77 1
            $definition->getMetadata()
78
        );
79
80 1
        return new LinkObject($reference, $metadata);
81
    }
82
83
    /**
84
     * Resolve parameters
85
     *
86
     * @param  mixed          $object
87
     * @param  LinkDefinition $definition
88
     * @return array
89
     */
90 1
    protected function resolveParameters($object, LinkDefinition $definition): array
91
    {
92 1
        $resolved = [];
93
94 1
        foreach ($definition->getParameters() as $name => $value)
95
        {
96 1
            if (strpos($value, '@') === 0) {
97 1
                $resolved[$name] = $this->accessor->getValue($object, substr($value, 1));
98 1
                continue;
99
            }
100
101 1
            $resolved[$name] = $value;
102
        }
103
104 1
        return $resolved;
105
    }
106
107
    /**
108
     * {@inheritdoc}
109
     */
110
    public function fromResource($object, ResourceObject $resource, MappingContext $context)
111
    {
112
        // Do nothing
113
    }
114
}