Track admin unsubscribe

[MAILPOET-2792]
This commit is contained in:
Pavel Dohnal
2020-06-17 12:57:27 +02:00
committed by Veljko V
parent 795ec44568
commit 4e3b206734
5 changed files with 49 additions and 2 deletions

View File

@ -6,6 +6,8 @@ use MailPoet\API\JSON\Endpoint as APIEndpoint;
use MailPoet\API\JSON\Error as APIError; use MailPoet\API\JSON\Error as APIError;
use MailPoet\API\JSON\Response as APIResponse; use MailPoet\API\JSON\Response as APIResponse;
use MailPoet\Config\AccessControl; use MailPoet\Config\AccessControl;
use MailPoet\Entities\StatisticsUnsubscribeEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Form\Util\FieldNameObfuscator; use MailPoet\Form\Util\FieldNameObfuscator;
use MailPoet\Listing; use MailPoet\Listing;
use MailPoet\Models\Form; use MailPoet\Models\Form;
@ -17,6 +19,7 @@ use MailPoet\Newsletter\Scheduler\WelcomeScheduler;
use MailPoet\Segments\BulkAction; use MailPoet\Segments\BulkAction;
use MailPoet\Segments\SubscribersListings; use MailPoet\Segments\SubscribersListings;
use MailPoet\Settings\SettingsController; use MailPoet\Settings\SettingsController;
use MailPoet\Statistics\Track\Unsubscribes;
use MailPoet\Subscribers\ConfirmationEmailMailer; use MailPoet\Subscribers\ConfirmationEmailMailer;
use MailPoet\Subscribers\RequiredCustomFieldValidator; use MailPoet\Subscribers\RequiredCustomFieldValidator;
use MailPoet\Subscribers\Source; use MailPoet\Subscribers\Source;
@ -71,6 +74,9 @@ class Subscribers extends APIEndpoint {
/** @var FieldNameObfuscator */ /** @var FieldNameObfuscator */
private $fieldNameObfuscator; private $fieldNameObfuscator;
/** @var Unsubscribes */
private $unsubscribesTracker;
public function __construct( public function __construct(
Listing\BulkActionController $bulkActionController, Listing\BulkActionController $bulkActionController,
SubscribersListings $subscribersListings, SubscribersListings $subscribersListings,
@ -83,6 +89,7 @@ class Subscribers extends APIEndpoint {
CaptchaSession $captchaSession, CaptchaSession $captchaSession,
ConfirmationEmailMailer $confirmationEmailMailer, ConfirmationEmailMailer $confirmationEmailMailer,
SubscriptionUrlFactory $subscriptionUrlFactory, SubscriptionUrlFactory $subscriptionUrlFactory,
Unsubscribes $unsubscribesTracker,
FieldNameObfuscator $fieldNameObfuscator FieldNameObfuscator $fieldNameObfuscator
) { ) {
$this->bulkActionController = $bulkActionController; $this->bulkActionController = $bulkActionController;
@ -97,6 +104,7 @@ class Subscribers extends APIEndpoint {
$this->confirmationEmailMailer = $confirmationEmailMailer; $this->confirmationEmailMailer = $confirmationEmailMailer;
$this->subscriptionUrlFactory = $subscriptionUrlFactory; $this->subscriptionUrlFactory = $subscriptionUrlFactory;
$this->fieldNameObfuscator = $fieldNameObfuscator; $this->fieldNameObfuscator = $fieldNameObfuscator;
$this->unsubscribesTracker = $unsubscribesTracker;
} }
public function get($data = []) { public function get($data = []) {
@ -346,6 +354,23 @@ class Subscribers extends APIEndpoint {
} }
$data['segments'] = array_merge($data['segments'], $this->getNonDefaultSubscribedSegments($data)); $data['segments'] = array_merge($data['segments'], $this->getNonDefaultSubscribedSegments($data));
$newSegments = $this->findNewSegments($data); $newSegments = $this->findNewSegments($data);
if (isset($data['id']) && (int)$data['id'] > 0) {
$oldSubscriber = Subscriber::findOne((int)$data['id']);
if (
isset($data['status'])
&& ($data['status'] === SubscriberEntity::STATUS_UNSUBSCRIBED)
&& ($oldSubscriber instanceof Subscriber)
&& ($oldSubscriber->status === SubscriberEntity::STATUS_SUBSCRIBED)
) {
$currentUser = $this->wp->wpGetCurrentUser();
$this->unsubscribesTracker->track(
(int)$oldSubscriber->id,
null,
StatisticsUnsubscribeEntity::SOURCE_ADMINISTRATOR,
$currentUser->display_name // phpcs:ignore Squiz.NamingConventions.ValidVariableName.NotCamelCaps
);
}
}
$subscriber = Subscriber::createOrUpdate($data); $subscriber = Subscriber::createOrUpdate($data);
$errors = $subscriber->getErrors(); $errors = $subscriber->getErrors();

View File

@ -453,6 +453,7 @@ class Migrator {
'queue_id int(11) unsigned NULL,', 'queue_id int(11) unsigned NULL,',
'created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,', 'created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,',
"source varchar(255) DEFAULT 'unknown',", "source varchar(255) DEFAULT 'unknown',",
'meta varchar(255) NULL,',
'PRIMARY KEY (id),', 'PRIMARY KEY (id),',
'KEY newsletter_id_subscriber_id (newsletter_id, subscriber_id),', 'KEY newsletter_id_subscriber_id (newsletter_id, subscriber_id),',
'KEY queue_id (queue_id),', 'KEY queue_id (queue_id),',

View File

@ -18,6 +18,7 @@ class StatisticsUnsubscribeEntity {
const SOURCE_NEWSLETTER = 'newsletter'; const SOURCE_NEWSLETTER = 'newsletter';
const SOURCE_MANAGE = 'manage'; const SOURCE_MANAGE = 'manage';
const SOURCE_ADMINISTRATOR = 'admin';
/** /**
* @ORM\ManyToOne(targetEntity="MailPoet\Entities\NewsletterEntity") * @ORM\ManyToOne(targetEntity="MailPoet\Entities\NewsletterEntity")
@ -45,6 +46,12 @@ class StatisticsUnsubscribeEntity {
*/ */
private $source = 'unknown'; private $source = 'unknown';
/**
* @ORM\Column(type="string", nullable=true)
* @var string|null
*/
private $meta;
public function __construct( public function __construct(
NewsletterEntity $newsletter = null, NewsletterEntity $newsletter = null,
SendingQueueEntity $queue = null, SendingQueueEntity $queue = null,
@ -84,4 +91,11 @@ class StatisticsUnsubscribeEntity {
public function setSource(string $source) { public function setSource(string $source) {
$this->source = $source; $this->source = $source;
} }
/**
* @param string $meta
*/
public function setMeta(string $meta) {
$this->meta = $meta;
}
} }

View File

@ -23,7 +23,9 @@ class Unsubscribes {
$this->statisticsUnsubscribesRepository = $statisticsUnsubscribesRepository; $this->statisticsUnsubscribesRepository = $statisticsUnsubscribesRepository;
} }
public function track(int $subscriberId, int $queueId = null, string $source) { public function track(int $subscriberId, int $queueId = null, string $source, string $meta = null) {
$queue = null;
$statistics = null;
if ($queueId) { if ($queueId) {
$queue = $this->sendingQueuesRepository->findOneById($queueId); $queue = $this->sendingQueuesRepository->findOneById($queueId);
} }
@ -43,9 +45,12 @@ class Unsubscribes {
} }
} }
if (!$statistics) { if ($statistics === null) {
$statistics = new StatisticsUnsubscribeEntity(null, null, $subscriberId); $statistics = new StatisticsUnsubscribeEntity(null, null, $subscriberId);
} }
if ($meta !== null) {
$statistics->setMeta($meta);
}
$statistics->setSource($source); $statistics->setSource($source);
$this->statisticsUnsubscribesRepository->persist($statistics); $this->statisticsUnsubscribesRepository->persist($statistics);
$this->statisticsUnsubscribesRepository->flush(); $this->statisticsUnsubscribesRepository->flush();

View File

@ -22,6 +22,7 @@ use MailPoet\Models\SubscriberSegment;
use MailPoet\Segments\SubscribersListings; use MailPoet\Segments\SubscribersListings;
use MailPoet\Settings\SettingsController; use MailPoet\Settings\SettingsController;
use MailPoet\Settings\SettingsRepository; use MailPoet\Settings\SettingsRepository;
use MailPoet\Statistics\Track\Unsubscribes;
use MailPoet\Subscribers\ConfirmationEmailMailer; use MailPoet\Subscribers\ConfirmationEmailMailer;
use MailPoet\Subscribers\LinkTokens; use MailPoet\Subscribers\LinkTokens;
use MailPoet\Subscribers\RequiredCustomFieldValidator; use MailPoet\Subscribers\RequiredCustomFieldValidator;
@ -72,6 +73,7 @@ class SubscribersTest extends \MailPoetTest {
$this->captchaSession, $this->captchaSession,
$container->get(ConfirmationEmailMailer::class), $container->get(ConfirmationEmailMailer::class),
new SubscriptionUrlFactory($wp, $settings, new LinkTokens), new SubscriptionUrlFactory($wp, $settings, new LinkTokens),
$container->get(Unsubscribes::class),
$obfuscator $obfuscator
); );
$this->obfuscatedEmail = $obfuscator->obfuscate('email'); $this->obfuscatedEmail = $obfuscator->obfuscate('email');