Create subscribers response builder

[MAILPOET-2653]
This commit is contained in:
Pavel Dohnal
2020-06-25 12:44:48 +02:00
committed by Veljko V
parent 961d903f5e
commit 474be136f9
3 changed files with 51 additions and 34 deletions

View File

@ -0,0 +1,25 @@
<?php
namespace MailPoet\API\JSON\ResponseBuilders;
use MailPoet\Entities\SubscriberEntity;
class SubscribersResponseBuilder {
public function build(SubscriberEntity $subscriberEntity): array {
$data = [
'id' => $subscriberEntity->getId(),
'wp_user_id' => $subscriberEntity->getWpUserId(),
'is_woocommerce_user' => $subscriberEntity->getIsWoocommerceUser(),
'subscriptions' => [],// TODO
'unsubscribes' => [],// TODO
// TODO custom fields
'status' => $subscriberEntity->getStatus(),
'last_name' => $subscriberEntity->getLastName(),
'first_name' => $subscriberEntity->getFirstName(),
'email' => $subscriberEntity->getEmail(),
];
return $data;
}
}

View File

@ -5,8 +5,8 @@ namespace MailPoet\API\JSON\v1;
use MailPoet\API\JSON\Endpoint as APIEndpoint; 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\API\JSON\ResponseBuilders\SubscribersResponseBuilder;
use MailPoet\Config\AccessControl; use MailPoet\Config\AccessControl;
use MailPoet\Entities\NewsletterEntity;
use MailPoet\Entities\StatisticsUnsubscribeEntity; use MailPoet\Entities\StatisticsUnsubscribeEntity;
use MailPoet\Entities\SubscriberEntity; use MailPoet\Entities\SubscriberEntity;
use MailPoet\Form\Util\FieldNameObfuscator; use MailPoet\Form\Util\FieldNameObfuscator;
@ -20,12 +20,12 @@ 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\StatisticsUnsubscribesRepository;
use MailPoet\Statistics\Track\Unsubscribes; 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;
use MailPoet\Subscribers\SubscriberActions; use MailPoet\Subscribers\SubscriberActions;
use MailPoet\Subscribers\SubscribersRepository;
use MailPoet\Subscription\Captcha; use MailPoet\Subscription\Captcha;
use MailPoet\Subscription\CaptchaSession; use MailPoet\Subscription\CaptchaSession;
use MailPoet\Subscription\SubscriptionUrlFactory; use MailPoet\Subscription\SubscriptionUrlFactory;
@ -79,8 +79,11 @@ class Subscribers extends APIEndpoint {
/** @var Unsubscribes */ /** @var Unsubscribes */
private $unsubscribesTracker; private $unsubscribesTracker;
/** @var StatisticsUnsubscribesRepository */ /** @var SubscribersRepository */
private $statisticsUnsubscribesRepository; private $subscribersRepository;
/** @var SubscribersResponseBuilder */
private $subscribersResponseBuilder;
public function __construct( public function __construct(
Listing\BulkActionController $bulkActionController, Listing\BulkActionController $bulkActionController,
@ -95,7 +98,8 @@ class Subscribers extends APIEndpoint {
ConfirmationEmailMailer $confirmationEmailMailer, ConfirmationEmailMailer $confirmationEmailMailer,
SubscriptionUrlFactory $subscriptionUrlFactory, SubscriptionUrlFactory $subscriptionUrlFactory,
Unsubscribes $unsubscribesTracker, Unsubscribes $unsubscribesTracker,
StatisticsUnsubscribesRepository $statisticsUnsubscribesRepository, SubscribersRepository $subscribersRepository,
SubscribersResponseBuilder $subscribersResponseBuilder,
FieldNameObfuscator $fieldNameObfuscator FieldNameObfuscator $fieldNameObfuscator
) { ) {
$this->bulkActionController = $bulkActionController; $this->bulkActionController = $bulkActionController;
@ -111,43 +115,20 @@ class Subscribers extends APIEndpoint {
$this->subscriptionUrlFactory = $subscriptionUrlFactory; $this->subscriptionUrlFactory = $subscriptionUrlFactory;
$this->fieldNameObfuscator = $fieldNameObfuscator; $this->fieldNameObfuscator = $fieldNameObfuscator;
$this->unsubscribesTracker = $unsubscribesTracker; $this->unsubscribesTracker = $unsubscribesTracker;
$this->statisticsUnsubscribesRepository = $statisticsUnsubscribesRepository; $this->subscribersRepository = $subscribersRepository;
$this->subscribersResponseBuilder = $subscribersResponseBuilder;
} }
public function get($data = []) { public function get($data = []) {
$id = (isset($data['id']) ? (int)$data['id'] : false); $subscriber = $this->getSubscriber($data);
$subscriber = Subscriber::findOne($id); if (!$subscriber instanceof SubscriberEntity) {
if ($subscriber === false) {
return $this->errorResponse([ return $this->errorResponse([
APIError::NOT_FOUND => WPFunctions::get()->__('This subscriber does not exist.', 'mailpoet'), APIError::NOT_FOUND => WPFunctions::get()->__('This subscriber does not exist.', 'mailpoet'),
]); ]);
} else {
$unsubscribes = $this->statisticsUnsubscribesRepository->findBy([
'subscriberId' => $id,
], [
'createdAt' => 'desc',
]);
$result = $subscriber
->withCustomFields()
->withSubscriptions()
->asArray();
$result['unsubscribes'] = [];
foreach ($unsubscribes as $unsubscribe) {
$mapped = [
'source' => $unsubscribe->getSource(),
'meta' => $unsubscribe->getMeta(),
'createdAt' => $unsubscribe->getCreatedAt(),
];
$newsletter = $unsubscribe->getNewsletter();
if ($newsletter instanceof NewsletterEntity) {
$mapped['newsletterId'] = $newsletter->getId();
$mapped['newsletterSubject'] = $newsletter->getSubject();
}
$result['unsubscribes'][] = $mapped;
} }
$result = $this->subscribersResponseBuilder->build($subscriber);
return $this->successResponse($result); return $this->successResponse($result);
} }
}
public function listing($data = []) { public function listing($data = []) {
@ -535,4 +516,14 @@ class Subscribers extends APIEndpoint {
]); ]);
} }
} }
/**
* @param array $data
* @return SubscriberEntity|null
*/
private function getSubscriber($data) {
return isset($data['id'])
? $this->subscribersRepository->findOneById((int)$data['id'])
: null;
}
} }

View File

@ -88,6 +88,7 @@ class ContainerConfigurator implements IContainerConfigurator {
$container->autowire(\MailPoet\API\JSON\ResponseBuilders\NewslettersResponseBuilder::class); $container->autowire(\MailPoet\API\JSON\ResponseBuilders\NewslettersResponseBuilder::class);
$container->autowire(\MailPoet\API\JSON\ResponseBuilders\NewsletterTemplatesResponseBuilder::class); $container->autowire(\MailPoet\API\JSON\ResponseBuilders\NewsletterTemplatesResponseBuilder::class);
$container->autowire(\MailPoet\API\JSON\ResponseBuilders\CustomFieldsResponseBuilder::class); $container->autowire(\MailPoet\API\JSON\ResponseBuilders\CustomFieldsResponseBuilder::class);
$container->autowire(\MailPoet\API\JSON\ResponseBuilders\SubscribersResponseBuilder::class);
// Config // Config
$container->autowire(\MailPoet\Config\AccessControl::class)->setPublic(true); $container->autowire(\MailPoet\Config\AccessControl::class)->setPublic(true);
$container->autowire(\MailPoet\Config\Activator::class)->setPublic(true); $container->autowire(\MailPoet\Config\Activator::class)->setPublic(true);