diff --git a/lib/API/JSON/v1/DynamicSegments.php b/lib/API/JSON/v1/DynamicSegments.php index fffc4bf673..757f63ac6f 100644 --- a/lib/API/JSON/v1/DynamicSegments.php +++ b/lib/API/JSON/v1/DynamicSegments.php @@ -12,8 +12,10 @@ use MailPoet\Entities\SegmentEntity; use MailPoet\Listing\Handler; use MailPoet\Segments\DynamicSegments\DynamicSegmentsListingRepository; use MailPoet\Segments\DynamicSegments\Exceptions\InvalidFilterException; +use MailPoet\Segments\DynamicSegments\FilterDataMapper; use MailPoet\Segments\DynamicSegments\SegmentSaveController; use MailPoet\Segments\SegmentsRepository; +use MailPoet\Segments\SegmentSubscribersRepository; use MailPoet\UnexpectedValueException; use MailPoet\WP\Functions as WPFunctions; @@ -38,11 +40,19 @@ class DynamicSegments extends APIEndpoint { /** @var SegmentSaveController */ private $saveController; + /** @var SegmentSubscribersRepository */ + private $segmentSubscribersRepository; + + /** @var FilterDataMapper */ + private $filterDataMapper; + public function __construct( Handler $handler, DynamicSegmentsListingRepository $dynamicSegmentsListingRepository, DynamicSegmentsResponseBuilder $segmentsResponseBuilder, SegmentsRepository $segmentsRepository, + SegmentSubscribersRepository $segmentSubscribersRepository, + FilterDataMapper $filterDataMapper, SegmentSaveController $saveController ) { $this->listingHandler = $handler; @@ -50,6 +60,8 @@ class DynamicSegments extends APIEndpoint { $this->segmentsResponseBuilder = $segmentsResponseBuilder; $this->segmentsRepository = $segmentsRepository; $this->saveController = $saveController; + $this->segmentSubscribersRepository = $segmentSubscribersRepository; + $this->filterDataMapper = $filterDataMapper; } public function get($data = []) { @@ -71,6 +83,20 @@ class DynamicSegments extends APIEndpoint { return $this->successResponse($this->segmentsResponseBuilder->build($segment)); } + public function getCount($data = []) { + try { + $filterData = $this->filterDataMapper->map($data); + $count = $this->segmentSubscribersRepository->getDynamicSubscribersCount($filterData); + return $this->successResponse([ + 'count' => $count, + ]); + } catch (InvalidFilterException $e) { + return $this->errorResponse([ + Error::BAD_REQUEST => $this->getErrorString($e), + ], [], Response::STATUS_BAD_REQUEST); + } + } + public function save($data) { try { $segment = $this->saveController->save($data); diff --git a/lib/Segments/SegmentSubscribersRepository.php b/lib/Segments/SegmentSubscribersRepository.php index dead42b1e8..cae534c078 100644 --- a/lib/Segments/SegmentSubscribersRepository.php +++ b/lib/Segments/SegmentSubscribersRepository.php @@ -2,6 +2,7 @@ namespace MailPoet\Segments; +use MailPoet\Entities\DynamicSegmentFilterData; use MailPoet\Entities\SegmentEntity; use MailPoet\Entities\SubscriberEntity; use MailPoet\Entities\SubscriberSegmentEntity; @@ -85,6 +86,18 @@ class SegmentSubscribersRepository { return (int)$result; } + public function getDynamicSubscribersCount(DynamicSegmentFilterData $data): int { + $subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName(); + $queryBuilder = $this->entityManager->getConnection()->createQueryBuilder(); + $queryBuilder + ->select("COUNT(DISTINCT {$subscribersTable}.id) AS count") + ->from($subscribersTable, $subscribersTable); + $queryBuilder = $this->filterHandler->apply($queryBuilder, $data); + $statement = $this->executeQuery($queryBuilder); + $result = $statement->fetchColumn(); + return (int)$result; + } + public function getSubscribersWithoutSegmentCount(): int { $queryBuilder = $this->getSubscribersWithoutSegmentCountQuery(); return (int)$queryBuilder->getQuery()->getSingleScalarResult();