Move groups definitions

[MAILPOET-3168]
This commit is contained in:
Pavel Dohnal
2021-01-05 15:53:42 +01:00
committed by Veljko V
parent 761e57bdd2
commit de6e0e5adb
5 changed files with 96 additions and 38 deletions

View File

@ -12,7 +12,6 @@ use MailPoet\Entities\SegmentEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Listing;
use MailPoet\Models\Segment;
use MailPoet\Newsletter\Segment\NewsletterSegmentRepository;
use MailPoet\Segments\SegmentListingRepository;
use MailPoet\Segments\SegmentSaveController;
use MailPoet\Segments\SegmentsRepository;
@ -44,9 +43,6 @@ class Segments extends APIEndpoint {
/** @var SubscribersRepository */
private $subscribersRepository;
/** @var NewsletterSegmentRepository */
private $newsletterSegmentRepository;
/** @var WooCommerce */
private $wooCommerceSync;
@ -98,15 +94,6 @@ class Segments extends APIEndpoint {
$groups = $this->segmentListingRepository->getGroups($definition);
$segments = $this->segmentsResponseBuilder->buildForListing($items);
// $data = [];
// foreach ($listingData['items'] as $segment) {
//
// $segmentData = $segment
// ->withSubscribersCount()
// ->asArray();
//$data[] = $segmentData;
// }
return $this->successResponse($segments, [
'count' => $count,
'filters' => $filters,

View File

@ -2,7 +2,6 @@
namespace MailPoet\Models;
use MailPoet\Entities\NewsletterEntity;
use MailPoet\Entities\SegmentEntity;
use MailPoet\WooCommerce\Helper as WCHelper;
use MailPoet\WP\Functions as WPFunctions;
@ -162,6 +161,9 @@ class Segment extends Model {
return $wcSegment;
}
/**
* @deprecated Use the non static implementation in \MailPoet\Segments\WooCommerce::shouldShowWooCommerceSegment instead
*/
public static function shouldShowWooCommerceSegment() {
$woocommerceHelper = new WCHelper();
$isWoocommerceActive = $woocommerceHelper->isWooCommerceActive();
@ -189,29 +191,6 @@ class Segment extends Model {
return $types;
}
// TODO REMOVE
public static function groups() {
$allQuery = Segment::getPublished();
$allQuery->whereNotEqual('type', DynamicSegment::TYPE_DYNAMIC);
if (!Segment::shouldShowWooCommerceSegment()) {
$allQuery->whereNotEqual('type', self::TYPE_WC_USERS);
}
return [
[
'name' => 'all',
'label' => WPFunctions::get()->__('All', 'mailpoet'),
'count' => $allQuery->count(),
],
[
'name' => 'trash',
'label' => WPFunctions::get()->__('Trash', 'mailpoet'),
'count' => Segment::getTrashed()
->whereNotEqual('type', DynamicSegment::TYPE_DYNAMIC)
->count(),
],
];
}
public static function groupBy($orm, $group = null) {
if ($group === 'trash') {
$orm->whereNotNull('deleted_at');

View File

@ -3,13 +3,26 @@
namespace MailPoet\Segments;
use MailPoet\Entities\SegmentEntity;
use MailPoet\Listing\ListingDefinition;
use MailPoet\Listing\ListingRepository;
use MailPoet\Util\Helpers;
use MailPoetVendor\Doctrine\ORM\EntityManager;
use MailPoetVendor\Doctrine\ORM\QueryBuilder;
class SegmentListingRepository extends ListingRepository {
const DEFAULT_SORT_BY = 'name';
/** @var WooCommerce */
private $wooCommerce;
public function __construct(
EntityManager $entityManager,
WooCommerce $wooCommerce
) {
parent::__construct($entityManager);
$this->wooCommerce = $wooCommerce;
}
protected function applySelectClause(QueryBuilder $queryBuilder) {
$queryBuilder->select("PARTIAL s.{id,name,type,description,createdAt,updatedAt,deletedAt}");
}
@ -37,9 +50,13 @@ class SegmentListingRepository extends ListingRepository {
}
protected function applyParameters(QueryBuilder $queryBuilder, array $parameters) {
$types = [SegmentEntity::TYPE_DEFAULT, SegmentEntity::TYPE_WP_USERS];
if ($this->wooCommerce->shouldShowWooCommerceSegment()) {
$types[] = SegmentEntity::TYPE_WC_USERS;
}
$queryBuilder
->andWhere('s.type IN (:type)')
->setParameter('type', [SegmentEntity::TYPE_DEFAULT, SegmentEntity::TYPE_WC_USERS, SegmentEntity::TYPE_WP_USERS]);
->setParameter('type', $types);
}
protected function applySorting(QueryBuilder $queryBuilder, string $sortBy, string $sortOrder) {
@ -48,4 +65,40 @@ class SegmentListingRepository extends ListingRepository {
}
$queryBuilder->addOrderBy("s.$sortBy", $sortOrder);
}
public function getGroups(ListingDefinition $definition): array {
$queryBuilder = clone $this->queryBuilder;
$this->applyFromClause($queryBuilder);
$this->applyParameters($queryBuilder, $definition->getParameters());
$queryBuilder->select('count(s.id)');
if (!$this->wooCommerce->shouldShowWooCommerceSegment()) {
$queryBuilder
->andWhere('s.type != :wcUsers')
->setParameter('wcUsers', SegmentEntity::TYPE_WC_USERS);
}
$allQueryBuilder = clone $queryBuilder;
$trashedQueryBuilder = clone $queryBuilder;
$allQueryBuilder->andWhere('s.deletedAt IS NULL');
$allCount = $allQueryBuilder->getQuery()->getSingleScalarResult();
$trashedQueryBuilder->andWhere('s.deletedAt IS NOT NULL');
$trashedCount = $trashedQueryBuilder->getQuery()->getSingleScalarResult();
return [
[
'name' => 'all',
'label' => __('All', 'mailpoet'),
'count' => $allCount,
],
[
'name' => 'trash',
'label' => __('Trash', 'mailpoet'),
'count' => $trashedCount,
],
];
}
}

View File

@ -9,6 +9,8 @@ use MailPoet\Models\Subscriber;
use MailPoet\Models\SubscriberSegment;
use MailPoet\Settings\SettingsController;
use MailPoet\Subscribers\Source;
use MailPoet\Subscribers\SubscribersRepository;
use MailPoet\WooCommerce\Helper as WCHelper;
use MailPoet\WP\Functions as WPFunctions;
use MailPoetVendor\Idiorm\ORM;
@ -25,14 +27,34 @@ class WooCommerce {
private $mailpoetEmailCollation;
private $wpPostmetaValueCollation;
/** @var SubscribersRepository */
private $subscribersRepository;
/** @var WCHelper */
private $woocommerceHelper;
public function __construct(
SettingsController $settings,
WPFunctions $wp,
WCHelper $woocommerceHelper,
SubscribersRepository $subscribersRepository,
WP $wpSegment
) {
$this->settings = $settings;
$this->wp = $wp;
$this->wpSegment = $wpSegment;
$this->subscribersRepository = $subscribersRepository;
$this->woocommerceHelper = $woocommerceHelper;
}
public function shouldShowWooCommerceSegment() {
$isWoocommerceActive = $this->woocommerceHelper->isWooCommerceActive();
$woocommerceUserExists = $this->subscribersRepository->woocommerceUserExists();
if (!$isWoocommerceActive && !$woocommerceUserExists) {
return false;
}
return true;
}
public function synchronizeRegisteredCustomer($wpUserId, $currentFilter = null) {

View File

@ -213,6 +213,23 @@ class SubscribersRepository extends Repository {
return count($subscribers);
}
public function woocommerceUserExists(): bool {
$subscribers = $this->entityManager
->createQueryBuilder()
->select('s')
->from(SubscriberEntity::class, 's')
->join(SubscriberSegmentEntity::class, 'ss')
->join(SegmentEntity::class, 'segment')
->where('segment.type = :segmentType')
->setParameter('segmentType', SegmentEntity::TYPE_WC_USERS)
->andWhere('s.isWoocommerceUser = true')
->getQuery()
->setMaxResults(1)
->execute();
return count($subscribers) > 0;
}
/**
* @return int - number of processed ids
*/