Issues (10)

src/TextlocalClient.php (6 issues)

1
<?php
2
3
namespace NotificationChannels\Textlocal;
4
5
use GuzzleHttp\Client;
6
use Illuminate\Support\Carbon;
7
use GuzzleHttp\Exception\SeekException;
8
use GuzzleHttp\Exception\RequestException;
9
use GuzzleHttp\Exception\TransferException;
10
use NotificationChannels\Textlocal\Exceptions\CouldNotSendNotification;
11
use NotificationChannels\Textlocal\Exceptions\CouldNotAuthenticateAccount;
12
13
class TextlocalClient
14
{
15
    /**
16
     * The form params to be sent with the request to the api.
17
     *
18
     * @var array
19
     */
20
    protected $params;
21
22
    /**
23
     * Guzzle http client.
24
     *
25
     * @var GuzzleHttp\Client
0 ignored issues
show
The type NotificationChannels\Textlocal\GuzzleHttp\Client was not found. Did you mean GuzzleHttp\Client? If so, make sure to prefix the type with \.
Loading history...
26
     */
27
    protected $http;
28
29
    /**
30
     * Api endpoint to send the request for sms.
31
     *
32
     * @var string
33
     */
34
    protected $url;
35
36
    /**
37
     * Create new TextlocalClient instance.
38
     *
39
     * @param \GuzzleHttp\Client $client
40
     */
41
    public function __construct(Client $client)
42
    {
43
        $this->http = $client;
0 ignored issues
show
Documentation Bug introduced by
It seems like $client of type GuzzleHttp\Client is incompatible with the declared type NotificationChannels\Textlocal\GuzzleHttp\Client of property $http.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
44
        $this->url = config('services.textlocal.url');
45
    }
46
47
    /**
48
     * Set the Account to be used as Transactional Account.
49
     *
50
     * @return TextlocalClient
51
     */
52
    public function transactional()
53
    {
54
        $apiKey = config('services.textlocal.transactional.apiKey');
55
        if (empty($apiKey)) {
56
            throw CouldNotAuthenticateAccount::apiKeyMissing('transactional');
57
        }
58
        $this->addParam('apiKey', urlencode($apiKey));
59
        $this->addParam('sender', config('services.textlocal.transactional.from'), 'TXTLCL');
0 ignored issues
show
The call to NotificationChannels\Tex...localClient::addParam() has too many arguments starting with 'TXTLCL'. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

59
        $this->/** @scrutinizer ignore-call */ 
60
               addParam('sender', config('services.textlocal.transactional.from'), 'TXTLCL');

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
60
61
        return $this;
62
    }
63
64
    /**
65
     * Set the Account to be used as Promotional Account.
66
     *
67
     * @return TextlocalClient
68
     */
69
    public function promotional()
70
    {
71
        $apiKey = config('services.textlocal.promotional.apiKey');
72
        if (empty($apiKey)) {
73
            throw CouldNotAuthenticateAccount::apiKeyMissing('promotional');
74
        }
75
        $this->addParam('apiKey', urlencode($apiKey));
76
        $this->addParam('sender', config('services.textlocal.promotional.from'), 'TXTLCL');
0 ignored issues
show
The call to NotificationChannels\Tex...localClient::addParam() has too many arguments starting with 'TXTLCL'. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

76
        $this->/** @scrutinizer ignore-call */ 
77
               addParam('sender', config('services.textlocal.promotional.from'), 'TXTLCL');

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress. Please note the @ignore annotation hint above.

Loading history...
77
78
        return $this;
79
    }
80
81
    /**
82
     * Add parameter to the request parameters to be sent to the api endpoint.
83
     *
84
     * @param string $key
85
     * @param string|number $value
86
     * @return TextlocalClient
87
     */
88
    public function addParam($key, $value)
89
    {
90
        $this->params[$key] = $value;
91
92
        return $this;
93
    }
94
95
    /**
96
     * Set the time in future at which the message should be sent.
97
     * @param string|number $schedule
98
     * @return TextlocalClient
99
     */
100
    public function at($schedule)
101
    {
102
        if ($schedule) {
103
            $time = is_numeric($schedule) ? $schedule : Carbon::parse($schedule)->timestamp;
104
            $this->addParam('schedule_time', $time);
105
        }
106
107
        return $this;
108
    }
109
110
    /**
111
     * If provided, set the sender from which the message should be sent.
112
     * Otherwise let the sender be the default provided in the config.
113
     *
114
     * @param $sender
115
     * @return TextlocalClient
116
     */
117
    public function from($sender)
118
    {
119
        if ($sender) {
120
            $this->addParam('sender', $sender);
121
        }
122
123
        return $this;
124
    }
125
126
    /**
127
     * Prepare comma separated list of numbers to which the message is to be sent.
128
     * @param $numbers
129
     * @return TextlocalClient
130
     */
131
    public function to($numbers)
132
    {
133
        $this->addParam(
134
            'numbers',
135
            implode(
136
                ',',
137
                is_string($numbers) ? explode(',', $numbers) : $numbers
138
            )
139
        );
140
141
        return $this;
142
    }
143
144
    /**
145
     * Prepare the params from the received message object and make the api request to send sms.
146
     *
147
     * @param string $to
148
     * @param TexlocalMessage $message
0 ignored issues
show
The type NotificationChannels\Textlocal\TexlocalMessage was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
149
     * @return object
150
     */
151
    public function message($to, $message)
152
    {
153
        $numbers = array_merge([$to], $message->cc);
154
155
        return $this->{$message->account}()
156
            ->to($numbers)
157
            ->from($message->from)
158
            ->at($message->at)
159
            ->test($message->test)
160
            ->send($message->content);
161
    }
162
163
    /**
164
     * Send the message, making a request to the api endpoint.
165
     *
166
     * @param string $message
167
     * @return object
168
     */
169
    public function send($message)
170
    {
171
        $this->addParam('message', rawurlencode($message));
172
173
        return $this->post();
174
    }
175
176
    /**
177
     * Send the message after setting the flag for test.
178
     *
179
     * @param bool $test
180
     * @return $this
181
     */
182
    public function test($test)
183
    {
184
        if ($test) {
185
            $this->addParam('test', true);
0 ignored issues
show
true of type true is incompatible with the type double|integer|string expected by parameter $value of NotificationChannels\Tex...localClient::addParam(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

185
            $this->addParam('test', /** @scrutinizer ignore-type */ true);
Loading history...
186
        }
187
188
        return $this;
189
    }
190
191
    /**
192
     * Make the request to the api endpoint for sending the message.
193
     *
194
     * @return object
195
     * @throws \Exception
196
     */
197
    public function post()
198
    {
199
        $params = ['form_params' => $this->params];
200
        try {
201
            $response = $this->http->request('POST', $this->url, $params, ['verify' => false, 'timeout' => 60]);
202
            $data = json_decode($response->getBody()->getContents());
203
            // var_dump('TextlocalClient post response');
204
            // var_dump(json_encode($data));
205
206
            return $this->handleResponse($data);
207
        } catch (RequestException | SeekException | TransferException $e) {
208
            throw $e;
209
        }
210
    }
211
212
    /**
213
     * Handle the response from the api endpoint.
214
     *
215
     * @param object $data
216
     * @return object
217
     * @throws CouldNotSendNotification
218
     */
219
    public function handleResponse($data)
220
    {
221
        if ($data->status === 'failure') {
222
            foreach ($data->errors as $error) {
223
                throw CouldNotSendNotification::serviceRespondedWithAnError($error);
224
            }
225
        }
226
227
        return $data;
228
    }
229
}
230