Files
piratepoet/lib/Statistics/Track/Opens.php
Pavel Dohnal a84471b65c Save user agent on open
[MAILPOET-3735]
2021-08-18 14:41:20 +02:00

69 lines
2.3 KiB
PHP

<?php
namespace MailPoet\Statistics\Track;
use MailPoet\Entities\NewsletterEntity;
use MailPoet\Entities\SendingQueueEntity;
use MailPoet\Entities\StatisticsOpenEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Statistics\StatisticsOpensRepository;
use MailPoet\Statistics\UserAgentsRepository;
class Opens {
/** @var StatisticsOpensRepository */
private $statisticsOpensRepository;
/** @var UserAgentsRepository */
private $userAgentsRepository;
public function __construct(
StatisticsOpensRepository $statisticsOpensRepository,
UserAgentsRepository $userAgentsRepository
) {
$this->statisticsOpensRepository = $statisticsOpensRepository;
$this->userAgentsRepository = $userAgentsRepository;
}
public function track($data, $displayImage = true) {
if (!$data) {
return $this->returnResponse($displayImage);
}
/** @var SubscriberEntity $subscriber */
$subscriber = $data->subscriber;
/** @var SendingQueueEntity $queue */
$queue = $data->queue;
/** @var NewsletterEntity $newsletter */
$newsletter = $data->newsletter;
$wpUserPreview = ($data->preview && ($subscriber->isWPUser()));
// log statistics only if the action did not come from
// a WP user previewing the newsletter
if (!$wpUserPreview) {
$oldStatistics = $this->statisticsOpensRepository->findOneBy([
'subscriber' => $subscriber->getId(),
'newsletter' => $newsletter->getId(),
'queue' => $queue->getId(),
]);
// Open was already tracked
if ($oldStatistics) {
return $this->returnResponse($displayImage);
}
$statistics = new StatisticsOpenEntity($newsletter, $queue, $subscriber);
if (!empty($data->userAgent)) {
$statistics->setUserAgent($this->userAgentsRepository->findOrCreate($data->userAgent));
}
$this->statisticsOpensRepository->persist($statistics);
$this->statisticsOpensRepository->flush();
$this->statisticsOpensRepository->recalculateSubscriberScore($subscriber);
}
return $this->returnResponse($displayImage);
}
public function returnResponse($displayImage) {
if (!$displayImage) return;
// return 1x1 pixel transparent gif image
header('Content-Type: image/gif');
echo base64_decode('R0lGODlhAQABAJAAAP8AAAAAACH5BAUQAAAALAAAAAABAAEAAAICBAEAOw==');
exit;
}
}