Test Setup Failed
Push — master ( 83f7a2...986e39 )
by Daniel
06:03
created

Replyable::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 0
1
<?php
2
3
namespace Dacastro4\LaravelGmail\Traits;
4
5
use Dacastro4\LaravelGmail\Services\Message\Mail;
6
use Google_Service_Gmail;
7
use Google_Service_Gmail_Message;
8
use Illuminate\Support\Facades\Storage;
9
use Swift_Attachment;
10
use Swift_Message;
11
12
/**
13
 * @property Google_Service_Gmail $service
14
 */
15
trait Replyable
16
{
17
18
	private $swiftMessage;
19
20
	/**
21
	 * Gmail optional parameters
22
	 *
23
	 * @var array
24
	 */
25
	private $parameters = [];
26
27
	/**
28
	 * Text or html message to send
29
	 *
30
	 * @var string
31
	 */
32
	private $message;
33
34
	/**
35
	 * Subject of the email
36
	 *
37
	 * @var string
38
	 */
39
	private $subject;
40
41
	/**
42
	 * Sender's email
43
	 *
44
	 * @var string
45
	 */
46
	private $from;
47
48
	/**
49
	 * Sender's name
50
	 *
51
	 * @var  string
52
	 */
53
	private $nameFrom;
54
55
	/**
56
	 * Email of the recipient
57
	 *
58
	 * @var string|array
59
	 */
60
	private $to;
61
62
	/**
63
	 * Name of the recipient
64
	 *
65
	 * @var string
66
	 */
67
	private $nameTo;
68
69
	/**
70
	 * Single email or array of email for a carbon copy
71
	 *
72
	 * @var array|string
73
	 */
74
	private $cc;
75
76
	/**
77
	 * Name of the recipient
78
	 *
79
	 * @var string
80
	 */
81
	private $nameCc;
82
83
	/**
84
	 * Single email or array of email for a blind carbon copy
85
	 *
86
	 * @var array|string
87
	 */
88
	private $bcc;
89
90
	/**
91
	 * Name of the recipient
92
	 *
93
	 * @var string
94
	 */
95
	private $nameBcc;
96
97
	/**
98
	 * List of attachments
99
	 *
100
	 * @var array
101
	 */
102
	private $attachments = [];
103
104
	private $priority = 2;
105
106
	public function __construct()
107
	{
108
		$this->swiftMessage = new Swift_Message();
109
	}
110
111
	/**
112
	 * Receives the recipient's
113
	 * If multiple recipients will receive the message an array should be used.
114
	 * Example: array('[email protected]', '[email protected]' => 'A name')
115
	 *
116
	 * If $name is passed and the first parameter is a string, this name will be
117
	 * associated with the address.
118
	 *
119
	 * @param string|array $to
120
	 *
121
	 * @param string|null $name
122
	 *
123
	 * @return $this
124
	 */
125
	public function to( $to, $name = null )
126
	{
127
		$this->to = $to;
128
		$this->nameTo = $name;
129
130
		return $this;
131
	}
132
133
	public function from( $from, $name = null )
134
	{
135
		$this->from = $from;
136
		$this->nameTo = $name;
137
138
		return $this;
139
	}
140
141
	/**
142
	 * @param array|string $cc
143
	 *
144
	 * @param string|null $name
145
	 *
146
	 * @return $this
147
	 */
148
	public function cc( $cc, $name = null )
149
	{
150
		$this->cc = $this->emailList( $cc, $name );
151
		$this->nameCc = $name;
152
153
		return $this;
154
	}
155
156
	/**
157
	 * @param array|string $bcc
158
	 *
159
	 * @param string|null $name
160
	 *
161
	 * @return $this
162
	 */
163
	public function bcc( $bcc, $name = null )
164
	{
165
		$this->bcc = $this->emailList( $bcc, $name );
166
		$this->nameBcc = $name;
167
168
		return $this;
169
	}
170
171
	/**
172
	 * @param string $subject
173
	 *
174
	 * @return $this
175
	 */
176
	public function subject( $subject )
177
	{
178
		$this->subject = $subject;
179
180
		return $this;
181
	}
182
183
	/**
184
	 * @param string $message
185
	 *
186
	 * @return $this
187
	 */
188
	public function message( $message )
189
	{
190
		$this->message = $message;
191
192
		return $this;
193
	}
194
195
	/**
196
	 * Attaches new file to the email from the Storage folder
197
	 *
198
	 * @param $path
199
	 *
200
	 * @return $this
201
	 * @throws \Exception
202
	 */
203
	public function attach( $path )
204
	{
205
206
		$file = [];
207
208
		//TODO: Solve the attach issue. Which files should I attach? UploadFile it's an option.
209
		if ( Storage::has( $path ) ) {
210
			$content = Storage::get( $path );
211
			$name = Storage::name( $path );
212
			$file[ $name ] = $content;
213
		} else {
214
			throw new \Exception( 'File does not exists.' );
215
		}
216
217
		array_push( $this->attachments, $file );
218
219
		return $this;
220
	}
221
222
	/**
223
	 * The value is an integer where 1 is the highest priority and 5 is the lowest.
224
	 *
225
	 * @param int $priority
226
	 *
227
	 * @return $this
228
	 */
229
	public function priority( $priority )
230
	{
231
		$this->priority = $priority;
232
233
		return $this;
234
	}
235
236
	/**
237
	 * @param array $parameters
238
	 *
239
	 * @return $this
240
	 */
241
	public function optionalParameters( array $parameters )
242
	{
243
		$this->parameters = $parameters;
244
245
		return $this;
246
	}
247
248
	/**
249
	 * Reply to a specific email
250
	 *
251
	 * @return Mail
252
	 */
253
	public function reply()
254
	{
255
		$this->setReplyThreat();
256
		$this->setReplySubject();
257
		$body = $this->getMessageBody();
258
		$body->setThreadId($this->getThreatId());
259
260
		return new Mail( $this->service->users_messages->send( 'me', $body, $this->parameters ) );
261
	}
262
263
	/**
264
	 * Sends a new email
265
	 *
266
	 * @return Mail
267
	 */
268
	public function send()
269
	{
270
		$body = $this->getMessageBody();
271
272
		return new Mail( $this->service->users_messages->send( 'me', $body, $this->parameters ) );
273
	}
274
275
	/**
276
	 * Add a header to the email
277
	 *
278
	 * @param string $header
279
	 * @param string $value
280
	 */
281
	public function setHeader( $header, $value )
282
	{
283
		$headers = $this->swiftMessage->getHeaders();
284
285
		$headers->addTextHeader( $header, $value );
286
287
	}
288
289
	/**
290
	 * @return Google_Service_Gmail_Message
291
	 */
292
	private function getMessageBody()
293
	{
294
		$body = new Google_Service_Gmail_Message();
295
296
		$this->swiftMessage
297
			->setSubject( $this->subject )
298
			->setFrom( $this->from, $this->nameFrom )
299
			->setTo( $this->to, $this->nameTo )
300
			->setCc( $this->cc, $this->nameCc )
301
			->setBcc( $this->bcc, $this->nameBcc )
302
			->setBody( $this->message, 'text/html' )
303
			->setPriority( $this->priority );
304
305
		foreach ( $this->attachments as $file ) {
306
			$this->swiftMessage
307
				->attach( Swift_Attachment::fromPath( $file->path )->setFilename( $file->name ) );
308
		}
309
310
		$body->setRaw( $this->base64_encode( $this->swiftMessage->toString() ) );
311
312
		return $body;
313
	}
314
315
	private function base64_encode( $data )
316
	{
317
		return rtrim( strtr( base64_encode( $data ), '+/', '-_' ), '=' );
318
	}
319
320
	private function emailList( $list, $name = null )
321
	{
322
		if ( is_array( $list ) ) {
323
			return $this->convertEmailList( $list, $name );
324
		} else {
325
			return $list;
326
		}
327
	}
328
329
	private function convertEmailList( $emails, $name = null )
330
	{
331
		$newList = [];
332
		$c = 0;
333
		foreach ( $emails as $key => $email ) {
334
			$emailName = isset( $name[ $c ] ) ? $name[ $c ] : explode( '@', $email )[ 0 ];
335
			$newList[ $email ] = $emailName;
336
			$c = $c + 1;
337
		}
338
339
		return $newList;
340
	}
341
342
	private function setReplySubject()
343
	{
344
		if ( ! $this->subject ) {
345
			$this->subject = $this->getSubject();
0 ignored issues
show
Bug introduced by
The method getSubject() does not exist on Dacastro4\LaravelGmail\Traits\Replyable. Did you maybe mean subject()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
346
		}
347
	}
348
349
	private function setReplyThreat()
350
	{
351
		$threatId = $this->getThreatId();
352
		if ( $threatId ) {
353
			$this->setHeader( 'In-Reply-To', $this->getHeader( 'In-Reply-To' ) );
0 ignored issues
show
Bug introduced by
It seems like getHeader() must be provided by classes using this trait. How about adding it as abstract method to this trait?

This check looks for methods that are used by a trait but not required by it.

To illustrate, let’s look at the following code example

trait Idable {
    public function equalIds(Idable $other) {
        return $this->getId() === $other->getId();
    }
}

The trait Idable provides a method equalsId that in turn relies on the method getId(). If this method does not exist on a class mixing in this trait, the method will fail.

Adding the getId() as an abstract method to the trait will make sure it is available.

Loading history...
354
			$this->setHeader( 'References', $this->getHeader( 'References' ) );
0 ignored issues
show
Bug introduced by
It seems like getHeader() must be provided by classes using this trait. How about adding it as abstract method to this trait?

This check looks for methods that are used by a trait but not required by it.

To illustrate, let’s look at the following code example

trait Idable {
    public function equalIds(Idable $other) {
        return $this->getId() === $other->getId();
    }
}

The trait Idable provides a method equalsId that in turn relies on the method getId(). If this method does not exist on a class mixing in this trait, the method will fail.

Adding the getId() as an abstract method to the trait will make sure it is available.

Loading history...
355
			$this->setHeader( 'Message-ID', $this->getHeader( 'Message-ID' ) );
0 ignored issues
show
Bug introduced by
It seems like getHeader() must be provided by classes using this trait. How about adding it as abstract method to this trait?

This check looks for methods that are used by a trait but not required by it.

To illustrate, let’s look at the following code example

trait Idable {
    public function equalIds(Idable $other) {
        return $this->getId() === $other->getId();
    }
}

The trait Idable provides a method equalsId that in turn relies on the method getId(). If this method does not exist on a class mixing in this trait, the method will fail.

Adding the getId() as an abstract method to the trait will make sure it is available.

Loading history...
356
		}
357
	}
358
359
	public abstract function getThreatId();
360
}