Filter click stats by newsletter send time

MAILPOET-5508
This commit is contained in:
John Oleksowicz
2023-08-29 10:31:20 -05:00
committed by Aschepikov
parent 44b1ab580f
commit 2987c61d77
2 changed files with 14 additions and 7 deletions

View File

@ -48,9 +48,7 @@ class SubscriberStatisticsRepository extends Repository {
public function getStatisticsClickCount(SubscriberEntity $subscriber, ?Carbon $startTime = null): int { public function getStatisticsClickCount(SubscriberEntity $subscriber, ?Carbon $startTime = null): int {
$queryBuilder = $this->getStatisticsCountQuery(StatisticsClickEntity::class, $subscriber); $queryBuilder = $this->getStatisticsCountQuery(StatisticsClickEntity::class, $subscriber);
if ($startTime) { if ($startTime) {
$queryBuilder $this->applyDateConstraint($queryBuilder, $startTime);
->andWhere('stats.createdAt >= :dateTime')
->setParameter('dateTime', $startTime);
} }
return (int)$queryBuilder return (int)$queryBuilder
->getQuery() ->getQuery()
@ -60,8 +58,7 @@ class SubscriberStatisticsRepository extends Repository {
public function getStatisticsOpenCountQuery(SubscriberEntity $subscriber, ?Carbon $startTime = null): QueryBuilder { public function getStatisticsOpenCountQuery(SubscriberEntity $subscriber, ?Carbon $startTime = null): QueryBuilder {
$queryBuilder = $this->getStatisticsCountQuery(StatisticsOpenEntity::class, $subscriber); $queryBuilder = $this->getStatisticsCountQuery(StatisticsOpenEntity::class, $subscriber);
if ($startTime) { if ($startTime) {
$queryBuilder->join(StatisticsNewsletterEntity::class, 'sent_stats', 'WITH', 'stats.newsletter = sent_stats.newsletter AND sent_stats.sentAt >= :dateTime') $this->applyDateConstraint($queryBuilder, $startTime);
->setParameter('dateTime', $startTime);
} }
return $queryBuilder; return $queryBuilder;
} }
@ -133,4 +130,11 @@ class SubscriberStatisticsRepository extends Repository {
$this->wcHelper $this->wcHelper
); );
} }
private function applyDateConstraint(QueryBuilder $queryBuilder, Carbon $startTime): QueryBuilder {
$queryBuilder->join(StatisticsNewsletterEntity::class, 'sent_stats', 'WITH', 'stats.newsletter = sent_stats.newsletter AND stats.subscriber = sent_stats.subscriber AND sent_stats.sentAt >= :dateTime')
->setParameter('dateTime', $startTime);
return $queryBuilder;
}
} }

View File

@ -27,26 +27,29 @@ class SubscriberStatisticsRepositoryTest extends \MailPoetTest {
public function testItFetchesClickCount(): void { public function testItFetchesClickCount(): void {
$yearAgo = Carbon::now()->subYear(); $yearAgo = Carbon::now()->subYear();
$monthAgo = Carbon::now()->subMonth(); $monthAgo = Carbon::now()->subMonth();
$fiveYearsAgo = Carbon::now()->subYears(5);
$subscriber = (new Subscriber())->create(); $subscriber = (new Subscriber())->create();
$newsletter = (new Newsletter())->withSendingQueue()->create(); $newsletter = (new Newsletter())->withSendingQueue()->create();
$link = (new NewsletterLink($newsletter))->create(); $link = (new NewsletterLink($newsletter))->create();
$sendStat = (new StatisticsNewsletters($newsletter, $subscriber))->withSentAt($monthAgo)->create();
$click = (new StatisticsClicks($link, $subscriber)) $click = (new StatisticsClicks($link, $subscriber))
->withCreatedAt($monthAgo) ->withCreatedAt($monthAgo)
->create(); ->create();
$newsletter2 = (new Newsletter())->withSendingQueue()->create(); $newsletter2 = (new Newsletter())->withSendingQueue()->create();
$link2 = (new NewsletterLink($newsletter2))->create(); $link2 = (new NewsletterLink($newsletter2))->create();
$sendStat2 = (new StatisticsNewsletters($newsletter2, $subscriber))->withSentAt($yearAgo)->create();
$click2 = (new StatisticsClicks($link2, $subscriber)) $click2 = (new StatisticsClicks($link2, $subscriber))
->withCreatedAt($yearAgo) ->withCreatedAt($yearAgo)
->create(); ->create();
$newsletter3 = (new Newsletter())->withSendingQueue()->create(); $newsletter3 = (new Newsletter())->withSendingQueue()->create();
$link3 = (new NewsletterLink($newsletter3))->create(); $link3 = (new NewsletterLink($newsletter3))->create();
$sendStat3 = (new StatisticsNewsletters($newsletter3, $subscriber))->withSentAt($fiveYearsAgo)->create();
$click3 = (new StatisticsClicks($link3, $subscriber)) $click3 = (new StatisticsClicks($link3, $subscriber))
->withCreatedAt(Carbon::now()->subYears(5)) ->withCreatedAt($fiveYearsAgo)
->create(); ->create();
$lifetimeCount = $this->repository->getStatisticsClickCount($subscriber, null); $lifetimeCount = $this->repository->getStatisticsClickCount($subscriber, null);