Completed
Push — master ( dc693f...c42c9b )
by Emil
02:11
created

QueueScheduler::getQueuedTaskRepo()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 5
rs 9.4285
cc 1
eloc 3
nc 1
nop 0
1
<?php
2
3
namespace Glooby\TaskBundle\Queue;
4
5
use Doctrine\Common\Persistence\ManagerRegistry;
6
use Doctrine\ORM\NoResultException;
7
use Glooby\TaskBundle\Entity\QueuedTask;
8
use Glooby\TaskBundle\Entity\QueuedTaskRepository;
9
use Glooby\TaskBundle\Manager\TaskManager;
10
use Glooby\TaskBundle\Model\ScheduleInterface;
11
12
/**
13
 * @author Emil Kilhage
14
 */
15
class QueueScheduler
16
{
17
    /**
18
     * @var ManagerRegistry
19
     */
20
    protected $doctrine;
21
22
    /**
23
     * @param ManagerRegistry $doctrine
24
     */
25
    public function setDoctrine($doctrine)
26
    {
27
        $this->doctrine = $doctrine;
28
    }
29
30
    /**
31
     * @var TaskManager
32
     */
33
    private $taskManager;
34
35
    /**
36
     * @param TaskManager $taskManager
37
     */
38
    public function setTaskManager(TaskManager $taskManager)
39
    {
40
        $this->taskManager = $taskManager;
41
    }
42
43
    /**
44
     *
45
     */
46
    public function schedule()
47
    {
48
        $repo = $this->doctrine->getManager()
49
            ->getRepository('GloobyTaskBundle:Schedule');
50
51
        foreach ($repo->findActive() as $schedule) {
52
            $this->queue($schedule);
53
        }
54
55
        $this->doctrine->getManager()->flush();
56
    }
57
58
    /**
59
     * @param ScheduleInterface $schedule
60
     */
61
    private function queue(ScheduleInterface $schedule)
62
    {
63
        $executeAt = $this->getExecuteAt($schedule);
64
65
        if (null !== $executeAt) {
66
            $this->taskManager->queue($schedule->getName(), $executeAt, $schedule->getParams());
67
        }
68
    }
69
70
    /**
71
     * @param ScheduleInterface $schedule
72
     * @return \DateTime|null
73
     */
74
    private function checkNextRunDate(ScheduleInterface $schedule)
75
    {
76
        return $this->checkRunDate($schedule, $schedule->parseExpression()->getNextRunDate());
77
    }
78
79
    /**
80
     * @param ScheduleInterface $schedule
81
     * @return \DateTime|null
82
     */
83
    private function checkPreviousRunDate(ScheduleInterface $schedule)
84
    {
85
        return $this->checkRunDate($schedule, $schedule->parseExpression()->getPreviousRunDate());
86
    }
87
88
    /**
89
     * @param ScheduleInterface $schedule
90
     * @param \DateTime $date
91
     * @return \DateTime|null
92
     */
93
    private function checkRunDate(ScheduleInterface $schedule, \DateTime $date)
94
    {
95
        $queueRepo = $this->getQueuedTaskRepo();
96
        $executeAt = null;
97
98
        try {
99
            $queueRepo->getByNameAndExecuteAt($schedule->getName(), $date);
100
        } catch (NoResultException $e) {
101
            $executeAt = $date;
102
        }
103
104
        return $executeAt;
105
    }
106
107
    /**
108
     * @param ScheduleInterface $schedule
109
     * @return \DateTime|null
110
     */
111
    private function checkExecutedBeforeNow(ScheduleInterface $schedule)
112
    {
113
        $queueRepo = $this->getQueuedTaskRepo();
114
        $executeAt = null;
115
116
        try {
117
            $queueRepo->getByNameAndExecuteAtBeforeNow($schedule->getName());
118
        } catch (NoResultException $e) {
119
            $executeAt = $schedule->parseExpression()->getPreviousRunDate();
120
        }
121
122
        return $executeAt;
123
    }
124
125
    /**
126
     * @return QueuedTaskRepository
127
     */
128
    private function getQueuedTaskRepo()
129
    {
130
        return $this->doctrine->getManager()
131
            ->getRepository('GloobyTaskBundle:QueuedTask');
132
    }
133
134
    /**
135
     * @param ScheduleInterface $schedule
136
     * @return \DateTime|null
137
     */
138
    private function getExecuteAt(ScheduleInterface $schedule)
139
    {
140
        $executeAt = $this->checkExecutedBeforeNow($schedule);
141
142
        if (null === $executeAt) {
143
            $executeAt = $this->checkPreviousRunDate($schedule);
144
        }
145
146
        if (null === $executeAt) {
147
            $executeAt = $this->checkNextRunDate($schedule);
148
        }
149
150
        return $executeAt;
151
    }
152
}
153