Completed
Pull Request — master (#2)
by Tomáš
09:22
created

PasswordRequestFactory::create()   A

Complexity

Conditions 4
Paths 7

Size

Total Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 19
rs 9.6333
c 0
b 0
f 0
cc 4
nc 7
nop 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace SixtyEightPublishers\User\ForgotPassword\PasswordRequest;
6
7
use Nette;
8
use Doctrine;
9
use SixtyEightPublishers;
10
11
class PasswordRequestFactory implements IPasswordRequestFactory
12
{
13
	use Nette\SmartObject;
14
15
	/** @var \Doctrine\ORM\EntityManagerInterface  */
16
	private $em;
17
18
	/** @var \SixtyEightPublishers\DoctrinePersistence\Transaction\ITransactionFactory  */
19
	private $transactionFactory;
20
21
	/** @var \SixtyEightPublishers\User\ForgotPassword\Query\IGetUserByEmailQueryFactory  */
22
	private $getUserByEmailQueryFactory;
23
24
	/** @var \SixtyEightPublishers\User\ForgotPassword\Query\ICancelPasswordRequestsByUserQueryFactory  */
25
	private $cancelPasswordRequestsByUserQueryFactory;
26
27
	/**
28
	 * @param \Doctrine\ORM\EntityManagerInterface                                                      $em
29
	 * @param \SixtyEightPublishers\DoctrinePersistence\Transaction\ITransactionFactory                 $transactionFactory
30
	 * @param \SixtyEightPublishers\User\ForgotPassword\Query\IGetUserByEmailQueryFactory               $getUserByEmailQueryFactory
31
	 * @param \SixtyEightPublishers\User\ForgotPassword\Query\ICancelPasswordRequestsByUserQueryFactory $cancelPasswordRequestsByUserQueryFactory
32
	 */
33
	public function __construct(
34
		Doctrine\ORM\EntityManagerInterface $em,
35
		SixtyEightPublishers\DoctrinePersistence\Transaction\ITransactionFactory $transactionFactory,
36
		SixtyEightPublishers\User\ForgotPassword\Query\IGetUserByEmailQueryFactory $getUserByEmailQueryFactory,
37
		SixtyEightPublishers\User\ForgotPassword\Query\ICancelPasswordRequestsByUserQueryFactory $cancelPasswordRequestsByUserQueryFactory
38
	) {
39
		$this->em = $em;
40
		$this->transactionFactory = $transactionFactory;
41
		$this->getUserByEmailQueryFactory = $getUserByEmailQueryFactory;
42
		$this->cancelPasswordRequestsByUserQueryFactory = $cancelPasswordRequestsByUserQueryFactory;
43
	}
44
45
	/**
46
	 * @param \SixtyEightPublishers\User\ForgotPassword\DoctrineEntity\IUser $user
47
	 *
48
	 * @return \SixtyEightPublishers\User\ForgotPassword\DoctrineEntity\IPasswordRequest
49
	 */
50
	protected function createPasswordRequestEntity(SixtyEightPublishers\User\ForgotPassword\DoctrineEntity\IUser $user): SixtyEightPublishers\User\ForgotPassword\DoctrineEntity\IPasswordRequest
51
	{
52
		return new SixtyEightPublishers\User\ForgotPassword\DoctrineEntity\PasswordRequest($user);
53
	}
54
55
	/**
56
	 * @param \SixtyEightPublishers\User\ForgotPassword\DoctrineEntity\IUser $user
57
	 *
58
	 * @return \SixtyEightPublishers\User\ForgotPassword\DoctrineEntity\IPasswordRequest
59
	 */
60
	private function getRequest(SixtyEightPublishers\User\ForgotPassword\DoctrineEntity\IUser $user): SixtyEightPublishers\User\ForgotPassword\DoctrineEntity\IPasswordRequest
61
	{
62
		$transaction = $this->transactionFactory->create(function (Doctrine\ORM\EntityManagerInterface $em, SixtyEightPublishers\User\ForgotPassword\DoctrineEntity\IUser $user) {
63
			$request = $this->createPasswordRequestEntity($user);
64
65
			$this->cancelPasswordRequestsByUserQueryFactory->create($em, $user)->execute();
66
67
			$request->getRequestDeviceInfo()->fill();
68
			$em->persist($request);
69
70
			return $request;
71
		});
72
73
		return $transaction->run($user);
74
	}
75
76
	/*********** interface \SixtyEightPublishers\User\ForgotPassword\IPasswordRequestFactory ***********/
77
78
	/**
79
	 * {@inheritdoc}
80
	 */
81
	public function create(string $email): SixtyEightPublishers\User\ForgotPassword\DoctrineEntity\IPasswordRequest
82
	{
83
		try {
84
			/** @var NULL|\SixtyEightPublishers\User\ForgotPassword\DoctrineEntity\IUser $user */
85
			$user = $this->getUserByEmailQueryFactory->create($this->em, $email)->getOneOrNullResult();
86
87
			if (NULL === $user) {
88
				throw SixtyEightPublishers\User\ForgotPassword\Exception\PasswordRequestCreationException::notRegisteredEmail($email);
89
			}
90
91
			return $this->getRequest($user);
92
		} catch (\Throwable $e) {
93
			if (!$e instanceof SixtyEightPublishers\User\ForgotPassword\Exception\PasswordRequestCreationException) {
94
				$e = new SixtyEightPublishers\User\ForgotPassword\Exception\PasswordRequestCreationException($e->getMessage(), $e->getCode(), $e);
95
			}
96
97
			throw $e;
98
		}
99
	}
100
}
101