MailServiceLogger   A
last analyzed

Complexity

Total Complexity 9

Size/Duplication

Total Lines 105
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 1
Metric Value
eloc 38
dl 0
loc 105
ccs 40
cts 40
cp 1
rs 10
c 1
b 0
f 1
wmc 9

4 Methods

Rating   Name   Duplication   Size   Complexity  
A send() 0 23 5
A __construct() 0 4 1
A formatAddresses() 0 14 2
A getMessageTokens() 0 10 1
1
<?php
2
3
namespace Kodus\Mail;
4
5
use Error;
6
use Exception;
7
use Psr\Log\LoggerInterface;
8
9
/**
10
 * This decorator writes a log-message to a PSR-3 logger when sending
11
 * a given `Message` via another `MailService` implementation.
12
 */
13
class MailServiceLogger implements MailService
14
{
15
    /**
16
     * @var LoggerInterface
17
     */
18
    private $logger;
19
20
    /**
21
     * @var MailService
22
     */
23
    private $mail_service;
24
25
    /**
26
     * @var string log-message template
27
     *
28
     * @see getMessageTokens() for available tokens
29
     */
30
    public $template = "{status} via {service} to: {to} from: {from} with subject: {subject}";
31
32
    /**
33
     * @var string PSR-3 log-entry severity level
34
     *
35
     * @see https://tools.ietf.org/html/rfc5424#page-11
36
     */
37
    public $level = "debug";
38
39
    /**
40
     * @param LoggerInterface $logger
41 2
     * @param MailService     $mail_service
42
     */
43 2
    public function __construct(LoggerInterface $logger, MailService $mail_service)
44 2
    {
45 2
        $this->logger = $logger;
46
        $this->mail_service = $mail_service;
47
    }
48
49
    /**
50
     * @param Message $message
51
     *
52 2
     * @throws Exception|Error if the underlying Mail Service throws an Exception or Error
53
     */
54
    public function send(Message $message): void
55 2
    {
56 2
        try {
57
            $this->mail_service->send($message);
58 1
        } catch (Exception $e) {
59
            // catch Exception
60
        } catch (Error $e) {
61
            // catch Error
62 2
        }
63 2
64 2
        $status = isset($e)
65
            ? "ERROR: message not sent [" . get_class($e) . ": " . $e->getMessage() . "]"
66 2
            : "message sent";
67 2
68 2
        $message = strtr(
69 2
            $this->template,
70
            $this->getMessageTokens($message, $status)
71 2
        );
72
73 2
        $this->logger->log($this->level, $message);
74 1
75
        if (isset($e)) {
76 1
            throw $e; // re-throw unhandled Exception/Error
77
        }
78
    }
79
80
    /**
81
     * @param Message $message
82
     * @param string  $status error/success status description
83 2
     *
84
     * @return array map where message token => replacement string
85
     */
86 2
    protected function getMessageTokens(Message $message, string $status): array
87 2
    {
88 2
        return [
89 2
            "{status}"  => $status,
90 2
            "{service}" => get_class($this->mail_service),
91 2
            "{to}"      => $this->formatAddresses($message->getTo()),
92 2
            "{from}"    => $this->formatAddresses($message->getFrom()),
93
            "{cc}"      => $this->formatAddresses($message->getCC()),
94 2
            "{bcc}"     => $this->formatAddresses($message->getBCC()),
95
            "{subject}" => $message->getSubject(),
96
        ];
97
    }
98
99
    /**
100
     * @param Address[] $addresses
101
     *
102 2
     * @return string
103
     */
104 2
    protected function formatAddresses(array $addresses): string
105 2
    {
106 2
        return implode(
107 2
            ", ",
108 2
            array_map(
109 2
                function (Address $address) {
110
                    $name = $address->getName();
111
                    $email = $address->getEmail();
112 2
113 2
                    return $name
114 2
                        ? "{$name} <{$email}>"
115
                        : "<{$email}>";
116 2
                },
117 2
                $addresses
118
            )
119
        );
120
    }
121
}
122