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\Response as APIResponse;
use MailPoet\Config\AccessControl;
use MailPoet\Entities\StatisticsUnsubscribeEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Form\Util\FieldNameObfuscator;
use MailPoet\Listing;
use MailPoet\Models\Form;
@ -17,6 +19,7 @@ use MailPoet\Newsletter\Scheduler\WelcomeScheduler;
use MailPoet\Segments\BulkAction;
use MailPoet\Segments\SubscribersListings;
use MailPoet\Settings\SettingsController;
use MailPoet\Statistics\Track\Unsubscribes;
use MailPoet\Subscribers\ConfirmationEmailMailer;
use MailPoet\Subscribers\RequiredCustomFieldValidator;
use MailPoet\Subscribers\Source;
@ -71,6 +74,9 @@ class Subscribers extends APIEndpoint {
/** @var FieldNameObfuscator */
private $fieldNameObfuscator;
/** @var Unsubscribes */
private $unsubscribesTracker;
public function __construct(
Listing\BulkActionController $bulkActionController,
SubscribersListings $subscribersListings,
@ -83,6 +89,7 @@ class Subscribers extends APIEndpoint {
CaptchaSession $captchaSession,
ConfirmationEmailMailer $confirmationEmailMailer,
SubscriptionUrlFactory $subscriptionUrlFactory,
Unsubscribes $unsubscribesTracker,
FieldNameObfuscator $fieldNameObfuscator
) {
$this->bulkActionController = $bulkActionController;
@ -97,6 +104,7 @@ class Subscribers extends APIEndpoint {
$this->confirmationEmailMailer = $confirmationEmailMailer;
$this->subscriptionUrlFactory = $subscriptionUrlFactory;
$this->fieldNameObfuscator = $fieldNameObfuscator;
$this->unsubscribesTracker = $unsubscribesTracker;
}
public function get($data = []) {
@ -346,6 +354,23 @@ class Subscribers extends APIEndpoint {
}
$data['segments'] = array_merge($data['segments'], $this->getNonDefaultSubscribedSegments($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);
$errors = $subscriber->getErrors();

View File

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

View File

@ -18,6 +18,7 @@ class StatisticsUnsubscribeEntity {
const SOURCE_NEWSLETTER = 'newsletter';
const SOURCE_MANAGE = 'manage';
const SOURCE_ADMINISTRATOR = 'admin';
/**
* @ORM\ManyToOne(targetEntity="MailPoet\Entities\NewsletterEntity")
@ -45,6 +46,12 @@ class StatisticsUnsubscribeEntity {
*/
private $source = 'unknown';
/**
* @ORM\Column(type="string", nullable=true)
* @var string|null
*/
private $meta;
public function __construct(
NewsletterEntity $newsletter = null,
SendingQueueEntity $queue = null,
@ -84,4 +91,11 @@ class StatisticsUnsubscribeEntity {
public function setSource(string $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;
}
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) {
$queue = $this->sendingQueuesRepository->findOneById($queueId);
}
@ -43,9 +45,12 @@ class Unsubscribes {
}
}
if (!$statistics) {
if ($statistics === null) {
$statistics = new StatisticsUnsubscribeEntity(null, null, $subscriberId);
}
if ($meta !== null) {
$statistics->setMeta($meta);
}
$statistics->setSource($source);
$this->statisticsUnsubscribesRepository->persist($statistics);
$this->statisticsUnsubscribesRepository->flush();

View File

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