diff --git a/lib/API/JSON/v1/Segments.php b/lib/API/JSON/v1/Segments.php index 76fd9687f0..73dfd20641 100644 --- a/lib/API/JSON/v1/Segments.php +++ b/lib/API/JSON/v1/Segments.php @@ -12,6 +12,7 @@ use MailPoet\Entities\SegmentEntity; use MailPoet\Entities\SubscriberEntity; use MailPoet\Listing; use MailPoet\Models\Segment; +use MailPoet\Newsletter\Segment\NewsletterSegmentRepository; use MailPoet\Segments\SegmentSaveController; use MailPoet\Segments\SegmentsRepository; use MailPoet\Segments\WooCommerce; @@ -42,6 +43,9 @@ class Segments extends APIEndpoint { /** @var SubscribersRepository */ private $subscribersRepository; + /** @var NewsletterSegmentRepository */ + private $newsletterSegmentRepository; + /** @var WooCommerce */ private $wooCommerceSync; @@ -55,6 +59,7 @@ class Segments extends APIEndpoint { SegmentsResponseBuilder $segmentsResponseBuilder, SegmentSaveController $segmentSavecontroller, SubscribersRepository $subscribersRepository, + NewsletterSegmentRepository $newsletterSegmentRepository, WooCommerce $wooCommerce, WP $wpSegment ) { @@ -65,6 +70,7 @@ class Segments extends APIEndpoint { $this->segmentsResponseBuilder = $segmentsResponseBuilder; $this->segmentSavecontroller = $segmentSavecontroller; $this->subscribersRepository = $subscribersRepository; + $this->newsletterSegmentRepository = $newsletterSegmentRepository; $this->wpSegment = $wpSegment; } @@ -84,15 +90,24 @@ class Segments extends APIEndpoint { $listingData = $this->listingHandler->get('\MailPoet\Models\Segment', $data); $data = []; + $segmendIds = array_map(function(Segment $segment): int { + return (int)$segment->id; + }, $listingData['items']); + $scheduledNewsletterSubjectsMap = $this->newsletterSegmentRepository->getScheduledNewsletterSubjectsBySegmentIds($segmendIds); + foreach ($listingData['items'] as $segment) { $segment->subscribersUrl = WPFunctions::get()->adminUrl( 'admin.php?page=mailpoet-subscribers#/filter[segment=' . $segment->id . ']' ); - $data[] = $segment + $segmentData = $segment ->withSubscribersCount() ->withAutomatedEmailsSubjects() ->asArray(); + + $segmentData['scheduled_emails_subjects'] = $scheduledNewsletterSubjectsMap[$segment->id] ?? []; + + $data[] = $segmentData; } return $this->successResponse($data, [ diff --git a/lib/Newsletter/Segment/NewsletterSegmentRepository.php b/lib/Newsletter/Segment/NewsletterSegmentRepository.php index 4652f35409..6dae7395f0 100644 --- a/lib/Newsletter/Segment/NewsletterSegmentRepository.php +++ b/lib/Newsletter/Segment/NewsletterSegmentRepository.php @@ -3,6 +3,7 @@ namespace MailPoet\Newsletter\Segment; use MailPoet\Doctrine\Repository; +use MailPoet\Entities\NewsletterEntity; use MailPoet\Entities\NewsletterSegmentEntity; /** @@ -12,4 +13,22 @@ class NewsletterSegmentRepository extends Repository { protected function getEntityClassName() { return NewsletterSegmentEntity::class; } + + public function getScheduledNewsletterSubjectsBySegmentIds(array $segmentIds): array { + $results = $this->doctrineRepository->createQueryBuilder('ns') + ->select('IDENTITY(ns.segment) AS segment_id, n.subject') + ->join('ns.newsletter', 'n') + ->where('n.status = :scheduled') + ->andWhere('ns.segment IN (:segmentIds)') + ->setParameter('scheduled', NewsletterEntity::STATUS_SCHEDULED) + ->setParameter('segmentIds', $segmentIds) + ->getQuery() + ->getResult(); + + $nameMap = []; + foreach ($results as $result) { + $nameMap[(string)$result['segment_id']][] = $result['subject']; + } + return $nameMap; + } }