Completed
Push — master ( ed128c...8b5779 )
by Emil
09:14
created

ScheduleSynchronizer::setForce()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 1
1
<?php
2
3
namespace Glooby\TaskBundle\Synchronizer;
4
5
use Doctrine\Common\Persistence\ManagerRegistry;
6
use Glooby\TaskBundle\Entity\Schedule;
7
use Glooby\TaskBundle\Annotation\Schedule as Def;
8
use Glooby\TaskBundle\Entity\ScheduleRepository;
9
use Glooby\TaskBundle\Schedule\ScheduleRegistry;
10
11
/**
12
 * @author Emil Kilhage
13
 */
14
class ScheduleSynchronizer
15
{
16
    /**
17
     * @var ManagerRegistry
18
     */
19
    protected $doctrine;
20
21
    /**
22
     * @param ManagerRegistry $doctrine
23
     */
24
    public function setDoctrine($doctrine)
25
    {
26
        $this->doctrine = $doctrine;
27
    }
28
29
    /**
30
     * @var ScheduleRegistry
31
     */
32
    private $scheduleRegistry;
33
34
    /**
35
     * @var bool
36
     */
37
    private $force = false;
38
39
    /**
40
     * @param boolean $force
41
     */
42
    public function setForce(bool $force)
43
    {
44
        $this->force = $force;
45
    }
46
47
    /**
48
     * @param ScheduleRegistry $scheduleRegistry
49
     */
50
    public function setScheduleRegistry(ScheduleRegistry $scheduleRegistry)
51
    {
52
        $this->scheduleRegistry = $scheduleRegistry;
53
    }
54
55
    /**
56
     *
57
     */
58
    public function sync()
59
    {
60
        /** @var ScheduleRepository $repo */
61
        $repo = $this->doctrine->getManager()
62
            ->getRepository('GloobyTaskBundle:Schedule');
63
64
        $schedules = $this->scheduleRegistry->getSchedules();
65
66
        foreach ($schedules as $id => $def) {
67
            try {
68
                /** @var Schedule $schedule */
69
                $schedule = $repo->findByName($id);
70
71
                if ($this->force || $schedule->getVersion() !== $def->version) {
72
                    $this->update($schedule, $id, $def);
73
                }
74
            } catch (\Exception $e) {
75
                $schedule = new Schedule();
76
                $this->update($schedule, $id, $def);
77
                $this->doctrine->getManager()->persist($schedule);
78
            }
79
        }
80
81
        foreach ($repo->findNotInNames(array_keys($schedules)) as $schedule) {
82
            $this->doctrine->getManager()->remove($schedule);
83
        }
84
85
        $this->doctrine->getManager()->flush();
86
    }
87
88
    /**
89
     * @param Schedule $schedule
90
     * @param string $id
91
     * @param Def $def
92
     */
93
    private function update(Schedule $schedule, string $id, Def $def)
94
    {
95
        $schedule->setName($id);
96
        $schedule->setActive($def->active);
97
        $schedule->setRunEvery($def->runEvery);
98
        $schedule->setTimeout($def->timeout);
99
        $schedule->setParams($def->params);
100
        $schedule->setVersion($def->version);
101
    }
102
}
103