Add method for returning count of dynamic subscribers

[MAILPOET-3219]
This commit is contained in:
Jan Lysý
2021-03-11 14:11:11 +01:00
committed by Veljko V
parent 800eaacb16
commit e4eab6cbae
2 changed files with 39 additions and 0 deletions

View File

@ -12,8 +12,10 @@ use MailPoet\Entities\SegmentEntity;
use MailPoet\Listing\Handler; use MailPoet\Listing\Handler;
use MailPoet\Segments\DynamicSegments\DynamicSegmentsListingRepository; use MailPoet\Segments\DynamicSegments\DynamicSegmentsListingRepository;
use MailPoet\Segments\DynamicSegments\Exceptions\InvalidFilterException; use MailPoet\Segments\DynamicSegments\Exceptions\InvalidFilterException;
use MailPoet\Segments\DynamicSegments\FilterDataMapper;
use MailPoet\Segments\DynamicSegments\SegmentSaveController; use MailPoet\Segments\DynamicSegments\SegmentSaveController;
use MailPoet\Segments\SegmentsRepository; use MailPoet\Segments\SegmentsRepository;
use MailPoet\Segments\SegmentSubscribersRepository;
use MailPoet\UnexpectedValueException; use MailPoet\UnexpectedValueException;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
@ -38,11 +40,19 @@ class DynamicSegments extends APIEndpoint {
/** @var SegmentSaveController */ /** @var SegmentSaveController */
private $saveController; private $saveController;
/** @var SegmentSubscribersRepository */
private $segmentSubscribersRepository;
/** @var FilterDataMapper */
private $filterDataMapper;
public function __construct( public function __construct(
Handler $handler, Handler $handler,
DynamicSegmentsListingRepository $dynamicSegmentsListingRepository, DynamicSegmentsListingRepository $dynamicSegmentsListingRepository,
DynamicSegmentsResponseBuilder $segmentsResponseBuilder, DynamicSegmentsResponseBuilder $segmentsResponseBuilder,
SegmentsRepository $segmentsRepository, SegmentsRepository $segmentsRepository,
SegmentSubscribersRepository $segmentSubscribersRepository,
FilterDataMapper $filterDataMapper,
SegmentSaveController $saveController SegmentSaveController $saveController
) { ) {
$this->listingHandler = $handler; $this->listingHandler = $handler;
@ -50,6 +60,8 @@ class DynamicSegments extends APIEndpoint {
$this->segmentsResponseBuilder = $segmentsResponseBuilder; $this->segmentsResponseBuilder = $segmentsResponseBuilder;
$this->segmentsRepository = $segmentsRepository; $this->segmentsRepository = $segmentsRepository;
$this->saveController = $saveController; $this->saveController = $saveController;
$this->segmentSubscribersRepository = $segmentSubscribersRepository;
$this->filterDataMapper = $filterDataMapper;
} }
public function get($data = []) { public function get($data = []) {
@ -71,6 +83,20 @@ class DynamicSegments extends APIEndpoint {
return $this->successResponse($this->segmentsResponseBuilder->build($segment)); 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) { public function save($data) {
try { try {
$segment = $this->saveController->save($data); $segment = $this->saveController->save($data);

View File

@ -2,6 +2,7 @@
namespace MailPoet\Segments; namespace MailPoet\Segments;
use MailPoet\Entities\DynamicSegmentFilterData;
use MailPoet\Entities\SegmentEntity; use MailPoet\Entities\SegmentEntity;
use MailPoet\Entities\SubscriberEntity; use MailPoet\Entities\SubscriberEntity;
use MailPoet\Entities\SubscriberSegmentEntity; use MailPoet\Entities\SubscriberSegmentEntity;
@ -85,6 +86,18 @@ class SegmentSubscribersRepository {
return (int)$result; 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 { public function getSubscribersWithoutSegmentCount(): int {
$queryBuilder = $this->getSubscribersWithoutSegmentCountQuery(); $queryBuilder = $this->getSubscribersWithoutSegmentCountQuery();
return (int)$queryBuilder->getQuery()->getSingleScalarResult(); return (int)$queryBuilder->getQuery()->getSingleScalarResult();