[User] Synchronize User::usernameCanonical with Customer::emailCanonical

This commit is contained in:
Kamil Kokot 2016-06-23 16:12:31 +02:00
parent 1d26b86f04
commit 3a2e58e195
No known key found for this signature in database
GPG key ID: 7BD76F7054D93C89
3 changed files with 133 additions and 75 deletions

View file

@ -11,7 +11,10 @@
namespace Sylius\Bundle\UserBundle\EventListener;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Event\OnFlushEventArgs;
use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\UnitOfWork;
use Sylius\Component\User\Model\CustomerInterface;
/**
@ -19,7 +22,7 @@ use Sylius\Component\User\Model\CustomerInterface;
*
* @author Michał Marcinkowski <michal.marcinkowski@lakion.com>
*/
class DefaultUsernameORMListener
final class DefaultUsernameORMListener
{
/**
* @param OnFlushEventArgs $onFlushEventArgs
@ -29,23 +32,36 @@ class DefaultUsernameORMListener
$entityManager = $onFlushEventArgs->getEntityManager();
$unitOfWork = $entityManager->getUnitOfWork();
$entities = array_merge(
$unitOfWork->getScheduledEntityInsertions(),
$unitOfWork->getScheduledEntityUpdates()
);
$this->processEntities($unitOfWork->getScheduledEntityInsertions(), $entityManager, $unitOfWork);
$this->processEntities($unitOfWork->getScheduledEntityUpdates(), $entityManager, $unitOfWork);
}
foreach ($entities as $entity) {
if (!$entity instanceof CustomerInterface) {
/**
* @param array $entities
* @param EntityManagerInterface $entityManager
*/
private function processEntities($entities, EntityManagerInterface $entityManager, UnitOfWork $unitOfWork)
{
foreach ($entities as $customer) {
if (!$customer instanceof CustomerInterface) {
continue;
}
$user = $entity->getUser();
if (null !== $user && $entity->getEmail() !== $user->getUsername()) {
$user->setUsername($entity->getEmail());
$entityManager->persist($user);
$userMetadata = $entityManager->getClassMetadata(get_class($user));
$unitOfWork->recomputeSingleEntityChangeSet($userMetadata, $user);
$user = $customer->getUser();
if (null === $user) {
continue;
}
if ($customer->getEmail() === $user->getUsername() && $customer->getEmailCanonical() === $user->getUsernameCanonical()) {
continue;
}
$user->setUsername($customer->getEmail());
$user->setUsernameCanonical($customer->getEmailCanonical());
/** @var ClassMetadata $userMetadata */
$userMetadata = $entityManager->getClassMetadata(get_class($user));
$unitOfWork->recomputeSingleEntityChangeSet($userMetadata, $user);
}
}
}

View file

@ -15,6 +15,7 @@ use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Event\OnFlushEventArgs;
use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\UnitOfWork;
use PhpParser\Node\Arg;
use PhpSpec\ObjectBehavior;
use Prophecy\Argument;
use Sylius\Component\User\Model\CustomerInterface;
@ -27,7 +28,7 @@ class DefaultUsernameORMListenerSpec extends ObjectBehavior
$this->shouldHaveType('Sylius\Bundle\UserBundle\EventListener\DefaultUsernameORMListener');
}
function it_sets_username_on_customer_create(
function it_sets_usernames_on_customer_create(
OnFlushEventArgs $onFlushEventArgs,
EntityManager $entityManager,
UnitOfWork $unitOfWork,
@ -42,13 +43,103 @@ class DefaultUsernameORMListenerSpec extends ObjectBehavior
$unitOfWork->getScheduledEntityUpdates()->willReturn([]);
$user->getUsername()->willReturn(null);
$user->getUsernameCanonical()->willReturn(null);
$customer->getUser()->willReturn($user);
$customer->getEmail()->willReturn('customer@email.com');
$customer->getEmail()->willReturn('customer+extra@email.com');
$customer->getEmailCanonical()->willReturn('customer@email.com');
$user->setUsername('customer+extra@email.com')->shouldBeCalled();
$user->setUsernameCanonical('customer@email.com')->shouldBeCalled();
$user->setUsername('customer@email.com')->shouldBeCalled();
$entityManager->persist($user)->shouldBeCalled();
$entityManager->getClassMetadata(get_class($user->getWrappedObject()))->willReturn($userMetadata);
$unitOfWork->recomputeSingleEntityChangeSet($userMetadata, $user)->shouldBeCalled();
$this->onFlush($onFlushEventArgs);
}
function it_updates_usernames_on_customer_email_change(
OnFlushEventArgs $onFlushEventArgs,
EntityManager $entityManager,
UnitOfWork $unitOfWork,
CustomerInterface $customer,
UserInterface $user,
ClassMetadata $userMetadata
) {
$onFlushEventArgs->getEntityManager()->willReturn($entityManager);
$entityManager->getUnitOfWork()->willReturn($unitOfWork);
$unitOfWork->getScheduledEntityInsertions()->willReturn([]);
$unitOfWork->getScheduledEntityUpdates()->willReturn([$customer]);
$user->getUsername()->willReturn('user+extra@email.com');
$user->getUsernameCanonical()->willReturn('customer@email.com');
$customer->getUser()->willReturn($user);
$customer->getEmail()->willReturn('customer+extra@email.com');
$customer->getEmailCanonical()->willReturn('customer@email.com');
$user->setUsername('customer+extra@email.com')->shouldBeCalled();
$user->setUsernameCanonical('customer@email.com')->shouldBeCalled();
$entityManager->getClassMetadata(get_class($user->getWrappedObject()))->willReturn($userMetadata);
$unitOfWork->recomputeSingleEntityChangeSet($userMetadata, $user)->shouldBeCalled();
$this->onFlush($onFlushEventArgs);
}
function it_updates_usernames_on_customer_email_canonical_change(
OnFlushEventArgs $onFlushEventArgs,
EntityManager $entityManager,
UnitOfWork $unitOfWork,
CustomerInterface $customer,
UserInterface $user,
ClassMetadata $userMetadata
) {
$onFlushEventArgs->getEntityManager()->willReturn($entityManager);
$entityManager->getUnitOfWork()->willReturn($unitOfWork);
$unitOfWork->getScheduledEntityInsertions()->willReturn([]);
$unitOfWork->getScheduledEntityUpdates()->willReturn([$customer]);
$user->getUsername()->willReturn('customer+extra@email.com');
$user->getUsernameCanonical()->willReturn('user@email.com');
$customer->getUser()->willReturn($user);
$customer->getEmail()->willReturn('customer+extra@email.com');
$customer->getEmailCanonical()->willReturn('customer@email.com');
$user->setUsername('customer+extra@email.com')->shouldBeCalled();
$user->setUsernameCanonical('customer@email.com')->shouldBeCalled();
$entityManager->getClassMetadata(get_class($user->getWrappedObject()))->willReturn($userMetadata);
$unitOfWork->recomputeSingleEntityChangeSet($userMetadata, $user)->shouldBeCalled();
$this->onFlush($onFlushEventArgs);
}
function it_does_not_update_usernames_when_customer_emails_are_the_same(
OnFlushEventArgs $onFlushEventArgs,
EntityManager $entityManager,
UnitOfWork $unitOfWork,
CustomerInterface $customer,
UserInterface $user,
ClassMetadata $userMetadata
) {
$onFlushEventArgs->getEntityManager()->willReturn($entityManager);
$entityManager->getUnitOfWork()->willReturn($unitOfWork);
$unitOfWork->getScheduledEntityInsertions()->willReturn([]);
$unitOfWork->getScheduledEntityUpdates()->willReturn([$customer]);
$user->getUsername()->willReturn('customer+extra@email.com');
$user->getUsernameCanonical()->willReturn('customer@email.com');
$customer->getUser()->willReturn($user);
$customer->getEmail()->willReturn('customer+extra@email.com');
$customer->getEmailCanonical()->willReturn('customer@email.com');
$user->setUsername(Argument::any())->shouldNotBeCalled();
$user->setUsernameCanonical(Argument::any())->shouldNotBeCalled();
$unitOfWork->recomputeSingleEntityChangeSet(Argument::cetera())->shouldNotBeCalled();
$this->onFlush($onFlushEventArgs);
}
@ -65,59 +156,9 @@ class DefaultUsernameORMListenerSpec extends ObjectBehavior
$unitOfWork->getScheduledEntityUpdates()->willReturn([]);
$customer->getUser()->willReturn(null);
$customer->getEmail()->willReturn('customer@email.com');
$entityManager->persist(Argument::any())->shouldNotBeCalled();
$unitOfWork->recomputeSingleEntityChangeSet(Argument::any())->shouldNotBeCalled();
$this->onFlush($onFlushEventArgs);
}
$unitOfWork->recomputeSingleEntityChangeSet(Argument::cetera())->shouldNotBeCalled();
function it_updates_username_on_customer_email_change(
OnFlushEventArgs $onFlushEventArgs,
EntityManager $entityManager,
UnitOfWork $unitOfWork,
CustomerInterface $customer,
UserInterface $user,
ClassMetadata $userMetadata
) {
$onFlushEventArgs->getEntityManager()->willReturn($entityManager);
$entityManager->getUnitOfWork()->willReturn($unitOfWork);
$unitOfWork->getScheduledEntityInsertions()->willReturn([]);
$unitOfWork->getScheduledEntityUpdates()->willReturn([$customer]);
$user->getUsername()->willReturn('user@email.com');
$customer->getUser()->willReturn($user);
$customer->getEmail()->willReturn('customer@email.com');
$user->setUsername('customer@email.com')->shouldBeCalled();
$entityManager->persist($user)->shouldBeCalled();
$entityManager->getClassMetadata(get_class($user->getWrappedObject()))->willReturn($userMetadata);
$unitOfWork->recomputeSingleEntityChangeSet($userMetadata, $user)->shouldBeCalled();
$this->onFlush($onFlushEventArgs);
}
function it_does_not_update_username_when_customer_email_is_the_same(
OnFlushEventArgs $onFlushEventArgs,
EntityManager $entityManager,
UnitOfWork $unitOfWork,
CustomerInterface $customer,
UserInterface $user,
ClassMetadata $userMetadata
) {
$onFlushEventArgs->getEntityManager()->willReturn($entityManager);
$entityManager->getUnitOfWork()->willReturn($unitOfWork);
$unitOfWork->getScheduledEntityInsertions()->willReturn([]);
$unitOfWork->getScheduledEntityUpdates()->willReturn([$customer]);
$user->getUsername()->willReturn('customer@email.com');
$customer->getUser()->willReturn($user);
$customer->getEmail()->willReturn('customer@email.com');
$user->setUsername('customer@email.com')->shouldNotBeCalled();
$entityManager->persist($user)->shouldNotBeCalled();
$unitOfWork->recomputeSingleEntityChangeSet($userMetadata, $user)->shouldNotBeCalled();
$this->onFlush($onFlushEventArgs);
}
@ -136,12 +177,12 @@ class DefaultUsernameORMListenerSpec extends ObjectBehavior
$customer->getUser()->willReturn(null);
$customer->getEmail()->willReturn('customer@email.com');
$entityManager->persist(Argument::any())->shouldNotBeCalled();
$unitOfWork->recomputeSingleEntityChangeSet(Argument::any())->shouldNotBeCalled();
$unitOfWork->recomputeSingleEntityChangeSet(Argument::cetera())->shouldNotBeCalled();
$this->onFlush($onFlushEventArgs);
}
function it_does_nothing_when_there_are_no_customers_created(
function it_does_nothing_when_there_are_no_objects_scheduled_in_the_unit_of_work(
OnFlushEventArgs $onFlushEventArgs,
EntityManager $entityManager,
UnitOfWork $unitOfWork
@ -152,8 +193,8 @@ class DefaultUsernameORMListenerSpec extends ObjectBehavior
$unitOfWork->getScheduledEntityInsertions()->willReturn([]);
$unitOfWork->getScheduledEntityUpdates()->willReturn([]);
$entityManager->persist(Argument::any())->shouldNotBeCalled();
$unitOfWork->recomputeSingleEntityChangeSet(Argument::any())->shouldNotBeCalled();
$unitOfWork->recomputeSingleEntityChangeSet(Argument::cetera())->shouldNotBeCalled();
$this->onFlush($onFlushEventArgs);
}
@ -170,8 +211,8 @@ class DefaultUsernameORMListenerSpec extends ObjectBehavior
$unitOfWork->getScheduledEntityInsertions()->willReturn([$stdObject]);
$unitOfWork->getScheduledEntityUpdates()->willReturn([$stdObject2]);
$entityManager->persist(Argument::any())->shouldNotBeCalled();
$unitOfWork->recomputeSingleEntityChangeSet(Argument::any())->shouldNotBeCalled();
$unitOfWork->recomputeSingleEntityChangeSet(Argument::cetera())->shouldNotBeCalled();
$this->onFlush($onFlushEventArgs);
}
}

View file

@ -3,6 +3,7 @@
"user": {
"id": @integer@,
"username": "john.diggle@yahoo.com",
"username_canonical": "john.diggle@yahoo.com",
"roles": [
"ROLE_USER"
],