Completed
Push — master ( 9d49f5...4100db )
by Blackred
02:30
created

ComradeDeserializer::getData()   B

Complexity

Conditions 5
Paths 2

Size

Total Lines 14
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 14
rs 8.8571
c 0
b 0
f 0
cc 5
eloc 8
nc 2
nop 0
1
<?php
2
3
namespace ComradeReader\Service;
4
5
use ComradeReader\Exception\Deserializer\DeserializerException;
6
use ComradeReader\Model\Entity\PaginatedResults;
7
use Symfony\Component\Serializer\Serializer;
8
9
/**
10
 * Deserializer
11
 * ============
12
 *   Decodes a JSON string into single object or into
13
 *   multiple objects. Supports paginated responses.
14
 *
15
 * @package ComradeReader\Service
16
 */
17
class ComradeDeserializer
18
{
19
    /** @var string $response */
20
    private $response;
21
22
    /** @var Serializer $serializer */
23
    protected $serializer;
24
25
    /**
26
     * @param string     $response
27
     * @param Serializer $serializer
28
     */
29
    public function __construct($response, Serializer $serializer)
30
    {
31
        $this->response   = $response;
32
        $this->serializer = $serializer;
33
    }
34
35
    /**
36
     * @return string
37
     */
38
    public function getPlainResponse()
39
    {
40
        return $this->response;
41
    }
42
43
    /**
44
     * @throws DeserializerException
45
     * @return array
46
     */
47
    public function getResponse()
48
    {
49
        $response = json_decode($this->getPlainResponse(), true);
50
51
        if (!is_array($response)) {
52
            throw new DeserializerException(
53
                'Response is not a valid json, decode error: ' . json_last_error_msg(),
54
                $this->getPlainResponse()
55
            );
56
        }
57
58
        return $response;
59
    }
60
61
    /**
62
     * @return array
63
     */
64
    public function getData()
65
    {
66
        $decoded = $this->getResponse();
67
68
        if (isset($decoded['success'])
69
            && $decoded['success']
70
            && isset($decoded['data'])
71
            && is_array($decoded['data']))
72
        {
73
            return $decoded['data'];
74
        }
75
76
        return $decoded;
77
    }
78
79
    /**
80
     * @param string $targetEntity
81
     * @return object
82
     */
83
    public function decode($targetEntity)
84
    {
85
        $response = $this->_convertNaming(
86
            $this->getData()
87
        );
88
        return $this->serializer->deserialize(json_encode($response), $targetEntity, 'json');
89
    }
90
91
    /**
92
     * Decodes a response into array of objects or into a PaginatedResults
93
     *
94
     * @param string $targetEntity
95
     * @return object[]|PaginatedResults
96
     */
97
    public function decodeMultiple($targetEntity)
98
    {
99
        $responseDecoded = $this->getData();
100
101
        // paginator
102
        $responseObjects = isset($responseDecoded['results']) ? $responseDecoded['results'] : $responseDecoded;
103
        $responseObjects = array_map(
104
105
            function ($item) use ($targetEntity)
106
            {
107
                $item = $this->_convertNaming($item);
108
                return $this->serializer->deserialize(json_encode($item), $targetEntity, 'json');
109
            },
110
111
            $responseObjects
112
        );
113
114
        if (isset($responseDecoded['results'])) {
115
            return new PaginatedResults(
116
                $responseObjects,
117
                $responseDecoded['current_page'],
118
                $responseDecoded['max_pages']
119
            );
120
        }
121
122
        return $responseObjects;
123
    }
124
125
    /**
126
     * @param array $array
127
     * @return array
128
     */
129
    private function _convertNaming($array)
130
    {
131
        $result = [];
132
133
        foreach ($array as $key => $value) {
134
            $key = lcfirst(implode('', array_map('ucfirst', explode('_', $key))));
135
            $result[$key] = $value;
136
        }
137
138
        return $result;
139
    }
140
}