Add scheduled emails subjects into segments API response

[MAILPOET-3142]
This commit is contained in:
Jan Lysý
2021-01-04 13:55:10 +01:00
committed by Veljko V
parent 9fbff78291
commit 8f41628d29
2 changed files with 35 additions and 1 deletions

View File

@ -12,6 +12,7 @@ use MailPoet\Entities\SegmentEntity;
use MailPoet\Entities\SubscriberEntity; 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\Segments\SegmentSaveController; use MailPoet\Segments\SegmentSaveController;
use MailPoet\Segments\SegmentsRepository; use MailPoet\Segments\SegmentsRepository;
use MailPoet\Segments\WooCommerce; use MailPoet\Segments\WooCommerce;
@ -42,6 +43,9 @@ class Segments extends APIEndpoint {
/** @var SubscribersRepository */ /** @var SubscribersRepository */
private $subscribersRepository; private $subscribersRepository;
/** @var NewsletterSegmentRepository */
private $newsletterSegmentRepository;
/** @var WooCommerce */ /** @var WooCommerce */
private $wooCommerceSync; private $wooCommerceSync;
@ -55,6 +59,7 @@ class Segments extends APIEndpoint {
SegmentsResponseBuilder $segmentsResponseBuilder, SegmentsResponseBuilder $segmentsResponseBuilder,
SegmentSaveController $segmentSavecontroller, SegmentSaveController $segmentSavecontroller,
SubscribersRepository $subscribersRepository, SubscribersRepository $subscribersRepository,
NewsletterSegmentRepository $newsletterSegmentRepository,
WooCommerce $wooCommerce, WooCommerce $wooCommerce,
WP $wpSegment WP $wpSegment
) { ) {
@ -65,6 +70,7 @@ class Segments extends APIEndpoint {
$this->segmentsResponseBuilder = $segmentsResponseBuilder; $this->segmentsResponseBuilder = $segmentsResponseBuilder;
$this->segmentSavecontroller = $segmentSavecontroller; $this->segmentSavecontroller = $segmentSavecontroller;
$this->subscribersRepository = $subscribersRepository; $this->subscribersRepository = $subscribersRepository;
$this->newsletterSegmentRepository = $newsletterSegmentRepository;
$this->wpSegment = $wpSegment; $this->wpSegment = $wpSegment;
} }
@ -84,15 +90,24 @@ class Segments extends APIEndpoint {
$listingData = $this->listingHandler->get('\MailPoet\Models\Segment', $data); $listingData = $this->listingHandler->get('\MailPoet\Models\Segment', $data);
$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) { foreach ($listingData['items'] as $segment) {
$segment->subscribersUrl = WPFunctions::get()->adminUrl( $segment->subscribersUrl = WPFunctions::get()->adminUrl(
'admin.php?page=mailpoet-subscribers#/filter[segment=' . $segment->id . ']' 'admin.php?page=mailpoet-subscribers#/filter[segment=' . $segment->id . ']'
); );
$data[] = $segment $segmentData = $segment
->withSubscribersCount() ->withSubscribersCount()
->withAutomatedEmailsSubjects() ->withAutomatedEmailsSubjects()
->asArray(); ->asArray();
$segmentData['scheduled_emails_subjects'] = $scheduledNewsletterSubjectsMap[$segment->id] ?? [];
$data[] = $segmentData;
} }
return $this->successResponse($data, [ return $this->successResponse($data, [

View File

@ -3,6 +3,7 @@
namespace MailPoet\Newsletter\Segment; namespace MailPoet\Newsletter\Segment;
use MailPoet\Doctrine\Repository; use MailPoet\Doctrine\Repository;
use MailPoet\Entities\NewsletterEntity;
use MailPoet\Entities\NewsletterSegmentEntity; use MailPoet\Entities\NewsletterSegmentEntity;
/** /**
@ -12,4 +13,22 @@ class NewsletterSegmentRepository extends Repository {
protected function getEntityClassName() { protected function getEntityClassName() {
return NewsletterSegmentEntity::class; 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;
}
} }