diff --git a/lib/API/JSON/ResponseBuilders/SegmentsResponseBuilder.php b/lib/API/JSON/ResponseBuilders/SegmentsResponseBuilder.php index e63869dbff..e4921c846b 100644 --- a/lib/API/JSON/ResponseBuilders/SegmentsResponseBuilder.php +++ b/lib/API/JSON/ResponseBuilders/SegmentsResponseBuilder.php @@ -21,4 +21,26 @@ class SegmentsResponseBuilder { '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 + ]; + } } diff --git a/lib/API/JSON/v1/Segments.php b/lib/API/JSON/v1/Segments.php index 73dfd20641..57bdbc5d37 100644 --- a/lib/API/JSON/v1/Segments.php +++ b/lib/API/JSON/v1/Segments.php @@ -13,6 +13,7 @@ use MailPoet\Entities\SubscriberEntity; use MailPoet\Listing; use MailPoet\Models\Segment; use MailPoet\Newsletter\Segment\NewsletterSegmentRepository; +use MailPoet\Segments\SegmentListingRepository; use MailPoet\Segments\SegmentSaveController; use MailPoet\Segments\SegmentsRepository; use MailPoet\Segments\WooCommerce; @@ -52,10 +53,14 @@ class Segments extends APIEndpoint { /** @var WP */ private $wpSegment; + /** @var SegmentListingRepository */ + private $segmentListingRepository; + public function __construct( Listing\BulkActionController $bulkAction, Listing\Handler $listingHandler, SegmentsRepository $segmentsRepository, + SegmentListingRepository $segmentListingRepository, SegmentsResponseBuilder $segmentsResponseBuilder, SegmentSaveController $segmentSavecontroller, SubscribersRepository $subscribersRepository, @@ -72,6 +77,7 @@ class Segments extends APIEndpoint { $this->subscribersRepository = $subscribersRepository; $this->newsletterSegmentRepository = $newsletterSegmentRepository; $this->wpSegment = $wpSegment; + $this->segmentListingRepository = $segmentListingRepository; } public function get($data = []) { @@ -87,33 +93,32 @@ class Segments extends APIEndpoint { } 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 = []; - $segmendIds = array_map(function(Segment $segment): int { - return (int)$segment->id; - }, $listingData['items']); - $scheduledNewsletterSubjectsMap = $this->newsletterSegmentRepository->getScheduledNewsletterSubjectsBySegmentIds($segmendIds); +// $data = []; +// foreach ($listingData['items'] as $segment) { +// $scheduledNewsletterSubjectsMap = $this->newsletterSegmentRepository->getScheduledNewsletterSubjectsBySegmentIds($segmendIds); +// $segment->subscribersUrl = WPFunctions::get()->adminUrl( +// '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) { - $segment->subscribersUrl = WPFunctions::get()->adminUrl( - 'admin.php?page=mailpoet-subscribers#/filter[segment=' . $segment->id . ']' - ); - - $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'], + return $this->successResponse($segments, [ + 'count' => $count, + 'filters' => $filters, + 'groups' => $groups, ]); } diff --git a/lib/DI/ContainerConfigurator.php b/lib/DI/ContainerConfigurator.php index 141cd8b41d..68967a9a5f 100644 --- a/lib/DI/ContainerConfigurator.php +++ b/lib/DI/ContainerConfigurator.php @@ -255,6 +255,7 @@ class ContainerConfigurator implements IContainerConfigurator { $container->autowire(\MailPoet\Segments\SubscribersFinder::class)->setPublic(true); $container->autowire(\MailPoet\Segments\SegmentsRepository::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\DynamicSegments\FilterHandler::class)->setPublic(true); $container->autowire(\MailPoet\Segments\DynamicSegments\Filters\EmailAction::class)->setPublic(true); diff --git a/lib/Segments/SegmentListingRepository.php b/lib/Segments/SegmentListingRepository.php new file mode 100644 index 0000000000..518e231748 --- /dev/null +++ b/lib/Segments/SegmentListingRepository.php @@ -0,0 +1,51 @@ +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); + } +}