Refactor subscriber statistics to doctrine
[MAILPOET-3168]
This commit is contained in:
@ -4,6 +4,7 @@ namespace MailPoet\API\JSON\ResponseBuilders;
|
||||
|
||||
use MailPoet\Entities\SegmentEntity;
|
||||
use MailPoet\Newsletter\Segment\NewsletterSegmentRepository;
|
||||
use MailPoet\Segments\SegmentSubscribersRepository;
|
||||
use MailPoet\WP\Functions;
|
||||
|
||||
class SegmentsResponseBuilder {
|
||||
@ -15,12 +16,17 @@ class SegmentsResponseBuilder {
|
||||
/** @var NewsletterSegmentRepository */
|
||||
private $newsletterSegmentRepository;
|
||||
|
||||
/** @var SegmentSubscribersRepository */
|
||||
private $segmentSubscriberRepository;
|
||||
|
||||
public function __construct(
|
||||
Functions $wp,
|
||||
SegmentSubscribersRepository $segmentSubscriberRepository,
|
||||
NewsletterSegmentRepository $newsletterSegmentRepository
|
||||
) {
|
||||
$this->wp = $wp;
|
||||
$this->newsletterSegmentRepository = $newsletterSegmentRepository;
|
||||
$this->segmentSubscriberRepository = $segmentSubscriberRepository;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -62,7 +68,7 @@ class SegmentsResponseBuilder {
|
||||
'deleted_at' => ($deletedAt = $segment->getDeletedAt()) ? $deletedAt->format(self::DATE_FORMAT) : null,
|
||||
'automated_emails_subjects' => $automatedNewsletterSubjectsMap[$segment->getId()] ?? [],
|
||||
'scheduled_emails_subjects' => $scheduledNewsletterSubjectsMap[$segment->getId()] ?? [],
|
||||
'subscribers_count' => [], // TODO
|
||||
'subscribers_count' => $this->segmentSubscriberRepository->getSubscribersStatisticsCount($segment),
|
||||
'subscribers_url' => $this->wp->adminUrl(
|
||||
'admin.php?page=mailpoet-subscribers#/filter[segment=' . $segment->getId() . ']'
|
||||
),
|
||||
|
@ -82,6 +82,10 @@ class Segment extends Model {
|
||||
->delete();
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Use the version in \MailPoet\Segments\SegmentSubscribersRepository::getSubscribersStatisticsCount
|
||||
* @return $this
|
||||
*/
|
||||
public function withSubscribersCount() {
|
||||
$query = SubscriberSegment::tableAlias('relation')
|
||||
->where('relation.segment_id', $this->id)
|
||||
|
@ -141,4 +141,47 @@ class SegmentSubscribersRepository {
|
||||
}
|
||||
return $statement;
|
||||
}
|
||||
|
||||
public function getSubscribersStatisticsCount(SegmentEntity $segment) {
|
||||
$subscriberSegmentTable = $this->entityManager->getClassMetadata(SubscriberSegmentEntity::class)->getTableName();
|
||||
$subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName();
|
||||
$queryBuilder = $this->entityManager
|
||||
->getConnection()
|
||||
->createQueryBuilder()
|
||||
->from($subscriberSegmentTable, 'subscriber_segment')
|
||||
->where('subscriber_segment.segment_id = :segment_id')
|
||||
->setParameter('segment_id', $segment->getId())
|
||||
->andWhere('subscribers.deleted_at is null')
|
||||
->join('subscriber_segment', $subscribersTable, 'subscribers', 'subscribers.id = subscriber_segment.subscriber_id')
|
||||
->addSelect('SUM(
|
||||
CASE WHEN subscribers.status = :status_subscribed AND subscriber_segment.status = :status_subscribed
|
||||
THEN 1 ELSE 0 END
|
||||
) as :status_subscribed')
|
||||
->addSelect('SUM(
|
||||
CASE WHEN subscribers.status = :status_unsubscribed OR subscriber_segment.status = :status_unsubscribed
|
||||
THEN 1 ELSE 0 END
|
||||
) as :status_unsubscribed')
|
||||
->addSelect('SUM(
|
||||
CASE WHEN subscribers.status = :status_inactive AND subscriber_segment.status != :status_unsubscribed
|
||||
THEN 1 ELSE 0 END
|
||||
) as :status_inactive')
|
||||
->addSelect('SUM(
|
||||
CASE WHEN subscribers.status = :status_unconfirmed AND subscriber_segment.status != :status_unsubscribed
|
||||
THEN 1 ELSE 0 END
|
||||
) as :status_unconfirmed')
|
||||
->addSelect('SUM(
|
||||
CASE WHEN subscribers.status = :status_bounced AND subscriber_segment.status != :status_unsubscribed
|
||||
THEN 1 ELSE 0 END
|
||||
) as :status_bounced')
|
||||
|
||||
->setParameter('status_subscribed', SubscriberEntity::STATUS_SUBSCRIBED)
|
||||
->setParameter('status_unsubscribed', SubscriberEntity::STATUS_UNSUBSCRIBED)
|
||||
->setParameter('status_inactive', SubscriberEntity::STATUS_INACTIVE)
|
||||
->setParameter('status_unconfirmed', SubscriberEntity::STATUS_UNCONFIRMED)
|
||||
->setParameter('status_bounced', SubscriberEntity::STATUS_BOUNCED);
|
||||
|
||||
$statement = $this->executeQuery($queryBuilder);
|
||||
$result = $statement->fetch();
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
@ -16,7 +16,7 @@ class SegmentsResponseBuilderTest extends \MailPoetTest {
|
||||
$segment = new SegmentEntity($name, SegmentEntity::TYPE_DEFAULT, $description);
|
||||
$em->persist($segment);
|
||||
$em->flush();
|
||||
$responseBuilder = new SegmentsResponseBuilder();
|
||||
$responseBuilder = $di->get(SegmentsResponseBuilder::class);
|
||||
$response = $responseBuilder->build($segment);
|
||||
|
||||
expect($response['name'])->equals($name);
|
||||
|
@ -261,24 +261,6 @@ class SegmentTest extends \MailPoetTest {
|
||||
expect($segments[1]['subscribers'])->equals(1);
|
||||
}
|
||||
|
||||
public function testListingQuery() {
|
||||
Segment::createOrUpdate([
|
||||
'name' => 'name 2',
|
||||
'description' => 'description 2',
|
||||
'type' => 'unknown',
|
||||
]);
|
||||
$query = Segment::listingQuery([]);
|
||||
$data = $query->findMany();
|
||||
expect($data)->count(1);
|
||||
expect($data[0]->name)->equals('some name');
|
||||
}
|
||||
|
||||
public function testListingQueryWithGroup() {
|
||||
$query = Segment::listingQuery(['group' => 'trash']);
|
||||
$data = $query->findMany();
|
||||
expect($data)->count(0);
|
||||
}
|
||||
|
||||
public function _after() {
|
||||
ORM::raw_execute('TRUNCATE ' . Subscriber::$_table);
|
||||
ORM::raw_execute('TRUNCATE ' . Segment::$_table);
|
||||
|
Reference in New Issue
Block a user