Add custom fields to the response

[MAILPOET-2653]
This commit is contained in:
Pavel Dohnal
2020-06-25 14:41:22 +02:00
committed by Veljko V
parent a01e19c805
commit b21464cc9f
5 changed files with 113 additions and 3 deletions

View File

@ -2,11 +2,13 @@
namespace MailPoet\API\JSON\ResponseBuilders; namespace MailPoet\API\JSON\ResponseBuilders;
use MailPoet\CustomFields\CustomFieldsRepository;
use MailPoet\Entities\NewsletterEntity;
use MailPoet\Entities\SegmentEntity; use MailPoet\Entities\SegmentEntity;
use MailPoet\Entities\SubscriberCustomFieldEntity; use MailPoet\Entities\SubscriberCustomFieldEntity;
use MailPoet\Entities\NewsletterEntity;
use MailPoet\Entities\SubscriberEntity; use MailPoet\Entities\SubscriberEntity;
use MailPoet\Statistics\StatisticsUnsubscribesRepository; use MailPoet\Statistics\StatisticsUnsubscribesRepository;
use MailPoet\Subscribers\SubscriberCustomFieldRepository;
use MailPoet\Subscribers\SubscriberSegmentRepository; use MailPoet\Subscribers\SubscriberSegmentRepository;
class SubscribersResponseBuilder { class SubscribersResponseBuilder {
@ -17,12 +19,22 @@ class SubscribersResponseBuilder {
/** @var StatisticsUnsubscribesRepository */ /** @var StatisticsUnsubscribesRepository */
private $statisticsUnsubscribesRepository; private $statisticsUnsubscribesRepository;
/** @var CustomFieldsRepository */
private $customFieldsRepository;
/** @var SubscriberCustomFieldRepository */
private $subscriberCustomFieldRepository;
public function __construct( public function __construct(
SubscriberSegmentRepository $subscriberSegmentRepository, SubscriberSegmentRepository $subscriberSegmentRepository,
CustomFieldsRepository $customFieldsRepository,
SubscriberCustomFieldRepository $subscriberCustomFieldRepository,
StatisticsUnsubscribesRepository $statisticsUnsubscribesRepository StatisticsUnsubscribesRepository $statisticsUnsubscribesRepository
) { ) {
$this->subscriberSegmentRepository = $subscriberSegmentRepository; $this->subscriberSegmentRepository = $subscriberSegmentRepository;
$this->statisticsUnsubscribesRepository = $statisticsUnsubscribesRepository; $this->statisticsUnsubscribesRepository = $statisticsUnsubscribesRepository;
$this->customFieldsRepository = $customFieldsRepository;
$this->subscriberCustomFieldRepository = $subscriberCustomFieldRepository;
} }
public function build(SubscriberEntity $subscriberEntity): array { public function build(SubscriberEntity $subscriberEntity): array {
@ -32,13 +44,12 @@ class SubscribersResponseBuilder {
'is_woocommerce_user' => $subscriberEntity->getIsWoocommerceUser(), 'is_woocommerce_user' => $subscriberEntity->getIsWoocommerceUser(),
'subscriptions' => $this->buildSubscriptions($subscriberEntity), 'subscriptions' => $this->buildSubscriptions($subscriberEntity),
'unsubscribes' => $this->buildUnsubscribes($subscriberEntity), 'unsubscribes' => $this->buildUnsubscribes($subscriberEntity),
// TODO custom fields
'status' => $subscriberEntity->getStatus(), 'status' => $subscriberEntity->getStatus(),
'last_name' => $subscriberEntity->getLastName(), 'last_name' => $subscriberEntity->getLastName(),
'first_name' => $subscriberEntity->getFirstName(), 'first_name' => $subscriberEntity->getFirstName(),
'email' => $subscriberEntity->getEmail(), 'email' => $subscriberEntity->getEmail(),
]; ];
$data = $this->buildCustomFields($subscriberEntity, $data);
return $data; return $data;
} }
@ -80,4 +91,18 @@ class SubscribersResponseBuilder {
} }
return $result; return $result;
} }
private function buildCustomFields(SubscriberEntity $subscriberEntity, array $data): array {
$customFields = $this->customFieldsRepository->findAll();
foreach ($customFields as $customField) {
$subscriberCustomField = $this->subscriberCustomFieldRepository->findOneBy(
['subscriber' => $subscriberEntity, 'customField' => $customField]
);
if ($subscriberCustomField instanceof SubscriberCustomFieldEntity) {
$data['cf_' . $customField->getId()] = $subscriberCustomField->getValue();
}
}
return $data;
}
} }

