Refactor unsubscribes tracker to doctrine

[MAILPOET-2736]
This commit is contained in:
Rostislav Wolny
2020-04-30 21:41:57 +02:00
committed by Veljko V
parent 4189b11054
commit 78f055b7aa
6 changed files with 91 additions and 15 deletions

View File

@ -215,6 +215,8 @@ class ContainerConfigurator implements IContainerConfigurator {
$container->autowire(\MailPoet\Statistics\Track\Clicks::class); $container->autowire(\MailPoet\Statistics\Track\Clicks::class);
$container->autowire(\MailPoet\Statistics\Track\Opens::class); $container->autowire(\MailPoet\Statistics\Track\Opens::class);
$container->autowire(\MailPoet\Statistics\Track\WooCommercePurchases::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) $container->autowire(\MailPoet\Router\Router::class)
->setArgument('$container', new Reference(ContainerWrapper::class)); ->setArgument('$container', new Reference(ContainerWrapper::class));
// Mailer // Mailer
@ -265,6 +267,7 @@ class ContainerConfigurator implements IContainerConfigurator {
$container->autowire(\MailPoet\Newsletter\Statistics\NewsletterStatisticsRepository::class); $container->autowire(\MailPoet\Newsletter\Statistics\NewsletterStatisticsRepository::class);
$container->autowire(\MailPoet\Newsletter\Scheduler\WelcomeScheduler::class)->setPublic(true); $container->autowire(\MailPoet\Newsletter\Scheduler\WelcomeScheduler::class)->setPublic(true);
$container->autowire(\MailPoet\Newsletter\Scheduler\PostNotificationScheduler::class); $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\ViewInBrowserController::class)->setPublic(true);
$container->autowire(\MailPoet\Newsletter\ViewInBrowser\ViewInBrowserRenderer::class)->setPublic(true); $container->autowire(\MailPoet\Newsletter\ViewInBrowser\ViewInBrowserRenderer::class)->setPublic(true);
// Newsletter templates // Newsletter templates

View File

@ -36,6 +36,16 @@ class StatisticsUnsubscribeEntity {
*/ */
private $subscriberId; private $subscriberId;
public function __construct(
NewsletterEntity $newsletter,
SendingQueueEntity $queue,
int $subscriberId
) {
$this->newsletter = $newsletter;
$this->queue = $queue;
$this->subscriberId = $subscriberId;
}
/** /**
* @return NewsletterEntity|null * @return NewsletterEntity|null
*/ */

View File

@ -0,0 +1,19 @@
<?php
namespace MailPoet\Newsletter\Sending;
use MailPoet\Doctrine\Repository;
use MailPoet\Entities\SendingQueueEntity;
/**
* @method SendingQueueEntity[] findBy(array $criteria, array $orderBy = null, int $limit = null, int $offset = null)
* @method SendingQueueEntity|null findOneBy(array $criteria, array $orderBy = null)
* @method SendingQueueEntity|null findOneById(mixed $id)
* @method void persist(SendingQueueEntity $entity)
* @method void remove(SendingQueueEntity $entity)
*/
class SendingQueuesRepository extends Repository {
protected function getEntityClassName() {
return SendingQueueEntity::class;
}
}

View File

@ -0,0 +1,19 @@
<?php
namespace MailPoet\Statistics;
use MailPoet\Doctrine\Repository;
use MailPoet\Entities\StatisticsUnsubscribeEntity;
/**
* @method StatisticsUnsubscribeEntity[] findBy(array $criteria, array $orderBy = null, int $limit = null, int $offset = null)
* @method StatisticsUnsubscribeEntity|null findOneBy(array $criteria, array $orderBy = null)
* @method StatisticsUnsubscribeEntity|null findOneById(mixed $id)
* @method void persist(StatisticsUnsubscribeEntity $entity)
* @method void remove(StatisticsUnsubscribeEntity $entity)
*/
class StatisticsUnsubscribesRepository extends Repository {
protected function getEntityClassName() {
return StatisticsUnsubscribeEntity::class;
}
}

View File

@ -2,20 +2,44 @@
namespace MailPoet\Statistics\Track; namespace MailPoet\Statistics\Track;
use MailPoet\Models\StatisticsUnsubscribes; use MailPoet\Entities\StatisticsUnsubscribeEntity;
use MailPoet\Newsletter\Sending\SendingQueuesRepository;
use MailPoet\Statistics\StatisticsUnsubscribesRepository;
class Unsubscribes { class Unsubscribes {
public function track($newsletterId, $subscriberId, $queueId) { /** @var SendingQueuesRepository */
$statistics = StatisticsUnsubscribes::where('subscriber_id', $subscriberId) private $sendingQueuesRepository;
->where('newsletter_id', $newsletterId)
->where('queue_id', $queueId) /** @var StatisticsUnsubscribesRepository */
->findOne(); 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) { if (!$statistics) {
$statistics = StatisticsUnsubscribes::create(); $statistics = new StatisticsUnsubscribeEntity($newsletter, $queue, $subscriberId);
$statistics->newsletterId = $newsletterId; $this->statisticsUnsubscribesRepository->persist($statistics);
$statistics->subscriberId = $subscriberId; $this->statisticsUnsubscribesRepository->flush();
$statistics->queueId = $queueId;
$statistics->save();
} }
} }
} }

View File

@ -2,6 +2,7 @@
namespace MailPoet\Test\Statistics\Track; namespace MailPoet\Test\Statistics\Track;
use MailPoet\DI\ContainerWrapper;
use MailPoet\Models\Newsletter; use MailPoet\Models\Newsletter;
use MailPoet\Models\SendingQueue; use MailPoet\Models\SendingQueue;
use MailPoet\Models\StatisticsUnsubscribes; use MailPoet\Models\StatisticsUnsubscribes;
@ -11,7 +12,9 @@ use MailPoet\Tasks\Sending as SendingTask;
use MailPoetVendor\Idiorm\ORM; use MailPoetVendor\Idiorm\ORM;
class UnsubscribesTest extends \MailPoetTest { class UnsubscribesTest extends \MailPoetTest {
public $unsubscribes; /** @var Unsubscribes */
private $unsubscribes;
public $queue; public $queue;
public $subscriber; public $subscriber;
public $newsletter; public $newsletter;
@ -35,12 +38,11 @@ class UnsubscribesTest extends \MailPoetTest {
$queue->updateProcessedSubscribers([$subscriber->id]); $queue->updateProcessedSubscribers([$subscriber->id]);
$this->queue = $queue->save(); $this->queue = $queue->save();
// instantiate class // instantiate class
$this->unsubscribes = new Unsubscribes(); $this->unsubscribes = ContainerWrapper::getInstance()->get(Unsubscribes::class);
} }
public function testItTracksUnsubscribeEvent() { public function testItTracksUnsubscribeEvent() {
$this->unsubscribes->track( $this->unsubscribes->track(
$this->newsletter->id,
$this->subscriber->id, $this->subscriber->id,
$this->queue->id $this->queue->id
); );
@ -50,7 +52,6 @@ class UnsubscribesTest extends \MailPoetTest {
public function testItDoesNotTrackRepeatedUnsubscribeEvents() { public function testItDoesNotTrackRepeatedUnsubscribeEvents() {
for ($count = 0; $count <= 2; $count++) { for ($count = 0; $count <= 2; $count++) {
$this->unsubscribes->track( $this->unsubscribes->track(
$this->newsletter->id,
$this->subscriber->id, $this->subscriber->id,
$this->queue->id $this->queue->id
); );