Refactor click tracking to Doctrine

[MAILPOET-3735]
This commit is contained in:
Pavel Dohnal
2021-08-17 13:51:26 +02:00
committed by Veljko V
parent 7197be3116
commit 0b675680ef
5 changed files with 64 additions and 27 deletions

View File

@@ -237,6 +237,7 @@ class ContainerConfigurator implements IContainerConfigurator {
$container->autowire(\MailPoet\Statistics\Track\WooCommercePurchases::class);
$container->autowire(\MailPoet\Statistics\Track\Unsubscribes::class)->setPublic(true);
$container->autowire(\MailPoet\Statistics\StatisticsFormsRepository::class)->setPublic(true);
$container->autowire(\MailPoet\Statistics\StatisticsClicksRepository::class)->setPublic(true);
$container->autowire(\MailPoet\Statistics\StatisticsOpensRepository::class)->setPublic(true);
$container->autowire(\MailPoet\Statistics\StatisticsUnsubscribesRepository::class);
$container->autowire(\MailPoet\Statistics\StatisticsWooCommercePurchasesRepository::class)->setPublic(true);

View File

@@ -14,25 +14,6 @@ use DateTimeInterface;
class StatisticsClicks extends Model {
public static $_table = MP_STATISTICS_CLICKS_TABLE; // phpcs:ignore PSR2.Classes.PropertyDeclaration
public static function createOrUpdateClickCount($linkId, $subscriberId, $newsletterId, $queueId) {
$statistics = self::where('link_id', $linkId)
->where('subscriber_id', $subscriberId)
->where('newsletter_id', $newsletterId)
->where('queue_id', $queueId)
->findOne();
if (!$statistics instanceof self) {
$statistics = self::create();
$statistics->linkId = $linkId;
$statistics->subscriberId = $subscriberId;
$statistics->newsletterId = $newsletterId;
$statistics->queueId = $queueId;
$statistics->count = 1;
} else {
$statistics->count++;
}
return $statistics->save();
}
public static function getAllForSubscriber(Subscriber $subscriber) {
return static::tableAlias('clicks')
->select('clicks.id', 'id')

View File

@@ -0,0 +1,40 @@
<?php declare(strict_types=1);
namespace MailPoet\Statistics;
use MailPoet\Doctrine\Repository;
use MailPoet\Entities\NewsletterEntity;
use MailPoet\Entities\NewsletterLinkEntity;
use MailPoet\Entities\SendingQueueEntity;
use MailPoet\Entities\StatisticsClickEntity;
use MailPoet\Entities\SubscriberEntity;
/**
* @extends Repository<StatisticsClickEntity>
*/
class StatisticsClicksRepository extends Repository {
protected function getEntityClassName(): string {
return StatisticsClickEntity::class;
}
public function createOrUpdateClickCount(
NewsletterLinkEntity $link,
SubscriberEntity $subscriber,
NewsletterEntity $newsletter,
SendingQueueEntity $queue
): StatisticsClickEntity {
$statistics = $this->findOneBy([
'link' => $link,
'newsletter' => $newsletter,
'subscriber' => $subscriber,
'queue' => $queue,
]);
if (!$statistics instanceof StatisticsClickEntity) {
$statistics = new StatisticsClickEntity($newsletter, $queue, $subscriber, $link, 1);
$this->persist($statistics);
} else {
$statistics->setCount($statistics->getCount() + 1);
}
return $statistics;
}
}

View File

@@ -5,11 +5,12 @@ namespace MailPoet\Statistics\Track;
use MailPoet\Entities\NewsletterEntity;
use MailPoet\Entities\NewsletterLinkEntity;
use MailPoet\Entities\SendingQueueEntity;
use MailPoet\Entities\StatisticsClickEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Models\StatisticsClicks;
use MailPoet\Newsletter\Shortcodes\Categories\Link as LinkShortcodeCategory;
use MailPoet\Newsletter\Shortcodes\Shortcodes;
use MailPoet\Settings\SettingsController;
use MailPoet\Statistics\StatisticsClicksRepository;
use MailPoet\Util\Cookies;
use MailPoet\WP\Functions as WPFunctions;
@@ -36,11 +37,15 @@ class Clicks {
/** @var Opens */
private $opens;
/** @var StatisticsClicksRepository */
private $statisticsClicksRepository;
public function __construct(
SettingsController $settingsController,
Cookies $cookies,
Shortcodes $shortcodes,
Opens $opens,
StatisticsClicksRepository $statisticsClicksRepository,
LinkShortcodeCategory $linkShortcodeCategory
) {
$this->settingsController = $settingsController;
@@ -48,6 +53,7 @@ class Clicks {
$this->shortcodes = $shortcodes;
$this->linkShortcodeCategory = $linkShortcodeCategory;
$this->opens = $opens;
$this->statisticsClicksRepository = $statisticsClicksRepository;
}
/**
@@ -69,12 +75,13 @@ class Clicks {
// log statistics only if the action did not come from
// a WP user previewing the newsletter
if (!$wpUserPreview) {
$statisticsClicks = StatisticsClicks::createOrUpdateClickCount(
$link->getId(),
$subscriber->getId(),
$newsletter->getId(),
$queue->getId()
$statisticsClicks = $this->statisticsClicksRepository->createOrUpdateClickCount(
$link,
$subscriber,
$newsletter,
$queue
);
$this->statisticsClicksRepository->flush();
$this->sendRevenueCookie($statisticsClicks);
$this->sendAbandonedCartCookie($subscriber);
// track open event
@@ -84,12 +91,12 @@ class Clicks {
$this->redirectToUrl($url);
}
private function sendRevenueCookie(StatisticsClicks $clicks) {
private function sendRevenueCookie(StatisticsClickEntity $clicks) {
if ($this->settingsController->get('woocommerce.accept_cookie_revenue_tracking.enabled')) {
$this->cookies->set(
self::REVENUE_TRACKING_COOKIE_NAME,
[
'statistics_clicks' => $clicks->id,
'statistics_clicks' => $clicks->getId(),
'created_at' => time(),
],
[

View File

@@ -17,6 +17,7 @@ use MailPoet\Models\StatisticsOpens;
use MailPoet\Newsletter\Shortcodes\Categories\Link as LinkShortcodeCategory;
use MailPoet\Newsletter\Shortcodes\Shortcodes;
use MailPoet\Settings\SettingsController;
use MailPoet\Statistics\StatisticsClicksRepository;
use MailPoet\Statistics\Track\Clicks;
use MailPoet\Statistics\Track\Opens;
use MailPoet\Subscribers\LinkTokens;
@@ -89,6 +90,7 @@ class ClicksTest extends \MailPoetTest {
new Cookies(),
$this->diContainer->get(Shortcodes::class),
$this->diContainer->get(Opens::class),
$this->diContainer->get(StatisticsClicksRepository::class),
$this->diContainer->get(LinkShortcodeCategory::class)
);
}
@@ -100,6 +102,7 @@ class ClicksTest extends \MailPoetTest {
new Cookies(),
$this->diContainer->get(Shortcodes::class),
$this->diContainer->get(Opens::class),
$this->diContainer->get(StatisticsClicksRepository::class),
$this->diContainer->get(LinkShortcodeCategory::class),
], [
'abort' => Expected::exactly(2),
@@ -122,6 +125,7 @@ class ClicksTest extends \MailPoetTest {
new Cookies(),
$this->diContainer->get(Shortcodes::class),
$this->diContainer->get(Opens::class),
$this->diContainer->get(StatisticsClicksRepository::class),
$this->diContainer->get(LinkShortcodeCategory::class),
], [
'redirectToUrl' => null,
@@ -138,6 +142,7 @@ class ClicksTest extends \MailPoetTest {
new Cookies(),
$this->diContainer->get(Shortcodes::class),
$this->diContainer->get(Opens::class),
$this->diContainer->get(StatisticsClicksRepository::class),
$this->diContainer->get(LinkShortcodeCategory::class),
], [
'redirectToUrl' => null,
@@ -153,6 +158,7 @@ class ClicksTest extends \MailPoetTest {
new Cookies(),
$this->diContainer->get(Shortcodes::class),
$this->diContainer->get(Opens::class),
$this->diContainer->get(StatisticsClicksRepository::class),
$this->diContainer->get(LinkShortcodeCategory::class),
], [
'redirectToUrl' => Expected::exactly(1),
@@ -166,6 +172,7 @@ class ClicksTest extends \MailPoetTest {
new Cookies(),
$this->diContainer->get(Shortcodes::class),
$this->diContainer->get(Opens::class),
$this->diContainer->get(StatisticsClicksRepository::class),
$this->diContainer->get(LinkShortcodeCategory::class),
], [
'redirectToUrl' => null,
@@ -193,6 +200,7 @@ class ClicksTest extends \MailPoetTest {
new Cookies(),
$this->diContainer->get(Shortcodes::class),
$this->diContainer->get(Opens::class),
$this->diContainer->get(StatisticsClicksRepository::class),
$this->diContainer->get(LinkShortcodeCategory::class),
], [
'abort' => Expected::exactly(1),