Skip to content

Commit 9e77ca5

Browse files
committed
Add: getCampaignPerformance, getRecentCampaigns
1 parent aaa05e8 commit 9e77ca5

4 files changed

Lines changed: 83 additions & 0 deletions

File tree

src/Domain/Analytics/Repository/LinkTrackRepository.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace PhpList\Core\Domain\Analytics\Repository;
66

7+
use DateTimeInterface;
78
use PhpList\Core\Domain\Analytics\Model\LinkTrack;
89
use PhpList\Core\Domain\Common\Repository\AbstractRepository;
910
use PhpList\Core\Domain\Common\Repository\CursorPaginationTrait;
@@ -40,4 +41,16 @@ public function findByUrlUserIdAndMessageId(string $url, int $userId, int $messa
4041
'messageId' => $messageId,
4142
]);
4243
}
44+
45+
public function countBetween(DateTimeInterface $start, DateTimeInterface $end): int
46+
{
47+
return (int) $this->createQueryBuilder('lt')
48+
->select('COUNT(lt.id)')
49+
->where('lt.latestClick >= :start')
50+
->andWhere('lt.latestClick <= :end')
51+
->setParameter('start', $start)
52+
->setParameter('end', $end)
53+
->getQuery()
54+
->getSingleScalarResult();
55+
}
4356
}

src/Domain/Analytics/Service/AnalyticsService.php

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace PhpList\Core\Domain\Analytics\Service;
66

7+
use DateInterval;
78
use DateTimeImmutable;
89
use PhpList\Core\Domain\Analytics\Repository\UserMessageViewRepository;
910
use PhpList\Core\Domain\Analytics\Service\Manager\LinkTrackManager;
@@ -415,4 +416,61 @@ public function getTopLocalParts(int $limit = 25): array
415416
'total' => count($result),
416417
];
417418
}
419+
420+
public function getCampaignPerformance(): array
421+
{
422+
$performance = [];
423+
$endDate = new DateTimeImmutable('today 23:59:59');
424+
$startDate = $endDate->sub(new DateInterval('P29D'))->modify('00:00:00');
425+
426+
for ($index = 0; $index < 30; $index++) {
427+
$dayStart = $startDate->add(new DateInterval('P' . $index . 'D'));
428+
$dayEnd = $dayStart->modify('23:59:59');
429+
430+
$performance[] = [
431+
'date' => $dayStart->format('Y-m-d'),
432+
'opens' => $this->userMessageViewManager->countViewsBetween($dayStart, $dayEnd),
433+
'clicks' => $this->linkTrackManager->countClicksBetween($dayStart, $dayEnd),
434+
];
435+
}
436+
437+
return $performance;
438+
}
439+
440+
/**
441+
* Get recent campaigns with their performance rates
442+
*
443+
* @param int $limit
444+
* @return array
445+
*/
446+
public function getRecentCampaigns(int $limit = 5): array
447+
{
448+
$messages = $this->messageRepository->getFilteredAfterId(0, $limit)->getItems();
449+
$recentCampaigns = [];
450+
foreach ($messages as $message) {
451+
$views = $this->userMessageViewManager->countViewsByMessageId($message->getId());
452+
$linkTracks = $this->linkTrackManager->getLinkTracksByMessageId($message->getId());
453+
454+
$uniqueClickers = [];
455+
foreach ($linkTracks as $linkTrack) {
456+
$uniqueClickers[$linkTrack->getUserId()] = true;
457+
}
458+
$uniqueClicks = count($uniqueClickers);
459+
460+
$sentCount = $message->getMetadata()->getViews() + $message->getMetadata()->getBounceCount();
461+
462+
$openRate = $sentCount > 0 ? ($views / $sentCount) * 100 : 0;
463+
$clickRate = $sentCount > 0 ? ($uniqueClicks / $sentCount) * 100 : 0;
464+
465+
$recentCampaigns[] = [
466+
'name' => $message->getContent()->getSubject(),
467+
'status' => $message->getMetadata()->getStatus()?->value,
468+
'date' => $message->getMetadata()->getSent()?->format('Y-m-d'),
469+
'open_rate' => round($openRate, 2) . '%',
470+
'click_rate' => round($clickRate, 2) . '%',
471+
];
472+
}
473+
474+
return $recentCampaigns;
475+
}
418476
}

src/Domain/Analytics/Service/Manager/LinkTrackManager.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace PhpList\Core\Domain\Analytics\Service\Manager;
66

7+
use DateTimeInterface;
78
use PhpList\Core\Domain\Analytics\Model\LinkTrack;
89
use PhpList\Core\Domain\Analytics\Repository\LinkTrackRepository;
910

@@ -28,4 +29,9 @@ public function getLinkTracksByMessageId(int $messageId, int $lastId = 0, ?int $
2829
{
2930
return $this->linkTrackRepository->getByMessageId($messageId, $lastId, $limit);
3031
}
32+
33+
public function countClicksBetween(DateTimeInterface $start, DateTimeInterface $end): int
34+
{
35+
return $this->linkTrackRepository->countBetween($start, $end);
36+
}
3137
}

src/Domain/Analytics/Service/Manager/UserMessageViewManager.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace PhpList\Core\Domain\Analytics\Service\Manager;
66

7+
use DateTimeInterface;
78
use PhpList\Core\Domain\Analytics\Repository\UserMessageViewRepository;
89

910
class UserMessageViewManager
@@ -23,4 +24,9 @@ public function countViewsByMessageId(int $messageId): int
2324
{
2425
return $this->userMessageViewRepository->countByMessageId($messageId);
2526
}
27+
28+
public function countViewsBetween(DateTimeInterface $start, DateTimeInterface $end): int
29+
{
30+
return $this->userMessageViewRepository->countBetween($start, $end);
31+
}
2632
}

0 commit comments

Comments
 (0)