-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathIncentiveListener.php
61 lines (50 loc) · 2.05 KB
/
IncentiveListener.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?php
declare(strict_types=1);
namespace RewardsProgram;
use Symfony\Component\EventDispatcher\EventDispatcher;
class IncentiveListener
{
private EventDispatcher $eventDispatcher;
private RewardRepository $rewardRepository;
private UserEventRepository $userEventRepository;
public function __construct(EventDispatcher $eventDispatcher, RewardRepository $rewardRepository, UserEventRepository $userEventRepository)
{
$this->eventDispatcher = $eventDispatcher;
$this->rewardRepository = $rewardRepository;
$this->userEventRepository = $userEventRepository;
foreach(self::getEventListeners() as $eventName => $listener){
$this->eventDispatcher->addListener($eventName, $listener);
}
}
private function hasPreviousContiguousDays(int $days, array $dates): bool
{
$totalSeconds = 0;
$current = array_pop($dates);
while($previous = array_pop($dates)){
$diffSeconds = $current->getTimestamp() - $previous->getTimestamp() ;
if($diffSeconds > 86400){
break;
}
$totalSeconds += $diffSeconds;
$current = $previous;
}
return $totalSeconds/86400 >= $days - 1;
}
private function getEventListeners(): array
{
return [
UserBirthEvent::NAME => function(UserBirthEvent $event){
$this->rewardRepository->createRewardForBirthEvent($event->getUser());
},
UserLogDataEvent::NAME => function(UserLogDataEvent $event){
$logDataEvents = $this->userEventRepository->getEventsForUser($event->getUser());
$logDataEvents[] = $event->getDate();
if($this->hasPreviousContiguousDays(5, $logDataEvents)){
$this->rewardRepository->createRewardForConcurrentDaysLogged($event->getUser());
$logDataEvents = [];
}
$this->userEventRepository->saveEventsForUser($event->getUser(), $logDataEvents);
}
];
}
}