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\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

View File

@ -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
*/

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;
use MailPoet\Models\StatisticsUnsubscribes;
use MailPoet\Entities\StatisticsUnsubscribeEntity;
use MailPoet\Newsletter\Sending\SendingQueuesRepository;
use MailPoet\Statistics\StatisticsUnsubscribesRepository;
class Unsubscribes {
public function track($newsletterId, $subscriberId, $queueId) {
$statistics = StatisticsUnsubscribes::where('subscriber_id', $subscriberId)
->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();
}
}
}

View File

@ -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
);