Completed
Push — master ( ed9d4f...e2ac31 )
by Barry vd.
03:09
created

ApnChannel::send()   B

Complexity

Conditions 6
Paths 18

Size

Total Lines 45
Code Lines 29

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 30
CRAP Score 6.027

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 45
ccs 30
cts 33
cp 0.9091
rs 8.439
cc 6
eloc 29
nc 18
nop 2
crap 6.027
1
<?php
2
3
namespace NotificationChannels\Apn;
4
5
use Exception;
6
use Illuminate\Events\Dispatcher;
7
use Illuminate\Notifications\Events\NotificationFailed;
8
use Illuminate\Notifications\Notification;
9
use NotificationChannels\Apn\Exceptions\SendingFailed;
10
use ZendService\Apple\Apns\Client\Message as Client;
11
use ZendService\Apple\Apns\Client\Feedback as FeedbackClient;
12
use ZendService\Apple\Apns\Message as Packet;
13
use ZendService\Apple\Apns\Message\Alert;
14
use ZendService\Apple\Apns\Response\Message as Response;
15
use ZendService\Apple\Apns\Response\Feedback as FeedbackResponse;
16
17
class ApnChannel
18
{
19
    const SANDBOX = 0;
20
    const PRODUCTION = 1;
21
22
    /** @var string */
23
    protected $environment;
24
25
    /** @var string */
26
    protected $certificate;
27
28
    /** @var string|null */
29
    protected $passPhrase;
30
31
    /** @var \ZendService\Apple\Apns\Client\Message */
32
    protected $client;
33
34
    /** @var \ZendService\Apple\Apns\Client\Feedback */
35
    protected $feedbackClient;
36
37
    /** @var \Illuminate\Events\Dispatcher */
38
    protected $events;
39
40
    /**
41
     * @param \ZendService\Apple\Apns\Client\Message $client
42
     * @param \ZendService\Apple\Apns\Client\Feedback $feedbackClient
43
     * @param \Illuminate\Events\Dispatcher $events
44
     * @param string $environment
45
     * @param string $certificate
46
     * @param string|null $passPhrase
47
     */
48 2
    public function __construct(
49
        Client $client,
50
        FeedbackClient $feedbackClient,
51
        Dispatcher $events,
52
        $environment,
53
        $certificate,
54
        $passPhrase = null
55
    ) {
56 2
        $this->client = $client;
57 2
        $this->feedbackClient = $feedbackClient;
58 2
        $this->events = $events;
59 2
        $this->environment = $environment;
60 2
        $this->certificate = $certificate;
61 2
        $this->passPhrase = $passPhrase;
62 2
    }
63
64
    /**
65
     * Send the notification to Apple Push Notification Service.
66
     *
67
     * @param mixed $notifiable
68
     * @param \Illuminate\Notifications\Notification $notification
69
     *
70
     * @throws \NotificationChannels\Apn\Exceptions\SendingFailed
71
     */
72 1
    public function send($notifiable, Notification $notification)
73
    {
74 1
        $tokens = (array) $notifiable->routeNotificationFor('apn');
75 1
        if (! $tokens) {
0 ignored issues
show
Bug Best Practice introduced by Robin van Nunen
The expression $tokens of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
76
            return;
77
        }
78
79 1
        $message = $notification->toApn($notifiable);
80 1
        if (! $message) {
81
            return;
82
        }
83
84 1
        $this->openConnection();
85
86 1
        foreach ($tokens as $token) {
87
            try {
88 1
                $alert = new Alert();
89 1
                $alert->setTitle($message->title);
90 1
                $alert->setBody($message->body);
91
92 1
                $packet = new Packet();
93 1
                $packet->setToken($token);
94 1
                $packet->setBadge($message->badge);
95 1
                $packet->setSound($message->sound);
96 1
                $packet->setCategory($message->category);
97 1
                $packet->setAlert($alert);
98 1
                $packet->setCustom($message->custom);
99
100 1
                $response = $this->client->send($packet);
101
102 1
                if ($response->getCode() !== Response::RESULT_OK) {
103 1
                    $this->events->fire(
104 1
                        new NotificationFailed($notifiable, $notification, $this, [
0 ignored issues
show
Documentation introduced by Robin van Nunen
$this is of type this<NotificationChannels\Apn\ApnChannel>, but the function expects a string.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
105 1
                            'token' => $token,
106 1
                            'error' => $response->getCode(),
107 1
                        ])
108 1
                    );
109 1
                }
110 1
            } catch (Exception $e) {
111
                throw SendingFailed::create($e);
112
            }
113 1
        }
114
115 1
        $this->closeConnection();
116 1
    }
117
118
    /**
119
     * Get feedback from the Apple Feedback Service about failed deliveries
120
     *
121
     * @return array|ApnFeedback[]
122
     * @throws Exceptions\ConnectionFailed
123
     */
124 1
    public function getFeedback()
125
    {
126 1
        $client = $this->feedbackClient;
127
128
        try {
129 1
            $client->open($this->environment, $this->certificate, $this->passPhrase);
130 1
        } catch (Exception $exception) {
131
            throw Exceptions\ConnectionFailed::create($exception);
132
        }
133
134 1
        $feedback = [];
135
136
        /** @var FeedbackResponse $response */
137 1
        foreach ($client->feedback() as $response) {
138 1
            $feedback[] = new ApnFeedback($response->getToken(), $response->getTime());
139 1
        }
140
141 1
        $client->close();
142
143 1
        return $feedback;
144
    }
145
146
    /**
147
     * Open the connection.
148
     *
149
     * @throws \NotificationChannels\Apn\Exceptions\ConnectionFailed
150
     */
151 1
    private function openConnection()
152
    {
153
        try {
154 1
            $this->client->open($this->environment, $this->certificate, $this->passPhrase);
155 1
        } catch (Exception $exception) {
156
            throw Exceptions\ConnectionFailed::create($exception);
157
        }
158 1
    }
159
160
    /**
161
     * Close the connection.
162
     */
163 1
    private function closeConnection()
164
    {
165 1
        $this->client->close();
166 1
    }
167
}
168