/
Handler.php
executable file
·88 lines (76 loc) · 2.24 KB
/
Handler.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
<?php
declare(strict_types=1);
namespace Myks92\User\Model\User\Command\ChangeEmail\Request;
use DateTimeImmutable;
use Doctrine\ORM\NonUniqueResultException;
use Doctrine\ORM\NoResultException;
use DomainException;
use Exception;
use Myks92\User\Model\FlusherInterface;
use Myks92\User\Model\User\Entity\User\Email;
use Myks92\User\Model\User\Entity\User\Id;
use Myks92\User\Model\User\Entity\User\UserRepositoryInterface;
use Myks92\User\Model\User\Service\NewEmailConfirmTokenSenderInterface;
use Myks92\User\Model\User\Service\TokenizerInterface;
/**
* @author Maxim Vorozhtsov <myks1992@mail.ru>
*/
class Handler
{
/**
* @var UserRepositoryInterface
*/
private UserRepositoryInterface $users;
/**
* @var TokenizerInterface
*/
private TokenizerInterface $tokenizer;
/**
* @var NewEmailConfirmTokenSenderInterface
*/
private NewEmailConfirmTokenSenderInterface $sender;
/**
* @var FlusherInterface
*/
private FlusherInterface $flusher;
/**
* @param UserRepositoryInterface $users
* @param TokenizerInterface $tokenizer
* @param NewEmailConfirmTokenSenderInterface $sender
* @param FlusherInterface $flusher
*/
public function __construct(
UserRepositoryInterface $users,
TokenizerInterface $tokenizer,
NewEmailConfirmTokenSenderInterface $sender,
FlusherInterface $flusher
) {
$this->users = $users;
$this->tokenizer = $tokenizer;
$this->sender = $sender;
$this->flusher = $flusher;
}
/**
* @param Command $command
*
* @throws Exception
* @throws NoResultException
* @throws NonUniqueResultException
*/
public function handle(Command $command): void
{
$user = $this->users->get(new Id($command->id));
$email = new Email($command->email);
if ($this->users->hasByEmail($email)) {
throw new DomainException('ChangeEmail is already in use.');
}
$date = new DateTimeImmutable();
$user->requestEmailChanging(
$token = $this->tokenizer->generate($date),
$date,
$email
);
$this->flusher->flush();
$this->sender->send($email, $token);
}
}