<?php
namespace Postroyka\AccountBundle\EventListener;
use Doctrine\ORM\EntityManagerInterface;
use Postroyka\ApiBundle\RabbitMQ\B24\Producers\B24ExportUserProducer;
use Submarine\ConfirmationBundle\Event\ConfirmEvent;
use Submarine\UsersBundle\Entity\User;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
class RestorePasswordListener
{
/**
* @param EntityManagerInterface $entityManager
* @param EncoderFactoryInterface $encoderFactory
* @param TokenStorageInterface $tokenStorage
* @param SessionInterface $session
*/
public function __construct(
private EntityManagerInterface $entityManager,
private EncoderFactoryInterface $encoderFactory,
private TokenStorageInterface $tokenStorage,
private SessionInterface $session,
private B24ExportUserProducer $b24ExportUserProducer
)
{}
/**
* @param ConfirmEvent $event
*/
public function onAccountRestorePassword(ConfirmEvent $event)
{
$data = $event->getConfirmCode()->getData();
$user = $this->entityManager->getRepository(User::class)->findOneByEmail($data['email']);
if (!$user) {
return;
}
$encoder = $this->encoderFactory->getEncoder($user);
$passHash = $encoder->encodePassword($data['password'], $user->getSalt());
$user->setPassword($passHash);
$this->entityManager->flush($user);
$this->b24ExportUserProducer->exportUser($user);
//Auto login
$token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
$this->tokenStorage->setToken($token);
$this->session->set('_security_main', serialize($token));
}
}