Use NewslettersListingRepository for newsletter filters

[MAILPOET-2645]
This commit is contained in:
Jan Jakeš
2020-02-27 17:13:13 +01:00
committed by Jack Kitterhing
parent 51882b43cf
commit b4bcc5179c
2 changed files with 49 additions and 1 deletions

View File

@ -524,7 +524,7 @@ class Newsletters extends APIEndpoint {
$definition = $this->listingHandler->getListingDefinition($data);
$items = $this->newsletterListingRepository->getData($definition);
$count = $this->newsletterListingRepository->getCount($definition);
$filters = Newsletter::filters($data);
$filters = $this->newsletterListingRepository->getFilters($definition);
$groups = Newsletter::groups($data);
$data = [];

View File

@ -3,7 +3,9 @@
namespace MailPoet\Newsletter\Listing;
use MailPoet\Entities\NewsletterEntity;
use MailPoet\Listing\ListingDefinition;
use MailPoet\Listing\ListingRepository;
use MailPoet\WP\Functions as WPFunctions;
use MailPoetVendor\Doctrine\ORM\QueryBuilder;
class NewsletterListingRepository extends ListingRepository {
@ -23,6 +25,52 @@ class NewsletterListingRepository extends ListingRepository {
NewsletterEntity::TYPE_NOTIFICATION_HISTORY,
];
public function getFilters(ListingDefinition $definition): array {
$group = $definition->getGroup();
$typeParam = $definition->getParameters()['type'] ?? null;
$groupParam = $definition->getParameters()['group'] ?? null;
// newsletter types without filters
if (in_array($typeParam, [NewsletterEntity::TYPE_NOTIFICATION_HISTORY])) {
return [];
}
$queryBuilder = clone $this->queryBuilder;
$this->applyFromClause($queryBuilder);
if ($group) {
$this->applyGroup($queryBuilder, $group);
}
if ($typeParam) {
$this->applyType($queryBuilder, $typeParam, $groupParam);
}
$queryBuilder
->select('s.id, s.name, COUNT(n) AS newsletterCount')
->join('n.newsletterSegments', 'ns')
->join('ns.segment', 's')
->groupBy('s.id')
->orderBy('s.name')
->having('COUNT(n) > 0');
// format segment list
$segmentList = [
[
'label' => WPFunctions::get()->__('All Lists', 'mailpoet'),
'value' => '',
],
];
foreach ($queryBuilder->getQuery()->getResult() as $item) {
$segmentList[] = [
'label' => sprintf('%s (%d)', $item['name'], $item['newsletterCount']),
'value' => $item['id'],
];
}
return ['segments' => $segmentList];
}
protected function applySelectClause(QueryBuilder $queryBuilder) {
$queryBuilder->select("PARTIAL n.{id,subject,hash,type,status,sentAt,updatedAt,deletedAt}");
}