Completed
Push — master ( 6be938...3b6271 )
by Edgar
02:01
created

GCMNotification::handleResponse()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 9
ccs 5
cts 5
cp 1
rs 9.6666
c 0
b 0
f 0
cc 2
eloc 5
nc 2
nop 1
crap 2
1
<?php
2
namespace nstdio\notymo;
3
4
/**
5
 * Class GCMNotificationComponent
6
 */
7
class GCMNotification extends AbstractNotification
8
{
9
    /**
10
     *
11
     */
12
    const GCM_HOST = 'https://gcm-http.googleapis.com/gcm/send';
13
14
    /**
15
     *
16
     */
17
    const MAX_TOKENS = 1000;
18
19
    /**
20
     * @var array
21
     */
22
    private $headers;
23
24
    /**
25
     * GCMNotificationComponent constructor.
26
     *
27
     * @param $apiKey
28
     */
29 16
    public function __construct($apiKey)
30
    {
31 16
        parent::__construct();
32
33 16
        $this->headers = array(
34 16
            'Authorization: key=' . $apiKey,
35 16
            'Content-Type: application/json',
36
        );
37 16
    }
38
39 4
    protected function sendImpl(MessageInterface $message)
40
    {
41 4
        $response = $this->handleResponse($this->sendMessage($message));
42
43 4
        if (isset($response['success']) && $response['success'] === 1) {
44 1
            $this->messageQueue->dequeue();
45 1
        }
46
47 4
        $this->notifyOnEachSent($message, $response);
48 4
    }
49
50
    /**
51
     * @param $message
52
     */
53 4
    private function sendMessage(MessageInterface $message)
54
    {
55 4
        $data = $this->createPayload($message);
56
57 4
        $this->stream->write(CURLOPT_POSTFIELDS, json_encode($data));
58
59 4
        return $this->stream->read();
60
    }
61
62
    /**
63
     * @param MessageInterface $message
64
     *
65
     * @return array
66
     */
67 4
    final protected function createPayload(MessageInterface $message)
68
    {
69
        $data = array(
70 4
            'registration_ids' => $this->getTokens($message),
71
            'data'             => array(
72 4
                'message' => $message->getMessage(),
73 4
                'sound'   => $message->getSound(),
74 4
                'badge'   => $message->getBadge(),
75 4
            ),
76 4
        );
77 4
        $customData = $message->getCustomData();
78 4
        if (!empty($customData)) {
79 1
            $data['data'] = array_merge($data['data'], $customData);
80 1
        }
81
82 4
        return $data;
83
    }
84
85 4
    private function getTokens(MessageInterface $message)
86
    {
87 4
        $ret = array();
88 4
        if ($message->isMultiple()) {
89 1
            foreach ($message->getToken() as $token) {
90 1
                $ret[] = $token;
91 1
            }
92 1
        } else {
93 4
            $ret[] = $message->getToken();
94
        }
95
96 4
        return $ret;
97
    }
98
99 4
    public function enqueue(MessageInterface $message)
100
    {
101 4
        if ($message->isMultiple() && count($message->getToken()) > self::MAX_TOKENS) {
102 1
            $parts = array_chunk($message->getToken(), self::MAX_TOKENS);
103 1
            $message->setToken(null);
104 1
            $firstElement = array_shift($parts);
105
106 1
            foreach ($parts as $item) {
107 1
                $clonedMessage = clone $message;
108 1
                $clonedMessage->setToken($item);
109 1
                parent::enqueue($clonedMessage);
110 1
            }
111
112 1
            $message->setToken($firstElement);
113 1
        }
114
115 4
        parent::enqueue($message);
116 4
    }
117
118 4
    protected function getConnectionParams()
119
    {
120
        return array(
121 4
            CURLOPT_URL            => self::GCM_HOST,
122 4
            CURLOPT_POST           => true,
123 4
            CURLOPT_HTTPHEADER     => $this->headers,
124 4
            CURLOPT_RETURNTRANSFER => true,
125 4
        );
126
    }
127
128
    /**
129
     * @param $response
130
     *
131
     * @return mixed
132
     */
133 4
    private function handleResponse($response)
134
    {
135 4
        $decodedResponse = json_decode($response, true);
136 4
        if ($decodedResponse === null) {
137 1
            return $response;
138
        }
139
140 3
        return $decodedResponse;
141
    }
142
}