Test Failed
Pull Request — master (#49)
by Sergei
02:23
created

EmailFactory::create()   D

Complexity

Conditions 12
Paths 360

Size

Total Lines 57
Code Lines 40

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 12
eloc 40
c 1
b 0
f 0
nc 360
nop 1
dl 0
loc 57
rs 4.1333

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Mailer\Symfony;
6
7
use DateTimeImmutable;
8
use Symfony\Component\Mime\Address;
9
use Symfony\Component\Mime\Email;
10
use Yiisoft\Mailer\MessageInterface;
11
12
/**
13
 * @internal
14
 */
15
final class EmailFactory
16
{
17
    public function create(MessageInterface $message): Email
18
    {
19
        $email = (new Email())
20
            ->from(...$this->convertStringsToAddresses($message->getFrom()))
21
            ->to(...$this->convertStringsToAddresses($message->getTo()))
22
            ->replyTo(...$this->convertStringsToAddresses($message->getReplyTo()))
23
            ->cc(...$this->convertStringsToAddresses($message->getCc()))
24
            ->bcc(...$this->convertStringsToAddresses($message->getBcc()))
25
            ->subject($message->getSubject())
26
            ->priority($message->getPriority())
27
            ->text($message->getTextBody(), $message->getCharset())
28
            ->html($message->getHtmlBody(), $message->getCharset());
29
30
        $returnPath = $message->getReturnPath();
31
        if ($returnPath !== '') {
32
            $email->returnPath($returnPath);
33
        }
34
35
        $sender = $message->getSender();
36
        if ($sender !== '') {
37
            $email->sender($sender);
38
        }
39
40
        $date = $message->getDate();
41
        if ($date !== null) {
42
            $email->date($date);
43
        }
44
45
        $emailHeaders = $email->getHeaders();
46
        foreach ($message->getHeaders() as $name => $values) {
0 ignored issues
show
Bug introduced by
The method getHeaders() does not exist on Yiisoft\Mailer\MessageInterface. Did you maybe mean getHeader()? ( Ignorable by Annotation )

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

46
        foreach ($message->/** @scrutinizer ignore-call */ getHeaders() as $name => $values) {

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
47
            foreach ($values as $value) {
48
                switch ($name) {
49
                    case 'Date':
50
                        $emailHeaders->addDateHeader($name, new DateTimeImmutable($value));
51
                        break;
52
                    case 'Message-ID':
53
                        $emailHeaders->addIdHeader($name, $value);
54
                        break;
55
                    default:
56
                        $emailHeaders->addTextHeader($name, $value);
57
                }
58
            }
59
        }
60
61
        foreach ($message->getAttachments() as $file) {
0 ignored issues
show
Bug introduced by
The method getAttachments() does not exist on Yiisoft\Mailer\MessageInterface. ( Ignorable by Annotation )

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

61
        foreach ($message->/** @scrutinizer ignore-call */ getAttachments() as $file) {

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
62
            $file->path() === null
63
                ? $email->attach((string) $file->content(), $file->name(), $file->contentType())
64
                : $email->attachFromPath($file->path(), $file->name(), $file->contentType());
65
        }
66
67
        foreach ($message->getEmbeddedFiles() as $file) {
0 ignored issues
show
Bug introduced by
The method getEmbeddedFiles() does not exist on Yiisoft\Mailer\MessageInterface. ( Ignorable by Annotation )

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

67
        foreach ($message->/** @scrutinizer ignore-call */ getEmbeddedFiles() as $file) {

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
68
            $file->path() === null
69
                ? $email->embed((string) $file->content(), $file->name(), $file->contentType())
70
                : $email->embedFromPath($file->path(), $file->name(), $file->contentType());
71
        }
72
73
        return $email;
74
    }
75
76
    /**
77
     * Converts address instances to their string representations.
78
     *
79
     * @param Address[] $addresses
80
     *
81
     * @return array<string, string>|string
82
     */
83
    private function convertAddressesToStrings(array $addresses): array|string
0 ignored issues
show
Unused Code introduced by
The method convertAddressesToStrings() is not used, and could be removed.

This check looks for private methods that have been defined, but are not used inside the class.

Loading history...
84
    {
85
        $strings = [];
86
87
        foreach ($addresses as $address) {
88
            $strings[$address->getAddress()] = $address->getName();
89
        }
90
91
        return empty($strings) ? '' : $strings;
92
    }
93
94
    /**
95
     * Converts string representations of address to their instances.
96
     *
97
     * @param array<int|string, string>|string $strings
98
     *
99
     * @return Address[]
100
     */
101
    private function convertStringsToAddresses(array|string $strings): array
102
    {
103
        if (is_string($strings)) {
0 ignored issues
show
introduced by
The condition is_string($strings) is always false.
Loading history...
104
            return [new Address($strings)];
105
        }
106
107
        $addresses = [];
108
109
        foreach ($strings as $address => $name) {
110
            if (!is_string($address)) {
111
                // email address without name
112
                $addresses[] = new Address($name);
113
                continue;
114
            }
115
116
            $addresses[] = new Address($address, $name);
117
        }
118
119
        return $addresses;
120
    }
121
}
122