Refactor segments listings to doctrine
[MAILPOET-3168]
This commit is contained in:
@ -21,4 +21,26 @@ class SegmentsResponseBuilder {
|
|||||||
'deleted_at' => ($deletedAt = $segment->getDeletedAt()) ? $deletedAt->format(self::DATE_FORMAT) : null,
|
'deleted_at' => ($deletedAt = $segment->getDeletedAt()) ? $deletedAt->format(self::DATE_FORMAT) : null,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function buildForListing(array $segments): array {
|
||||||
|
$data = [];
|
||||||
|
foreach ($segments as $segment) {
|
||||||
|
$data[] = $this->buildListingItem($segment);
|
||||||
|
}
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function buildListingItem(SegmentEntity $segment): array {
|
||||||
|
return [
|
||||||
|
'id' => (string)$segment->getId(), // (string) for BC
|
||||||
|
'name' => $segment->getName(),
|
||||||
|
'type' => $segment->getType(),
|
||||||
|
'description' => $segment->getDescription(),
|
||||||
|
'created_at' => $segment->getCreatedAt()->format(self::DATE_FORMAT),
|
||||||
|
'updated_at' => $segment->getUpdatedAt()->format(self::DATE_FORMAT),
|
||||||
|
'deleted_at' => ($deletedAt = $segment->getDeletedAt()) ? $deletedAt->format(self::DATE_FORMAT) : null,
|
||||||
|
'automated_emails_subjects' => [], // TODO
|
||||||
|
'subscribers_count' => [], // TODO
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,7 @@ use MailPoet\Entities\SubscriberEntity;
|
|||||||
use MailPoet\Listing;
|
use MailPoet\Listing;
|
||||||
use MailPoet\Models\Segment;
|
use MailPoet\Models\Segment;
|
||||||
use MailPoet\Newsletter\Segment\NewsletterSegmentRepository;
|
use MailPoet\Newsletter\Segment\NewsletterSegmentRepository;
|
||||||
|
use MailPoet\Segments\SegmentListingRepository;
|
||||||
use MailPoet\Segments\SegmentSaveController;
|
use MailPoet\Segments\SegmentSaveController;
|
||||||
use MailPoet\Segments\SegmentsRepository;
|
use MailPoet\Segments\SegmentsRepository;
|
||||||
use MailPoet\Segments\WooCommerce;
|
use MailPoet\Segments\WooCommerce;
|
||||||
@ -52,10 +53,14 @@ class Segments extends APIEndpoint {
|
|||||||
/** @var WP */
|
/** @var WP */
|
||||||
private $wpSegment;
|
private $wpSegment;
|
||||||
|
|
||||||
|
/** @var SegmentListingRepository */
|
||||||
|
private $segmentListingRepository;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
Listing\BulkActionController $bulkAction,
|
Listing\BulkActionController $bulkAction,
|
||||||
Listing\Handler $listingHandler,
|
Listing\Handler $listingHandler,
|
||||||
SegmentsRepository $segmentsRepository,
|
SegmentsRepository $segmentsRepository,
|
||||||
|
SegmentListingRepository $segmentListingRepository,
|
||||||
SegmentsResponseBuilder $segmentsResponseBuilder,
|
SegmentsResponseBuilder $segmentsResponseBuilder,
|
||||||
SegmentSaveController $segmentSavecontroller,
|
SegmentSaveController $segmentSavecontroller,
|
||||||
SubscribersRepository $subscribersRepository,
|
SubscribersRepository $subscribersRepository,
|
||||||
@ -72,6 +77,7 @@ class Segments extends APIEndpoint {
|
|||||||
$this->subscribersRepository = $subscribersRepository;
|
$this->subscribersRepository = $subscribersRepository;
|
||||||
$this->newsletterSegmentRepository = $newsletterSegmentRepository;
|
$this->newsletterSegmentRepository = $newsletterSegmentRepository;
|
||||||
$this->wpSegment = $wpSegment;
|
$this->wpSegment = $wpSegment;
|
||||||
|
$this->segmentListingRepository = $segmentListingRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function get($data = []) {
|
public function get($data = []) {
|
||||||
@ -87,33 +93,32 @@ class Segments extends APIEndpoint {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function listing($data = []) {
|
public function listing($data = []) {
|
||||||
$listingData = $this->listingHandler->get('\MailPoet\Models\Segment', $data);
|
$definition = $this->listingHandler->getListingDefinition($data);
|
||||||
|
$items = $this->segmentListingRepository->getData($definition);
|
||||||
|
$count = $this->segmentListingRepository->getCount($definition);
|
||||||
|
$filters = $this->segmentListingRepository->getFilters($definition);
|
||||||
|
$groups = $this->segmentListingRepository->getGroups($definition);
|
||||||
|
$segments = $this->segmentsResponseBuilder->buildForListing($items);
|
||||||
|
|
||||||
$data = [];
|
// $data = [];
|
||||||
$segmendIds = array_map(function(Segment $segment): int {
|
// foreach ($listingData['items'] as $segment) {
|
||||||
return (int)$segment->id;
|
// $scheduledNewsletterSubjectsMap = $this->newsletterSegmentRepository->getScheduledNewsletterSubjectsBySegmentIds($segmendIds);
|
||||||
}, $listingData['items']);
|
// $segment->subscribersUrl = WPFunctions::get()->adminUrl(
|
||||||
$scheduledNewsletterSubjectsMap = $this->newsletterSegmentRepository->getScheduledNewsletterSubjectsBySegmentIds($segmendIds);
|
// 'admin.php?page=mailpoet-subscribers#/filter[segment=' . $segment->id . ']'
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
// $segmentData = $segment
|
||||||
|
// ->withSubscribersCount()
|
||||||
|
// ->withAutomatedEmailsSubjects()
|
||||||
|
// ->asArray();
|
||||||
|
// $segmentData['scheduled_emails_subjects'] = $scheduledNewsletterSubjectsMap[$segment->id] ?? [];
|
||||||
|
//$data[] = $segmentData;
|
||||||
|
// }
|
||||||
|
|
||||||
foreach ($listingData['items'] as $segment) {
|
return $this->successResponse($segments, [
|
||||||
$segment->subscribersUrl = WPFunctions::get()->adminUrl(
|
'count' => $count,
|
||||||
'admin.php?page=mailpoet-subscribers#/filter[segment=' . $segment->id . ']'
|
'filters' => $filters,
|
||||||
);
|
'groups' => $groups,
|
||||||
|
|
||||||
$segmentData = $segment
|
|
||||||
->withSubscribersCount()
|
|
||||||
->withAutomatedEmailsSubjects()
|
|
||||||
->asArray();
|
|
||||||
|
|
||||||
$segmentData['scheduled_emails_subjects'] = $scheduledNewsletterSubjectsMap[$segment->id] ?? [];
|
|
||||||
|
|
||||||
$data[] = $segmentData;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->successResponse($data, [
|
|
||||||
'count' => $listingData['count'],
|
|
||||||
'filters' => $listingData['filters'],
|
|
||||||
'groups' => $listingData['groups'],
|
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -255,6 +255,7 @@ class ContainerConfigurator implements IContainerConfigurator {
|
|||||||
$container->autowire(\MailPoet\Segments\SubscribersFinder::class)->setPublic(true);
|
$container->autowire(\MailPoet\Segments\SubscribersFinder::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\Segments\SegmentsRepository::class)->setPublic(true);
|
$container->autowire(\MailPoet\Segments\SegmentsRepository::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\Segments\SegmentSubscribersRepository::class)->setPublic(true);
|
$container->autowire(\MailPoet\Segments\SegmentSubscribersRepository::class)->setPublic(true);
|
||||||
|
$container->autowire(\MailPoet\Segments\SegmentListingRepository::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\Segments\SegmentSaveController::class)->setPublic(true);
|
$container->autowire(\MailPoet\Segments\SegmentSaveController::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\Segments\DynamicSegments\FilterHandler::class)->setPublic(true);
|
$container->autowire(\MailPoet\Segments\DynamicSegments\FilterHandler::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\Segments\DynamicSegments\Filters\EmailAction::class)->setPublic(true);
|
$container->autowire(\MailPoet\Segments\DynamicSegments\Filters\EmailAction::class)->setPublic(true);
|
||||||
|
51
lib/Segments/SegmentListingRepository.php
Normal file
51
lib/Segments/SegmentListingRepository.php
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace MailPoet\Segments;
|
||||||
|
|
||||||
|
use MailPoet\Entities\SegmentEntity;
|
||||||
|
use MailPoet\Listing\ListingRepository;
|
||||||
|
use MailPoet\Util\Helpers;
|
||||||
|
use MailPoetVendor\Doctrine\ORM\QueryBuilder;
|
||||||
|
|
||||||
|
class SegmentListingRepository extends ListingRepository {
|
||||||
|
const DEFAULT_SORT_BY = 'name';
|
||||||
|
|
||||||
|
protected function applySelectClause(QueryBuilder $queryBuilder) {
|
||||||
|
$queryBuilder->select("PARTIAL s.{id,name,type,description,createdAt,updatedAt,deletedAt}");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function applyFromClause(QueryBuilder $queryBuilder) {
|
||||||
|
$queryBuilder->from(SegmentEntity::class, 's');
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function applyGroup(QueryBuilder $queryBuilder, string $group) {
|
||||||
|
if ($group === 'trash') {
|
||||||
|
$queryBuilder->andWhere('s.deletedAt IS NOT NULL');
|
||||||
|
} else {
|
||||||
|
$queryBuilder->andWhere('s.deletedAt IS NULL');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function applySearch(QueryBuilder $queryBuilder, string $search) {
|
||||||
|
$search = Helpers::escapeSearch($search);
|
||||||
|
$queryBuilder
|
||||||
|
->andWhere('s.name LIKE :search or s.description LIKE :search')
|
||||||
|
->setParameter('search', "%$search%");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function applyFilters(QueryBuilder $queryBuilder, array $filters) {
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function applyParameters(QueryBuilder $queryBuilder, array $parameters) {
|
||||||
|
$queryBuilder
|
||||||
|
->andWhere('s.type IN (:type)')
|
||||||
|
->setParameter('type', [SegmentEntity::TYPE_DEFAULT, SegmentEntity::TYPE_WC_USERS, SegmentEntity::TYPE_WP_USERS]);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function applySorting(QueryBuilder $queryBuilder, string $sortBy, string $sortOrder) {
|
||||||
|
if (!$sortBy) {
|
||||||
|
$sortBy = self::DEFAULT_SORT_BY;
|
||||||
|
}
|
||||||
|
$queryBuilder->addOrderBy("s.$sortBy", $sortOrder);
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user