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
Bug
introduced
by
![]() |
|||||||
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
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.. ![]() |
|||||||
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
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. ![]() |
|||||||
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
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. ![]() |
|||||||
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. filter:
dependency_paths: ["lib/*"]
For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths ![]() |
|||||||
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
![]() |
|||||||
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 |