Test Failed
Pull Request — master (#47)
by Michael
02:07
created

HttpProtocol   A

Complexity

Total Complexity 4

Size/Duplication

Total Lines 102
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 10

Importance

Changes 0
Metric Value
wmc 4
lcom 1
cbo 10
dl 0
loc 102
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 15 1
A send() 0 4 1
B prepare() 0 24 2
1
<?php
2
3
declare(strict_types = 1);
4
5
/*
6
 * This file is part of the AppleApnPush package
7
 *
8
 * (c) Vitaliy Zhuk <[email protected]>
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code
12
 */
13
14
namespace Apple\ApnPush\Protocol;
15
16
use Apple\ApnPush\Encoder\PayloadEncoderInterface;
17
use Apple\ApnPush\Exception\SendNotification\SendNotificationException;
18
use Apple\ApnPush\Model\Notification;
19
use Apple\ApnPush\Model\Receiver;
20
use Apple\ApnPush\Protocol\Http\Authenticator\AuthenticatorInterface;
21
use Apple\ApnPush\Protocol\Http\ExceptionFactory\ExceptionFactoryInterface;
22
use Apple\ApnPush\Protocol\Http\Request;
23
use Apple\ApnPush\Protocol\Http\Response;
24
use Apple\ApnPush\Protocol\Http\Sender\Exception\HttpSenderException;
25
use Apple\ApnPush\Protocol\Http\Sender\HttpSenderInterface;
26
use Apple\ApnPush\Protocol\Http\UriFactory\UriFactoryInterface;
27
use Apple\ApnPush\Protocol\Http\Visitor\HttpProtocolVisitorInterface;
28
29
/**
30
 * Implement HTTP protocol for send push notification
31
 */
32
class HttpProtocol implements ProtocolInterface
33
{
34
    /**
35
     * @var AuthenticatorInterface
36
     */
37
    private $authenticator;
38
39
    /**
40
     * @var HttpSenderInterface
41
     */
42
    private $httpSender;
43
44
    /**
45
     * @var PayloadEncoderInterface
46
     */
47
    private $payloadEncoder;
48
49
    /**
50
     * @var UriFactoryInterface
51
     */
52
    private $uriFactory;
53
54
    /**
55
     * @var HttpProtocolVisitorInterface
56
     */
57
    private $visitor;
58
59
    /**
60
     * @var ExceptionFactoryInterface
61
     */
62
    private $exceptionFactory;
63
64
    /**
65
     * Constructor.
66
     *
67
     * @param AuthenticatorInterface       $authenticator
68
     * @param HttpSenderInterface          $httpSender
69
     * @param PayloadEncoderInterface      $payloadEncoder
70
     * @param UriFactoryInterface          $uriFactory
71
     * @param HttpProtocolVisitorInterface $visitor
72
     * @param ExceptionFactoryInterface    $exceptionFactory
73
     */
74
    public function __construct(
75
        AuthenticatorInterface $authenticator,
76
        HttpSenderInterface $httpSender,
77
        PayloadEncoderInterface $payloadEncoder,
78
        UriFactoryInterface $uriFactory,
79
        HttpProtocolVisitorInterface $visitor,
80
        ExceptionFactoryInterface $exceptionFactory
81
    ) {
82
        $this->authenticator = $authenticator;
83
        $this->httpSender = $httpSender;
84
        $this->payloadEncoder = $payloadEncoder;
85
        $this->uriFactory = $uriFactory;
86
        $this->visitor = $visitor;
87
        $this->exceptionFactory = $exceptionFactory;
88
    }
89
90
    /**
91
     * {@inheritdoc}
92
     *
93
     * @throws HttpSenderException
94
     */
95
    public function send(): void
96
    {
97
        $this->httpSender->send();
98
    }
99
100
    /**
101
     * Inner send process
102
     *
103
     * @param Receiver     $receiver
104
     * @param Notification $notification
105
     * @param bool         $sandbox
106
     *
107
     * @throws SendNotificationException
108
     */
109
    public function prepare(Receiver $receiver, Notification $notification, bool $sandbox)
110
    {
111
        $payloadEncoded = $this->payloadEncoder->encode($notification->getPayload());
112
        $uri = $this->uriFactory->create($receiver->getToken(), $sandbox);
113
114
        $request = new Request($uri, $payloadEncoded);
115
116
        $headers = [
117
            'content-type' => 'application/json',
118
            'accept'       => 'application/json',
119
            'apns-topic'   => $receiver->getTopic(),
120
        ];
121
122
        $request = $request->withHeaders($headers);
123
        $request = $this->authenticator->authenticate($request);
124
125
        $request = $this->visitor->visit($notification, $request);
126
127
        return $this->httpSender->addRequest($request, function (Response $response) {
128
            if ($response->getStatusCode() !== 200) {
129
                throw $this->exceptionFactory->create($response);
130
            }
131
        });
132
    }
133
}
134