Add listener for updating lastSubscribedAt

[MAILPOET-3031]
This commit is contained in:
Jan Lysý
2021-03-22 19:44:12 +01:00
committed by Veljko V
parent 91b2a11643
commit fd5a9904c0
6 changed files with 87 additions and 4 deletions

View File

@ -123,6 +123,7 @@ class ContainerConfigurator implements IContainerConfigurator {
->setFactory([new Reference(\MailPoet\Doctrine\EntityManagerFactory::class), 'createEntityManager']) ->setFactory([new Reference(\MailPoet\Doctrine\EntityManagerFactory::class), 'createEntityManager'])
->setPublic(true); ->setPublic(true);
$container->autowire(\MailPoet\Doctrine\EventListeners\EmojiEncodingListener::class)->setPublic(true); $container->autowire(\MailPoet\Doctrine\EventListeners\EmojiEncodingListener::class)->setPublic(true);
$container->autowire(\MailPoet\Doctrine\EventListeners\LastSubscribedAtListener::class);
$container->autowire(\MailPoet\Doctrine\EventListeners\TimestampListener::class); $container->autowire(\MailPoet\Doctrine\EventListeners\TimestampListener::class);
$container->autowire(\MailPoet\Doctrine\EventListeners\ValidationListener::class); $container->autowire(\MailPoet\Doctrine\EventListeners\ValidationListener::class);
$container->autowire(\MailPoet\Doctrine\Validator\ValidatorFactory::class); $container->autowire(\MailPoet\Doctrine\Validator\ValidatorFactory::class);

View File

@ -3,6 +3,7 @@
namespace MailPoet\Doctrine; namespace MailPoet\Doctrine;
use MailPoet\Doctrine\EventListeners\EmojiEncodingListener; use MailPoet\Doctrine\EventListeners\EmojiEncodingListener;
use MailPoet\Doctrine\EventListeners\LastSubscribedAtListener;
use MailPoet\Doctrine\EventListeners\TimestampListener; use MailPoet\Doctrine\EventListeners\TimestampListener;
use MailPoet\Doctrine\EventListeners\ValidationListener; use MailPoet\Doctrine\EventListeners\ValidationListener;
use MailPoet\Tracy\DoctrinePanel\DoctrinePanel; use MailPoet\Tracy\DoctrinePanel\DoctrinePanel;
@ -29,18 +30,23 @@ class EntityManagerFactory {
/** @var EmojiEncodingListener */ /** @var EmojiEncodingListener */
private $emojiEncodingListener; private $emojiEncodingListener;
/** @var LastSubscribedAtListener */
private $lastSubscribedAtListener;
public function __construct( public function __construct(
Connection $connection, Connection $connection,
Configuration $configuration, Configuration $configuration,
TimestampListener $timestampListener, TimestampListener $timestampListener,
ValidationListener $validationListener, ValidationListener $validationListener,
EmojiEncodingListener $emojiEncodingListener EmojiEncodingListener $emojiEncodingListener,
LastSubscribedAtListener $lastSubscribedAtListener
) { ) {
$this->connection = $connection; $this->connection = $connection;
$this->configuration = $configuration; $this->configuration = $configuration;
$this->timestampListener = $timestampListener; $this->timestampListener = $timestampListener;
$this->validationListener = $validationListener; $this->validationListener = $validationListener;
$this->emojiEncodingListener = $emojiEncodingListener; $this->emojiEncodingListener = $emojiEncodingListener;
$this->lastSubscribedAtListener = $lastSubscribedAtListener;
} }
public function createEntityManager() { public function createEntityManager() {
@ -67,5 +73,10 @@ class EntityManagerFactory {
[Events::prePersist, Events::preUpdate], [Events::prePersist, Events::preUpdate],
$this->emojiEncodingListener $this->emojiEncodingListener
); );
$entityManager->getEventManager()->addEventListener(
[Events::prePersist, Events::preUpdate],
$this->lastSubscribedAtListener
);
} }
} }

View File

@ -0,0 +1,44 @@
<?php
namespace MailPoet\Doctrine\EventListeners;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\WP\Functions as WPFunctions;
use MailPoetVendor\Carbon\Carbon;
use MailPoetVendor\Doctrine\ORM\Event\LifecycleEventArgs;
class LastSubscribedAtListener {
/** @var Carbon */
private $now;
public function __construct(WPFunctions $wp) {
$this->now = Carbon::createFromTimestamp($wp->currentTime('timestamp'));
}
public function prePersist(LifecycleEventArgs $eventArgs): void {
$entity = $eventArgs->getEntity();
if ($entity instanceof SubscriberEntity && $entity->getStatus() === SubscriberEntity::STATUS_SUBSCRIBED) {
$entity->setLastSubscribedAt($this->now);
}
}
public function preUpdate(LifecycleEventArgs $eventArgs): void {
$entity = $eventArgs->getEntity();
if (!$entity instanceof SubscriberEntity) {
return;
}
$unitOfWork = $eventArgs->getEntityManager()->getUnitOfWork();
$changeSet = $unitOfWork->getEntityChangeSet($entity);
if (!isset($changeSet['status'])) {
return;
}
[$oldStatus, $newStatus] = $changeSet['status'];
// Update last_subscribed_at when status changes to subscribed
if ($oldStatus !== SubscriberEntity::STATUS_SUBSCRIBED && $newStatus === SubscriberEntity::STATUS_SUBSCRIBED) {
$entity->setLastSubscribedAt($this->now);
}
}
}

View File

