Build listings response
[MAILPOET-2657]
This commit is contained in:
@ -10,8 +10,10 @@ use MailPoet\Entities\SubscriberEntity;
|
|||||||
use MailPoet\Statistics\StatisticsUnsubscribesRepository;
|
use MailPoet\Statistics\StatisticsUnsubscribesRepository;
|
||||||
use MailPoet\Subscribers\SubscriberCustomFieldRepository;
|
use MailPoet\Subscribers\SubscriberCustomFieldRepository;
|
||||||
use MailPoet\Subscribers\SubscriberSegmentRepository;
|
use MailPoet\Subscribers\SubscriberSegmentRepository;
|
||||||
|
use MailPoetVendor\Doctrine\ORM\EntityManager;
|
||||||
|
|
||||||
class SubscribersResponseBuilder {
|
class SubscribersResponseBuilder {
|
||||||
|
const DATE_FORMAT = 'Y-m-d H:i:s';
|
||||||
|
|
||||||
/** @var SubscriberSegmentRepository */
|
/** @var SubscriberSegmentRepository */
|
||||||
private $subscriberSegmentRepository;
|
private $subscriberSegmentRepository;
|
||||||
@ -25,7 +27,11 @@ class SubscribersResponseBuilder {
|
|||||||
/** @var SubscriberCustomFieldRepository */
|
/** @var SubscriberCustomFieldRepository */
|
||||||
private $subscriberCustomFieldRepository;
|
private $subscriberCustomFieldRepository;
|
||||||
|
|
||||||
|
/** @var EntityManager */
|
||||||
|
private $entityManager;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
|
EntityManager $entityManager,
|
||||||
SubscriberSegmentRepository $subscriberSegmentRepository,
|
SubscriberSegmentRepository $subscriberSegmentRepository,
|
||||||
CustomFieldsRepository $customFieldsRepository,
|
CustomFieldsRepository $customFieldsRepository,
|
||||||
SubscriberCustomFieldRepository $subscriberCustomFieldRepository,
|
SubscriberCustomFieldRepository $subscriberCustomFieldRepository,
|
||||||
@ -35,6 +41,28 @@ class SubscribersResponseBuilder {
|
|||||||
$this->statisticsUnsubscribesRepository = $statisticsUnsubscribesRepository;
|
$this->statisticsUnsubscribesRepository = $statisticsUnsubscribesRepository;
|
||||||
$this->customFieldsRepository = $customFieldsRepository;
|
$this->customFieldsRepository = $customFieldsRepository;
|
||||||
$this->subscriberCustomFieldRepository = $subscriberCustomFieldRepository;
|
$this->subscriberCustomFieldRepository = $subscriberCustomFieldRepository;
|
||||||
|
$this->entityManager = $entityManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function buildForListing(array $subscribers): array {
|
||||||
|
$this->prefetchSegments($subscribers);
|
||||||
|
$data = [];
|
||||||
|
foreach ($subscribers as $subscriber) {
|
||||||
|
$data[] = $this->buildListingItem($subscriber);
|
||||||
|
}
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function buildListingItem(SubscriberEntity $subscriber): array {
|
||||||
|
return [
|
||||||
|
'id' => (string)$subscriber->getId(), // (string) for BC
|
||||||
|
'email' => $subscriber->getEmail(),
|
||||||
|
'first_name' => $subscriber->getFirstName(),
|
||||||
|
'last_name' => $subscriber->getLastName(),
|
||||||
|
'subscriptions' => $this->buildSubscriptions($subscriber),
|
||||||
|
'status' => $subscriber->getStatus(),
|
||||||
|
'created_at' => ($createdAt = $subscriber->getCreatedAt()) ? $createdAt->format(self::DATE_FORMAT) : null,
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function build(SubscriberEntity $subscriberEntity): array {
|
public function build(SubscriberEntity $subscriberEntity): array {
|
||||||
@ -60,7 +88,7 @@ class SubscribersResponseBuilder {
|
|||||||
$segment = $subscription->getSegment();
|
$segment = $subscription->getSegment();
|
||||||
if ($segment instanceof SegmentEntity) {
|
if ($segment instanceof SegmentEntity) {
|
||||||
$result[] = [
|
$result[] = [
|
||||||
'segment_id' => $segment->getId(),
|
'segment_id' => (string)$segment->getId(),
|
||||||
'status' => $subscription->getStatus(),
|
'status' => $subscription->getStatus(),
|
||||||
'updated_at' => $subscription->getUpdatedAt(),
|
'updated_at' => $subscription->getUpdatedAt(),
|
||||||
];
|
];
|
||||||
@ -105,4 +133,19 @@ class SubscribersResponseBuilder {
|
|||||||
}
|
}
|
||||||
return $data;
|
return $data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param SubscriberEntity[] $subscribers
|
||||||
|
*/
|
||||||
|
private function prefetchSegments(array $subscribers) {
|
||||||
|
$this->entityManager->createQueryBuilder()
|
||||||
|
->select('PARTIAL s.{id}, ssg, sg')
|
||||||
|
->from(SubscriberEntity::class, 's')
|
||||||
|
->join('s.subscriberSegments', 'ssg')
|
||||||
|
->join('ssg.segment', 'sg')
|
||||||
|
->where('s.id IN (:subscribers)')
|
||||||
|
->setParameter('subscribers', $subscribers)
|
||||||
|
->getQuery()
|
||||||
|
->getResult();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@ 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\SubscriberListingRepository;
|
||||||
use MailPoet\Subscribers\SubscribersRepository;
|
use MailPoet\Subscribers\SubscribersRepository;
|
||||||
use MailPoet\Subscription\Captcha;
|
use MailPoet\Subscription\Captcha;
|
||||||
use MailPoet\Subscription\CaptchaSession;
|
use MailPoet\Subscription\CaptchaSession;
|
||||||
@ -85,6 +86,9 @@ class Subscribers extends APIEndpoint {
|
|||||||
/** @var SubscribersResponseBuilder */
|
/** @var SubscribersResponseBuilder */
|
||||||
private $subscribersResponseBuilder;
|
private $subscribersResponseBuilder;
|
||||||
|
|
||||||
|
/** @var SubscriberListingRepository */
|
||||||
|
private $newsletterListingRepository;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
Listing\BulkActionController $bulkActionController,
|
Listing\BulkActionController $bulkActionController,
|
||||||
SubscribersListings $subscribersListings,
|
SubscribersListings $subscribersListings,
|
||||||
@ -100,6 +104,7 @@ class Subscribers extends APIEndpoint {
|
|||||||
Unsubscribes $unsubscribesTracker,
|
Unsubscribes $unsubscribesTracker,
|
||||||
SubscribersRepository $subscribersRepository,
|
SubscribersRepository $subscribersRepository,
|
||||||
SubscribersResponseBuilder $subscribersResponseBuilder,
|
SubscribersResponseBuilder $subscribersResponseBuilder,
|
||||||
|
SubscriberListingRepository $newsletterListingRepository,
|
||||||
FieldNameObfuscator $fieldNameObfuscator
|
FieldNameObfuscator $fieldNameObfuscator
|
||||||
) {
|
) {
|
||||||
$this->bulkActionController = $bulkActionController;
|
$this->bulkActionController = $bulkActionController;
|
||||||
@ -117,6 +122,7 @@ class Subscribers extends APIEndpoint {
|
|||||||
$this->unsubscribesTracker = $unsubscribesTracker;
|
$this->unsubscribesTracker = $unsubscribesTracker;
|
||||||
$this->subscribersRepository = $subscribersRepository;
|
$this->subscribersRepository = $subscribersRepository;
|
||||||
$this->subscribersResponseBuilder = $subscribersResponseBuilder;
|
$this->subscribersResponseBuilder = $subscribersResponseBuilder;
|
||||||
|
$this->newsletterListingRepository = $newsletterListingRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function get($data = []) {
|
public function get($data = []) {
|
||||||
@ -131,9 +137,18 @@ class Subscribers extends APIEndpoint {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function listing($data = []) {
|
public function listing($data = []) {
|
||||||
|
|
||||||
if (!isset($data['filter']['segment'])) {
|
if (!isset($data['filter']['segment'])) {
|
||||||
$listingData = $this->listingHandler->get('\MailPoet\Models\Subscriber', $data);
|
$definition = $this->listingHandler->getListingDefinition($data);
|
||||||
|
$items = $this->newsletterListingRepository->getData($definition);
|
||||||
|
$count = $this->newsletterListingRepository->getCount($definition);
|
||||||
|
$filters = $this->newsletterListingRepository->getFilters($definition);
|
||||||
|
$groups = $this->newsletterListingRepository->getGroups($definition);
|
||||||
|
|
||||||
|
return $this->successResponse($this->subscribersResponseBuilder->buildForListing($items), [
|
||||||
|
'count' => $count,
|
||||||
|
'filters' => $filters,
|
||||||
|
'groups' => $groups,
|
||||||
|
]);
|
||||||
} else {
|
} else {
|
||||||
$listingData = $this->subscribersListings->getListingsInSegment($data);
|
$listingData = $this->subscribersListings->getListingsInSegment($data);
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
namespace MailPoet\Subscribers;
|
namespace MailPoet\Subscribers;
|
||||||
|
|
||||||
use MailPoet\Entities\SubscriberEntity;
|
use MailPoet\Entities\SubscriberEntity;
|
||||||
|
use MailPoet\Listing\ListingDefinition;
|
||||||
use MailPoet\Listing\ListingRepository;
|
use MailPoet\Listing\ListingRepository;
|
||||||
use MailPoetVendor\Doctrine\ORM\QueryBuilder;
|
use MailPoetVendor\Doctrine\ORM\QueryBuilder;
|
||||||
|
|
||||||
@ -59,4 +60,12 @@ class SubscriberListingRepository extends ListingRepository {
|
|||||||
$queryBuilder->addOrderBy("s.$sortBy", $sortOrder);
|
$queryBuilder->addOrderBy("s.$sortBy", $sortOrder);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getGroups(ListingDefinition $definition): array {
|
||||||
|
return [];// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getFilters(ListingDefinition $definition): array {
|
||||||
|
return [];//TODO
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user