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\Error as APIError;
use MailPoet\API\JSON\Response as APIResponse;
use MailPoet\API\JSON\ResponseBuilders\SubscribersResponseBuilder;
use MailPoet\Config\AccessControl;
use MailPoet\Entities\NewsletterEntity;
use MailPoet\Entities\StatisticsUnsubscribeEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Form\Util\FieldNameObfuscator;
@ -20,12 +20,12 @@ use MailPoet\Newsletter\Scheduler\WelcomeScheduler;
use MailPoet\Segments\BulkAction;
use MailPoet\Segments\SubscribersListings;
use MailPoet\Settings\SettingsController;
use MailPoet\Statistics\StatisticsUnsubscribesRepository;
use MailPoet\Statistics\Track\Unsubscribes;
use MailPoet\Subscribers\ConfirmationEmailMailer;
use MailPoet\Subscribers\RequiredCustomFieldValidator;
use MailPoet\Subscribers\Source;
use MailPoet\Subscribers\SubscriberActions;
use MailPoet\Subscribers\SubscribersRepository;
use MailPoet\Subscription\Captcha;
use MailPoet\Subscription\CaptchaSession;
use MailPoet\Subscription\SubscriptionUrlFactory;
@ -79,8 +79,11 @@ class Subscribers extends APIEndpoint {
/** @var Unsubscribes */
private $unsubscribesTracker;
/** @var StatisticsUnsubscribesRepository */
private $statisticsUnsubscribesRepository;
/** @var SubscribersRepository */
private $subscribersRepository;
/** @var SubscribersResponseBuilder */
private $subscribersResponseBuilder;
public function __construct(
Listing\BulkActionController $bulkActionController,
@ -95,7 +98,8 @@ class Subscribers extends APIEndpoint {
ConfirmationEmailMailer $confirmationEmailMailer,
SubscriptionUrlFactory $subscriptionUrlFactory,
Unsubscribes $unsubscribesTracker,
StatisticsUnsubscribesRepository $statisticsUnsubscribesRepository,
SubscribersRepository $subscribersRepository,
SubscribersResponseBuilder $subscribersResponseBuilder,
FieldNameObfuscator $fieldNameObfuscator
) {
$this->bulkActionController = $bulkActionController;
@ -111,43 +115,20 @@ class Subscribers extends APIEndpoint {
$this->subscriptionUrlFactory = $subscriptionUrlFactory;
$this->fieldNameObfuscator = $fieldNameObfuscator;
$this->unsubscribesTracker = $unsubscribesTracker;
$this->statisticsUnsubscribesRepository = $statisticsUnsubscribesRepository;
$this->subscribersRepository = $subscribersRepository;
$this->subscribersResponseBuilder = $subscribersResponseBuilder;
}
public function get($data = []) {
$id = (isset($data['id']) ? (int)$data['id'] : false);
$subscriber = Subscriber::findOne($id);
if ($subscriber === false) {
$subscriber = $this->getSubscriber($data);
if (!$subscriber instanceof SubscriberEntity) {
return $this->errorResponse([
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);
}
}
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\NewsletterTemplatesResponseBuilder::class);
$container->autowire(\MailPoet\API\JSON\ResponseBuilders\CustomFieldsResponseBuilder::class);
$container->autowire(\MailPoet\API\JSON\ResponseBuilders\SubscribersResponseBuilder::class);
// Config
$container->autowire(\MailPoet\Config\AccessControl::class)->setPublic(true);
$container->autowire(\MailPoet\Config\Activator::class)->setPublic(true);