Track admin unsubscribe
[MAILPOET-2792]
This commit is contained in:
@ -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();
|
||||||
|
|
||||||
|
@ -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),',
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
@ -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');
|
||||||
|
Reference in New Issue
Block a user