GCMNotification   A
last analyzed

Complexity

Total Complexity 18

Size/Duplication

Total Lines 146
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 4

Test Coverage

Coverage 98.53%

Importance

Changes 0
Metric Value
wmc 18
lcom 2
cbo 4
dl 0
loc 146
ccs 67
cts 68
cp 0.9853
rs 10
c 0
b 0
f 0

8 Methods

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