@ -6,6 +6,7 @@ use MailPoet\Doctrine\Annotations\AnnotationReaderProvider;
use MailPoet\Doctrine\ConfigurationFactory; use MailPoet\Doctrine\ConfigurationFactory;
use MailPoet\Doctrine\EntityManagerFactory; use MailPoet\Doctrine\EntityManagerFactory;
use MailPoet\Doctrine\EventListeners\EmojiEncodingListener; use MailPoet\Doctrine\EventListeners\EmojiEncodingListener;
use MailPoet\Doctrine\EventListeners\LastSubscribedAtListener;
use MailPoet\Doctrine\EventListeners\TimestampListener; use MailPoet\Doctrine\EventListeners\TimestampListener;
use MailPoet\Doctrine\EventListeners\ValidationListener; use MailPoet\Doctrine\EventListeners\ValidationListener;
use MailPoet\Doctrine\Validator\ValidatorFactory; use MailPoet\Doctrine\Validator\ValidatorFactory;
@ -94,7 +95,15 @@ class TimestampListenerTest extends \MailPoetTest {
$timestampListener = new TimestampListener($this->wp); $timestampListener = new TimestampListener($this->wp);
$validationListener = new ValidationListener($validatorFactory->createValidator()); $validationListener = new ValidationListener($validatorFactory->createValidator());
$emojiEncodingListener = new EmojiEncodingListener(new Emoji($this->wp)); $emojiEncodingListener = new EmojiEncodingListener(new Emoji($this->wp));
$entityManagerFactory = new EntityManagerFactory($this->connection, $configuration, $timestampListener, $validationListener, $emojiEncodingListener); $lastSubscribedAtListener = new LastSubscribedAtListener($this->wp);
$entityManagerFactory = new EntityManagerFactory(
$this->connection,
$configuration,
$timestampListener,
$validationListener,
$emojiEncodingListener,
$lastSubscribedAtListener
);
return $entityManagerFactory->createEntityManager(); return $entityManagerFactory->createEntityManager();
} }
} }

View File

@ -6,6 +6,7 @@ use MailPoet\Doctrine\Annotations\AnnotationReaderProvider;
use MailPoet\Doctrine\ConfigurationFactory; use MailPoet\Doctrine\ConfigurationFactory;
use MailPoet\Doctrine\EntityManagerFactory; use MailPoet\Doctrine\EntityManagerFactory;
use MailPoet\Doctrine\EventListeners\EmojiEncodingListener; use MailPoet\Doctrine\EventListeners\EmojiEncodingListener;
use MailPoet\Doctrine\EventListeners\LastSubscribedAtListener;
use MailPoet\Doctrine\EventListeners\TimestampListener; use MailPoet\Doctrine\EventListeners\TimestampListener;
use MailPoet\Doctrine\EventListeners\ValidationListener; use MailPoet\Doctrine\EventListeners\ValidationListener;
use MailPoet\Doctrine\Validator\ValidationException; use MailPoet\Doctrine\Validator\ValidationException;
@ -78,7 +79,15 @@ class ValidationTest extends \MailPoetTest {
$timestampListener = new TimestampListener($this->wp); $timestampListener = new TimestampListener($this->wp);
$validationListener = new ValidationListener($validatorFactory->createValidator()); $validationListener = new ValidationListener($validatorFactory->createValidator());
$emojiEncodingListener = new EmojiEncodingListener(new Emoji($this->wp)); $emojiEncodingListener = new EmojiEncodingListener(new Emoji($this->wp));
$entityManagerFactory = new EntityManagerFactory($this->connection, $configuration, $timestampListener, $validationListener, $emojiEncodingListener); $lastSubscribedAtListener = new LastSubscribedAtListener($this->wp);
$entityManagerFactory = new EntityManagerFactory(
$this->connection,
$configuration,
$timestampListener,
$validationListener,
$emojiEncodingListener,
$lastSubscribedAtListener
);
return $entityManagerFactory->createEntityManager(); return $entityManagerFactory->createEntityManager();
} }
} }

View File

@ -7,6 +7,7 @@ use MailPoet\Doctrine\Annotations\AnnotationReaderProvider;
use MailPoet\Doctrine\ConfigurationFactory; use MailPoet\Doctrine\ConfigurationFactory;
use MailPoet\Doctrine\EntityManagerFactory; use MailPoet\Doctrine\EntityManagerFactory;
use MailPoet\Doctrine\EventListeners\EmojiEncodingListener; use MailPoet\Doctrine\EventListeners\EmojiEncodingListener;
use MailPoet\Doctrine\EventListeners\LastSubscribedAtListener;
use MailPoet\Doctrine\EventListeners\TimestampListener; use MailPoet\Doctrine\EventListeners\TimestampListener;
use MailPoet\Doctrine\EventListeners\ValidationListener; use MailPoet\Doctrine\EventListeners\ValidationListener;
use MailPoet\Doctrine\Validator\ValidatorFactory; use MailPoet\Doctrine\Validator\ValidatorFactory;
@ -186,7 +187,15 @@ class JsonTypesTest extends \MailPoetTest {
$timestampListener = new TimestampListener($this->wp); $timestampListener = new TimestampListener($this->wp);
$validationListener = new ValidationListener($validatorFactory->createValidator()); $validationListener = new ValidationListener($validatorFactory->createValidator());
$emojiEncodingListener = new EmojiEncodingListener(new Emoji($this->wp)); $emojiEncodingListener = new EmojiEncodingListener(new Emoji($this->wp));
$entityManagerFactory = new EntityManagerFactory($this->connection, $configuration, $timestampListener, $validationListener, $emojiEncodingListener); $lastSubscribedAtListener = new LastSubscribedAtListener($this->wp);
$entityManagerFactory = new EntityManagerFactory(
$this->connection,
$configuration,
$timestampListener,
$validationListener,
$emojiEncodingListener,
$lastSubscribedAtListener
);
return $entityManagerFactory->createEntityManager(); return $entityManagerFactory->createEntityManager();
} }
} }