Completed
Push — master ( 77f195...b72026 )
by JHONATAN
02:28
created

WebserviceClient::getClient()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 7
ccs 4
cts 4
cp 1
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 3
nc 2
nop 2
crap 2
1
<?php
2
3
namespace Vox\Webservice;
4
5
use Exception;
6
use GuzzleHttp\ClientInterface;
7
use Metadata\MetadataFactoryInterface;
8
use RuntimeException;
9
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
10
use Symfony\Component\Serializer\SerializerInterface;
11
use Vox\Webservice\Mapping\Resource;
12
use Vox\Webservice\Metadata\TransferMetadata;
13
14
class WebserviceClient implements WebserviceClientInterface
15
{
16
    /**
17
     * @var ClientRegistryInterface
18
     */
19
    private $clientRegistry;
20
    
21
    /**
22
     * @var MetadataFactoryInterface
23
     */
24
    private $metadataFactory;
25
    
26
    /**
27
     * @var DenormalizerInterface
28
     */
29
    private $denormalizer;
30
    
31
    /**
32
     * @var SerializerInterface
33
     */
34
    private $serializer;
35
    
36 13
    public function __construct(
37
        ClientRegistryInterface $clientRegistry, 
38
        MetadataFactoryInterface $metadataFactory, 
39
        DenormalizerInterface $denormalizer, 
40
        SerializerInterface $serializer
41
    ) {
42 13
        $this->clientRegistry  = $clientRegistry;
43 13
        $this->metadataFactory = $metadataFactory;
44 13
        $this->denormalizer    = $denormalizer;
45 13
        $this->serializer      = $serializer;
46 13
    }
47
    
48 3
    public function cGet(string $transferName, array $filters = []): TransferCollection
49
    {
50 3
        $resource = $this->getResource($transferName);
51 3
        $client   = $this->getClient($transferName);
52 3
        $response = $client->request('GET', $resource->route);
53
54 3
        return new TransferCollection($transferName, $this->denormalizer, $response);
55
    }
56
57
    public function delete(string $transferName, $id)
58
    {
59
        $resource = $this->getResource($transferName);
60
        $client   = $this->getClient($transferName);
61
        $route    = sprintf('%s/%s', $resource->route, $id);
62
        $response = $client->request('DELETE', $route);
63
64
        if ($response->getStatusCode() >= 300) {
65
            throw new Exception($response->getReasonPhrase());
66
        }
67
    }
68
69 7
    public function get(string $transferName, $id)
70
    {
71 7
        $resource = $this->getResource($transferName);
72 7
        $client   = $this->getClient($transferName);
73 7
        $route    = sprintf('%s/%s', $resource->route, $id);
74 7
        $response = $client->request('GET', $route);
75 7
        $contents = $response->getBody()->getContents();
76
        
77 7
        if ($contents) {
78 7
            return $this->denormalizer->denormalize(json_decode($contents, true), $transferName);
79
        }
80
    }
81
82 1
    public function post($transfer)
83
    {
84 1
        $data = $this->serializer->serialize($transfer, 'json');
85
        
86 1
        $resource = $this->getResource(get_class($transfer));
87 1
        $client   = $this->getClient(get_class($transfer));
88 1
        $response = $client->request('POST', $resource->route, ['json' => $data]);
89
        
90 1
        if ($response->getStatusCode() >= 300) {
91
            throw new Exception($response->getReasonPhrase());
92
        }
93
        
94 1
        $contents = $response->getBody()->getContents();
95 1
        $this->denormalizer->denormalize(json_decode($contents, true), $transfer);
96 1
    }
97
98
    public function put($transfer)
99
    {
100
        $data     = $this->serializer->serialize($transfer, 'json');
101
        $metadata = $this->getMetadata(get_class($transfer));
102
        $resource = $this->getResource(get_class($transfer));
103
        $client   = $this->getClient(get_class($transfer));
104
        
105
        if (empty($metadata->id)) {
106
            throw new RuntimeException('no id mapped for class ' . get_class($transfer));
107
        }
108
        
109
        $route    = sprintf('%s/%s', $resource->route, $metadata->id->getValue($transfer));
110
        $response = $client->request('PUT', $route, ['json' => $data]);
111
        
112
        if ($response->getStatusCode() >= 300) {
113
            throw new Exception($response->getReasonPhrase());
114
        }
115
        
116
        $this->denormalizer->denormalize(json_decode($response->getBody()->getContents(), true), $transfer);
117
    }
118
    
119 11
    private function getClient(string $transferName, Resource $resource = null): ClientInterface
120
    {
121 11
        if (null === $resource) {
122 11
            $resource = $this->getResource($transferName);
123
        }
124
        
125 11
        return  $this->clientRegistry->get($resource->client);
126
    }
127
    
128 11
    private function getResource(string $transferName): Resource
129
    {
130 11
        return $this->getMetadata($transferName)->getAnnotation(Resource::class, true);
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->getMetadat...\Resource::class, true) could return the type null which is incompatible with the type-hinted return Vox\Webservice\Mapping\Resource. Consider adding an additional type-check to rule them out.
Loading history...
131
    }
132
    
133 11
    private function getMetadata(string $transferName): TransferMetadata
134
    {
135 11
        return $this->metadataFactory->getMetadataForClass($transferName);
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->metadataFa...ForClass($transferName) returns the type null|Metadata\ClassHierarchyMetadata which is incompatible with the type-hinted return Vox\Webservice\Metadata\TransferMetadata.
Loading history...
136
    }
137
}
138