Created by
Andrew Stark
| <?php
declare(strict_types = 1);
use Doctrine\Common\Persistence\Mapping\MappingException;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\ORMException;
use Exception;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
class DeleteUserHandler
{
/**
* @var UserRepositoryInterface
*/
private $userRepository;
/**
* @var LoggerInterface
*/
private $logger;
/**
* @var EventDispatcherInterface
*/
private $eventDispatcher;
/**
* @var EntityManagerInterface
*/
private $entityManager;
/**
* DeleteUserHandler constructor.
*
* @param UserRepositoryInterface $userRepository
* @param LoggerInterface $logger
* @param EntityManagerInterface $entityManager
* @param EventDispatcherInterface $eventDispatcher
*/
public function __construct(
UserRepositoryInterface $userRepository,
LoggerInterface $logger,
EntityManagerInterface $entityManager,
EventDispatcherInterface $eventDispatcher)
{
$this->userRepository = $userRepository;
$this->logger = $logger;
$this->eventDispatcher = $eventDispatcher;
$this->entityManager = $entityManager;
}
/**
* @param DeleteUser $command
*/
public function handle(DeleteUser $command) : void
{
$this->entityManager->transactional(
function($em) use ($command) {
$filter = new UserFilter();
$filter->setUuid($command->toUuid());
try {
$user = $this->userRepository->single($filter);
} catch (UserNotFoundException $exception) {
$this->logger->error(
'EXCEPTION: Deleting User with uuid ' . $command->toUuid() .
'Failed. No such record in database.'
);
}
try {
$this->userRepository->delete($user);
$userDeleted = true;
} catch (MappingException | ORMException | Exception $exception) {
$userDeleted = false;
$this->logger->error(
'EXCEPTION: Deleting User with email ' . $user->toEmail()->email() .
'. Message: ' . $exception->getMessage()
);
}
if ($userDeleted) {
$this->logger->info('User with email: ' . $user->toEmail()->email() . ' was deleted.');
$this->eventDispatcher->dispatch('user.deleted');
}
}
);
}
}
|