PasswordRequestSender   A
last analyzed

Complexity

Total Complexity 10

Size/Duplication

Total Lines 109
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 7

Importance

Changes 0
Metric Value
wmc 10
lcom 1
cbo 7
dl 0
loc 109
rs 10
c 0
b 0
f 0

6 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 7 1
A send() 0 26 5
A logSentEmail() 0 8 1
A logError() 0 4 1
A sendForgotPasswordResetEmail() 0 5 1
A sendForgotPasswordNotRegisteredEmail() 0 5 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace SixtyEightPublishers\User\ForgotPassword\PasswordRequest;
6
7
use Throwable;
8
use Nette\SmartObject;
9
use SixtyEightPublishers\User\Common\Logger\LoggerInterface;
10
use SixtyEightPublishers\User\ForgotPassword\Entity\PasswordRequestInterface;
11
use SixtyEightPublishers\User\ForgotPassword\Mail\ForgotPasswordResetEmailInterface;
12
use SixtyEightPublishers\User\ForgotPassword\Exception\PasswordRequestCreationException;
13
use SixtyEightPublishers\User\ForgotPassword\Mail\ForgotPasswordNotRegisteredEmailInterface;
14
15
class PasswordRequestSender implements PasswordRequestSenderInterface
16
{
17
	use SmartObject;
18
19
	/** @var \SixtyEightPublishers\User\ForgotPassword\PasswordRequest\PasswordRequestFactoryInterface  */
20
	private $passwordRequestFactory;
21
22
	/** @var \SixtyEightPublishers\User\ForgotPassword\Mail\ForgotPasswordResetEmailInterface  */
23
	private $forgotPasswordResetEmail;
24
25
	/** @var \SixtyEightPublishers\User\ForgotPassword\Mail\ForgotPasswordNotRegisteredEmailInterface  */
26
	private $forgotPasswordNotRegisteredEmail;
27
28
	/** @var \SixtyEightPublishers\User\Common\Logger\LoggerInterface  */
29
	protected $logger;
30
31
	/**
32
	 * @param \SixtyEightPublishers\User\ForgotPassword\PasswordRequest\PasswordRequestFactoryInterface $passwordRequestFactory
33
	 * @param \SixtyEightPublishers\User\Common\Logger\LoggerInterface                                  $logger
34
	 * @param \SixtyEightPublishers\User\ForgotPassword\Mail\ForgotPasswordResetEmailInterface          $forgotPasswordResetEmail
35
	 * @param \SixtyEightPublishers\User\ForgotPassword\Mail\ForgotPasswordNotRegisteredEmailInterface  $forgotPasswordNotRegisteredEmail
36
	 */
37
	public function __construct(PasswordRequestFactoryInterface $passwordRequestFactory, LoggerInterface $logger, ForgotPasswordResetEmailInterface $forgotPasswordResetEmail, ForgotPasswordNotRegisteredEmailInterface $forgotPasswordNotRegisteredEmail)
38
	{
39
		$this->passwordRequestFactory = $passwordRequestFactory;
40
		$this->logger = $logger;
41
		$this->forgotPasswordResetEmail = $forgotPasswordResetEmail;
42
		$this->forgotPasswordNotRegisteredEmail = $forgotPasswordNotRegisteredEmail;
43
	}
44
45
	/**
46
	 * @param string $email
47
	 *
48
	 * @return \SixtyEightPublishers\User\ForgotPassword\Entity\PasswordRequestInterface
49
	 */
50
	public function send(string $email): ?PasswordRequestInterface
51
	{
52
		try {
53
			$this->sendForgotPasswordResetEmail(
54
				$request = $this->passwordRequestFactory->create($email)
55
			);
56
		} catch (PasswordRequestCreationException $e) {
57
			if (!$e->isNotRegisteredEmail()) {
58
				$this->logError($e);
59
60
				throw $e;
61
			}
62
63
			try {
64
				$this->sendForgotPasswordNotRegisteredEmail($email);
65
			} catch (Throwable $e) {
66
				$this->logError($e);
67
68
				throw PasswordRequestCreationException::from($e);
69
			}
70
		} catch (Throwable $e) {
71
			throw PasswordRequestCreationException::from($e);
72
		}
73
74
		return $request ?? NULL;
75
	}
76
77
	/**
78
	 * @param string $email
79
	 * @param string $mailClassName
80
	 *
81
	 * @return void
82
	 */
83
	protected function logSentEmail(string $email, string $mailClassName): void
84
	{
85
		$this->logger->info(sprintf(
86
			'Mail %s was successfully sent to %s',
87
			$mailClassName,
88
			$email
89
		));
90
	}
91
92
	/**
93
	 * @param \Throwable $e
94
	 *
95
	 * @return void
96
	 */
97
	protected function logError(Throwable $e): void
98
	{
99
		$this->logger->error((string) $e);
100
	}
101
102
	/**
103
	 * @param \SixtyEightPublishers\User\ForgotPassword\Entity\PasswordRequestInterface $request
104
	 *
105
	 * @return void
106
	 */
107
	protected function sendForgotPasswordResetEmail(PasswordRequestInterface $request): void
108
	{
109
		$this->forgotPasswordResetEmail->send($request);
110
		$this->logSentEmail($request->getUser()->getEmail(), get_class($this->forgotPasswordResetEmail));
111
	}
112
113
	/**
114
	 * @param string $email
115
	 *
116
	 * @return void
117
	 */
118
	protected function sendForgotPasswordNotRegisteredEmail(string $email): void
119
	{
120
		$this->forgotPasswordNotRegisteredEmail->send($email);
121
		$this->logSentEmail($email, get_class($this->forgotPasswordNotRegisteredEmail));
122
	}
123
}
124