Add tag filter into subscribers response

[MAILPOET-4442]
This commit is contained in:
Jan Lysý
2022-08-03 13:59:16 +02:00
committed by Veljko V
parent 5445bf9305
commit 2b5d089a79
2 changed files with 69 additions and 15 deletions

View File

@@ -4,6 +4,7 @@ namespace MailPoet\Subscribers;
use MailPoet\Entities\SegmentEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Entities\TagEntity;
use MailPoet\Listing\ListingDefinition;
use MailPoet\Listing\ListingRepository;
use MailPoet\Segments\DynamicSegments\FilterHandler;
@@ -131,21 +132,24 @@ class SubscriberListingRepository extends ListingRepository {
}
protected function applyFilters(QueryBuilder $queryBuilder, array $filters) {
if (!isset($filters['segment'])) {
return;
if (isset($filters['segment'])) {
if ($filters['segment'] === self::FILTER_WITHOUT_LIST) {
$this->segmentSubscribersRepository->addConstraintsForSubscribersWithoutSegment($queryBuilder);
} else {
$segment = $this->entityManager->find(SegmentEntity::class, (int)$filters['segment']);
if ($segment instanceof SegmentEntity && $segment->isStatic()) {
$queryBuilder->join('s.subscriberSegments', 'ss', Join::WITH, 'ss.segment = :ssSegment')
->setParameter('ssSegment', $segment->getId());
}
}
}
if ($filters['segment'] === self::FILTER_WITHOUT_LIST) {
$this->segmentSubscribersRepository->addConstraintsForSubscribersWithoutSegment($queryBuilder);
return;
}
$segment = $this->entityManager->find(SegmentEntity::class, (int)$filters['segment']);
if (!$segment instanceof SegmentEntity) {
return;
}
if ($segment->isStatic()) {
$queryBuilder->join('s.subscriberSegments', 'ss', Join::WITH, 'ss.segment = :ssSegment')
->setParameter('ssSegment', $segment->getId());
return;
if (isset($filters['tag'])) {
$tag = $this->entityManager->find(TagEntity::class, (int)$filters['tag']);
if ($tag) {
$queryBuilder->join('s.subscriberTags', 'st', Join::WITH, 'st.tag = :stTag')
->setParameter('stTag', $tag);
}
}
}
@@ -231,6 +235,16 @@ class SubscriberListingRepository extends ListingRepository {
}
public function getFilters(ListingDefinition $definition): array {
return [
'segment' => $this->getSegmentFilter($definition),
'tag' => $this->getTagsFilter($definition),
];
}
/**
* @return array<array{label: string, value: string|int}>
*/
private function getSegmentFilter(ListingDefinition $definition): array {
$group = $definition->getGroup();
$subscribersWithoutSegmentStats = $this->subscribersCountsController->getSubscribersWithoutSegmentStatisticsCount();
@@ -283,7 +297,34 @@ class SubscriberListingRepository extends ListingRepository {
});
array_unshift($segmentList, $allSubscribersList, $withoutSegmentList);
return ['segment' => $segmentList];
return $segmentList;
}
/**
* @return array<int, array{label: string, value: string|int}>
*/
private function getTagsFilter(ListingDefinition $definition): array {
$group = $definition->getGroup();
$allTagsList = [
'label' => WPFunctions::get()->__('All Tags', 'mailpoet'),
'value' => '',
];
$status = in_array($group, ['all', 'trash']) ? null : $group;
$isDeleted = $group === 'trash';
$tagsStatistics = $this->subscribersCountsController->getTagsStatisticsCount($status, $isDeleted);
$tagsList = [];
foreach ($tagsStatistics as $tagStatistics) {
$tagsList[] = [
'label' => sprintf('%s (%s)', $tagStatistics['name'], number_format((float)$tagStatistics['subscribersCount'])),
'value' => $tagStatistics['id'],
];
}
array_unshift($tagsList, $allTagsList);
return $tagsList;
}
private function getDataForDynamicSegment(ListingDefinition $definition, SegmentEntity $segment) {

View File

@@ -7,6 +7,7 @@ use MailPoet\Entities\SegmentEntity;
use MailPoet\InvalidStateException;
use MailPoet\Segments\SegmentsRepository;
use MailPoet\Segments\SegmentSubscribersRepository;
use MailPoet\Tags\TagRepository;
class SubscribersCountsController {
/** @var SegmentsRepository */
@@ -15,18 +16,23 @@ class SubscribersCountsController {
/** @var SegmentSubscribersRepository */
private $segmentSubscribersRepository;
/** @var TagRepository */
private $tagRepository;
/** @var TransientCache */
private $transientCache;
public function __construct(
SegmentsRepository $segmentsRepository,
SegmentSubscribersRepository $segmentSubscribersRepository,
TagRepository $subscriberTagRepository,
TransientCache $transientCache
) {
$this->segmentSubscribersRepository = $segmentSubscribersRepository;
$this->transientCache = $transientCache;
$this->segmentsRepository = $segmentsRepository;
$this->tagRepository = $subscriberTagRepository;
}
public function getSubscribersWithoutSegmentStatisticsCount(): array {
@@ -107,4 +113,11 @@ class SubscribersCountsController {
}
}
}
/**
* @return array<int, array{id: int, name: string, subscribersCount: int}>
*/
public function getTagsStatisticsCount(?string $status, bool $isDeleted): array {
return $this->tagRepository->getSubscriberStatisticsCount($status, $isDeleted);
}
}