diff --git a/lib/DI/ContainerConfigurator.php b/lib/DI/ContainerConfigurator.php index 63593bd319..63a7672c07 100644 --- a/lib/DI/ContainerConfigurator.php +++ b/lib/DI/ContainerConfigurator.php @@ -215,6 +215,8 @@ class ContainerConfigurator implements IContainerConfigurator { $container->autowire(\MailPoet\Statistics\Track\Clicks::class); $container->autowire(\MailPoet\Statistics\Track\Opens::class); $container->autowire(\MailPoet\Statistics\Track\WooCommercePurchases::class); + $container->autowire(\MailPoet\Statistics\Track\Unsubscribes::class)->setPublic(true); + $container->autowire(\MailPoet\Statistics\StatisticsUnsubscribesRepository::class); $container->autowire(\MailPoet\Router\Router::class) ->setArgument('$container', new Reference(ContainerWrapper::class)); // Mailer @@ -265,6 +267,7 @@ class ContainerConfigurator implements IContainerConfigurator { $container->autowire(\MailPoet\Newsletter\Statistics\NewsletterStatisticsRepository::class); $container->autowire(\MailPoet\Newsletter\Scheduler\WelcomeScheduler::class)->setPublic(true); $container->autowire(\MailPoet\Newsletter\Scheduler\PostNotificationScheduler::class); + $container->autowire(\MailPoet\Newsletter\Sending\SendingQueuesRepository::class); $container->autowire(\MailPoet\Newsletter\ViewInBrowser\ViewInBrowserController::class)->setPublic(true); $container->autowire(\MailPoet\Newsletter\ViewInBrowser\ViewInBrowserRenderer::class)->setPublic(true); // Newsletter templates diff --git a/lib/Entities/StatisticsUnsubscribeEntity.php b/lib/Entities/StatisticsUnsubscribeEntity.php index 8b7e7b963e..40b9d890ec 100644 --- a/lib/Entities/StatisticsUnsubscribeEntity.php +++ b/lib/Entities/StatisticsUnsubscribeEntity.php @@ -36,6 +36,16 @@ class StatisticsUnsubscribeEntity { */ private $subscriberId; + public function __construct( + NewsletterEntity $newsletter, + SendingQueueEntity $queue, + int $subscriberId + ) { + $this->newsletter = $newsletter; + $this->queue = $queue; + $this->subscriberId = $subscriberId; + } + /** * @return NewsletterEntity|null */ diff --git a/lib/Newsletter/Sending/SendingQueuesRepository.php b/lib/Newsletter/Sending/SendingQueuesRepository.php new file mode 100644 index 0000000000..c138f81366 --- /dev/null +++ b/lib/Newsletter/Sending/SendingQueuesRepository.php @@ -0,0 +1,19 @@ +where('newsletter_id', $newsletterId) - ->where('queue_id', $queueId) - ->findOne(); + /** @var SendingQueuesRepository */ + private $sendingQueuesRepository; + + /** @var StatisticsUnsubscribesRepository */ + private $statisticsUnsubscribesRepository; + + public function __construct( + SendingQueuesRepository $sendingQueuesRepository, + StatisticsUnsubscribesRepository $statisticsUnsubscribesRepository + ) { + $this->sendingQueuesRepository = $sendingQueuesRepository; + $this->statisticsUnsubscribesRepository = $statisticsUnsubscribesRepository; + } + + public function track(int $subscriberId, int $queueId) { + $queue = $this->sendingQueuesRepository->findOneById($queueId); + if ($queue === null) { + return; + } + $newsletter = $queue->getNewsletter(); + if ($newsletter === null) { + return; + } + $statistics = $this->statisticsUnsubscribesRepository->findOneBy([ + 'queue' => $queue, + 'newsletter' => $newsletter, + 'subscriberId' => $subscriberId, + ]); + if (!$statistics) { - $statistics = StatisticsUnsubscribes::create(); - $statistics->newsletterId = $newsletterId; - $statistics->subscriberId = $subscriberId; - $statistics->queueId = $queueId; - $statistics->save(); + $statistics = new StatisticsUnsubscribeEntity($newsletter, $queue, $subscriberId); + $this->statisticsUnsubscribesRepository->persist($statistics); + $this->statisticsUnsubscribesRepository->flush(); } } } diff --git a/tests/integration/Statistics/Track/UnsubscribesTest.php b/tests/integration/Statistics/Track/UnsubscribesTest.php index 238a440e75..3f7e18e18a 100644 --- a/tests/integration/Statistics/Track/UnsubscribesTest.php +++ b/tests/integration/Statistics/Track/UnsubscribesTest.php @@ -2,6 +2,7 @@ namespace MailPoet\Test\Statistics\Track; +use MailPoet\DI\ContainerWrapper; use MailPoet\Models\Newsletter; use MailPoet\Models\SendingQueue; use MailPoet\Models\StatisticsUnsubscribes; @@ -11,7 +12,9 @@ use MailPoet\Tasks\Sending as SendingTask; use MailPoetVendor\Idiorm\ORM; class UnsubscribesTest extends \MailPoetTest { - public $unsubscribes; + /** @var Unsubscribes */ + private $unsubscribes; + public $queue; public $subscriber; public $newsletter; @@ -35,12 +38,11 @@ class UnsubscribesTest extends \MailPoetTest { $queue->updateProcessedSubscribers([$subscriber->id]); $this->queue = $queue->save(); // instantiate class - $this->unsubscribes = new Unsubscribes(); + $this->unsubscribes = ContainerWrapper::getInstance()->get(Unsubscribes::class); } public function testItTracksUnsubscribeEvent() { $this->unsubscribes->track( - $this->newsletter->id, $this->subscriber->id, $this->queue->id ); @@ -50,7 +52,6 @@ class UnsubscribesTest extends \MailPoetTest { public function testItDoesNotTrackRepeatedUnsubscribeEvents() { for ($count = 0; $count <= 2; $count++) { $this->unsubscribes->track( - $this->newsletter->id, $this->subscriber->id, $this->queue->id );