Add unsubscribe API method

It can be used by calling:

```
$mailpoet_api = \MailPoet\API\API::MP('v1');
$mailpoet_api->unsubscribe($subscriberId);
```

[MAILPOET-5152]
This commit is contained in:
Rodrigo Primo
2023-03-27 11:41:09 -03:00
committed by Aschepikov
parent d37b961c2b
commit c507229dd2
5 changed files with 114 additions and 1 deletions

View File

@@ -4,11 +4,13 @@ namespace MailPoet\API\MP\v1;
use MailPoet\API\JSON\ResponseBuilders\SubscribersResponseBuilder;
use MailPoet\Entities\SegmentEntity;
use MailPoet\Entities\StatisticsUnsubscribeEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Listing\ListingDefinition;
use MailPoet\Newsletter\Scheduler\WelcomeScheduler;
use MailPoet\Segments\SegmentsRepository;
use MailPoet\Settings\SettingsController;
use MailPoet\Statistics\Track\Unsubscribes;
use MailPoet\Subscribers\ConfirmationEmailMailer;
use MailPoet\Subscribers\NewSubscriberNotificationMailer;
use MailPoet\Subscribers\RequiredCustomFieldValidator;
@@ -62,6 +64,9 @@ class Subscribers {
/** @var SubscriberListingRepository */
private $subscriberListingRepository;
/** @var Unsubscribes */
private $unsubscribesTracker;
public function __construct (
ConfirmationEmailMailer $confirmationEmailMailer,
NewSubscriberNotificationMailer $newSubscriberNotificationMailer,
@@ -74,7 +79,8 @@ class Subscribers {
WelcomeScheduler $welcomeScheduler,
RequiredCustomFieldValidator $requiredCustomFieldsValidator,
SubscriberListingRepository $subscriberListingRepository,
WPFunctions $wp
WPFunctions $wp,
Unsubscribes $unsubscribesTracker
) {
$this->confirmationEmailMailer = $confirmationEmailMailer;
$this->newSubscriberNotificationMailer = $newSubscriberNotificationMailer;
@@ -88,6 +94,7 @@ class Subscribers {
$this->requiredCustomFieldsValidator = $requiredCustomFieldsValidator;
$this->wp = $wp;
$this->subscriberListingRepository = $subscriberListingRepository;
$this->unsubscribesTracker = $unsubscribesTracker;
}
public function getSubscriber($subscriberIdOrEmail): array {
@@ -229,6 +236,28 @@ class Subscribers {
return $this->subscribersResponseBuilder->build($subscriber);
}
public function unsubscribe($subscriberIdOrEmail): array {
$this->checkSubscriberParam($subscriberIdOrEmail);
$subscriber = $this->findSubscriber($subscriberIdOrEmail);
if ($subscriber->getStatus() === SubscriberEntity::STATUS_UNSUBSCRIBED) {
throw new APIException(__('This subscriber is already unsubscribed.', 'mailpoet'), APIException::SUBSCRIBER_ALREADY_UNSUBSCRIBED);
}
$this->unsubscribesTracker->track(
(int)$subscriber->getId(),
StatisticsUnsubscribeEntity::SOURCE_MP_API
);
$subscriber->setStatus(SubscriberEntity::STATUS_UNSUBSCRIBED);
$this->subscribersRepository->persist($subscriber);
$this->subscribersRepository->flush();
$this->subscribersSegmentRepository->unsubscribeFromSegments($subscriber);
return $this->subscribersResponseBuilder->build($subscriber);
}
public function unsubscribeFromLists($subscriberIdOrEmail, array $listIds): array {
$this->checkSubscriberAndListParams($subscriberIdOrEmail, $listIds);
$subscriber = $this->findSubscriber($subscriberIdOrEmail);
@@ -321,6 +350,13 @@ class Subscribers {
if (empty($listIds)) {
throw new APIException(__('At least one segment ID is required.', 'mailpoet'), APIException::SEGMENT_REQUIRED);
}
$this->checkSubscriberParam($subscriberIdOrEmail);
}
/**
* @throws APIException
*/
private function checkSubscriberParam($subscriberIdOrEmail): void {
if (empty($subscriberIdOrEmail)) {
throw new APIException(__('A subscriber is required.', 'mailpoet'), APIException::SUBSCRIBER_NOT_EXISTS);
}