View File

@ -238,6 +238,7 @@ class ContainerConfigurator implements IContainerConfigurator {
$container->autowire(\MailPoet\Subscribers\LinkTokens::class)->setPublic(true); $container->autowire(\MailPoet\Subscribers\LinkTokens::class)->setPublic(true);
$container->autowire(\MailPoet\Subscribers\SubscribersRepository::class); $container->autowire(\MailPoet\Subscribers\SubscribersRepository::class);
$container->autowire(\MailPoet\Subscribers\SubscriberSegmentRepository::class); $container->autowire(\MailPoet\Subscribers\SubscriberSegmentRepository::class);
$container->autowire(\MailPoet\Subscribers\SubscriberCustomFieldRepository::class);
// Segments // Segments
$container->autowire(\MailPoet\Segments\SubscribersListings::class)->setPublic(true); $container->autowire(\MailPoet\Segments\SubscribersListings::class)->setPublic(true);
$container->autowire(\MailPoet\Segments\WooCommerce::class)->setPublic(true); $container->autowire(\MailPoet\Segments\WooCommerce::class)->setPublic(true);

View File

@ -0,0 +1,67 @@
<?php
namespace MailPoet\Entities;
use MailPoet\Doctrine\EntityTraits\AutoincrementedIdTrait;
use MailPoet\Doctrine\EntityTraits\CreatedAtTrait;
use MailPoet\Doctrine\EntityTraits\SafeToOneAssociationLoadTrait;
use MailPoet\Doctrine\EntityTraits\UpdatedAtTrait;
use MailPoetVendor\Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity()
* @ORM\Table(name="subscriber_custom_field")
*/
class SubscriberCustomFieldEntity {
use AutoincrementedIdTrait;
use CreatedAtTrait;
use UpdatedAtTrait;
use SafeToOneAssociationLoadTrait;
/**
* @ORM\ManyToOne(targetEntity="MailPoet\Entities\SubscriberEntity")
* @var SubscriberEntity|null
*/
private $subscriber;
/**
* @ORM\ManyToOne(targetEntity="MailPoet\Entities\CustomFieldEntity")
* @var CustomFieldEntity|null
*/
private $customField;
/**
* @ORM\Column(type="string")
* @var string
*/
private $value;
public function __construct(
SubscriberEntity $subscriber,
CustomFieldEntity $customField,
string $value
) {
$this->subscriber = $subscriber;
$this->customField = $customField;
$this->value = $value;
}
/**
* @return SubscriberEntity|null
*/
public function getSubscriber() {
$this->safelyLoadToOneAssociation('subscriber');
return $this->subscriber;
}
public function getValue(): string {
return $this->value;
}
/**
* @return CustomFieldEntity|null
*/
public function getCustomField() {
return $this->customField;
}
}

View File

@ -2,6 +2,7 @@
namespace MailPoet\Entities; namespace MailPoet\Entities;
use MailPoet\Doctrine\EntityTraits\AutoincrementedIdTrait;
use MailPoet\Doctrine\EntityTraits\CreatedAtTrait; use MailPoet\Doctrine\EntityTraits\CreatedAtTrait;
use MailPoet\Doctrine\EntityTraits\SafeToOneAssociationLoadTrait; use MailPoet\Doctrine\EntityTraits\SafeToOneAssociationLoadTrait;
use MailPoet\Doctrine\EntityTraits\UpdatedAtTrait; use MailPoet\Doctrine\EntityTraits\UpdatedAtTrait;
@ -12,6 +13,7 @@ use MailPoetVendor\Doctrine\ORM\Mapping as ORM;
* @ORM\Table(name="subscriber_segment") * @ORM\Table(name="subscriber_segment")
*/ */
class SubscriberSegmentEntity { class SubscriberSegmentEntity {
use AutoincrementedIdTrait;
use CreatedAtTrait; use CreatedAtTrait;
use UpdatedAtTrait; use UpdatedAtTrait;
use SafeToOneAssociationLoadTrait; use SafeToOneAssociationLoadTrait;

View File

@ -0,0 +1,15 @@
<?php
namespace MailPoet\Subscribers;
use MailPoet\Doctrine\Repository;
use MailPoet\Entities\SubscriberCustomFieldEntity;
/**
* @extends Repository<SubscriberCustomFieldEntity>
*/
class SubscriberCustomFieldRepository extends Repository {
protected function getEntityClassName() {
return SubscriberCustomFieldEntity::class;
}
}