ExtensionHandlerRegistry::afterTask()   B
last analyzed

Complexity

Conditions 7
Paths 13

Size

Total Lines 19
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 7.049

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 10
c 1
b 0
f 0
dl 0
loc 19
ccs 9
cts 10
cp 0.9
rs 8.8333
cc 7
nc 13
nop 1
crap 7.049
1
<?php
2
3
namespace Zenstruck\ScheduleBundle\Schedule\Extension;
4
5
use Zenstruck\ScheduleBundle\Schedule\Exception\MissingDependency;
6
use Zenstruck\ScheduleBundle\Schedule\Extension\Handler\BetweenTimeHandler;
7
use Zenstruck\ScheduleBundle\Schedule\Extension\Handler\CallbackHandler;
8
use Zenstruck\ScheduleBundle\Schedule\ScheduleRunContext;
9
use Zenstruck\ScheduleBundle\Schedule\Task\TaskRunContext;
10
11
/**
12
 * @author Kevin Bond <[email protected]>
13
 */
14
final class ExtensionHandlerRegistry
15
{
16
    /** @var iterable<ExtensionHandler> */
17
    private $handlers;
18
19
    /** @var array<string,ExtensionHandler> */
20
    private $handlerCache;
21
22 104
    /**
23
     * @param iterable<ExtensionHandler> $handlers
24 104
     */
25 104
    public function __construct(iterable $handlers)
26 104
    {
27 104
        $this->handlers = $handlers;
28
        $this->handlerCache = [
29 104
            CallbackExtension::class => new CallbackHandler(),
30
            BetweenTimeExtension::class => new BetweenTimeHandler(),
31 59
        ];
32
    }
33 59
34
    public function handlerFor(object $extension): ExtensionHandler
35 59
    {
36 54
        $class = \get_class($extension);
37
38
        if (isset($this->handlerCache[$class])) {
39 22
            return $this->handlerCache[$class];
40 18
        }
41 18
42
        foreach ($this->handlers as $handler) {
43
            if ($handler->supports($extension)) {
44
                return $this->handlerCache[$class] = $handler;
45 4
            }
46
        }
47
48 81
        throw MissingDependency::noExtensionHandler($extension);
49
    }
50 81
51 23
    public function beforeSchedule(ScheduleRunContext $context): void
52
    {
53
        foreach ($context->getSchedule()->getExtensions() as $extension) {
54 72
            $this->handlerFor($extension)->filterSchedule($context, $extension);
55 14
        }
56
57 72
        foreach ($context->getSchedule()->getExtensions() as $extension) {
58
            $this->handlerFor($extension)->beforeSchedule($context, $extension);
59 72
        }
60
    }
61 72
62 14
    public function afterSchedule(ScheduleRunContext $context): void
63
    {
64
        foreach ($context->getSchedule()->getExtensions() as $extension) {
65 72
            $this->handlerFor($extension)->afterSchedule($context, $extension);
66 44
        }
67 9
68
        if ($context->isSuccessful()) {
69
            foreach ($context->getSchedule()->getExtensions() as $extension) {
70
                $this->handlerFor($extension)->onScheduleSuccess($context, $extension);
71 72
            }
72 28
        }
73 5
74
        if ($context->isFailure()) {
75
            foreach ($context->getSchedule()->getExtensions() as $extension) {
76 72
                $this->handlerFor($extension)->onScheduleFailure($context, $extension);
77
            }
78 63
        }
79
    }
80 63
81 36
    public function beforeTask(TaskRunContext $context): void
82
    {
83
        foreach ($context->getTask()->getExtensions() as $extension) {
84 52
            $this->handlerFor($extension)->filterTask($context, $extension);
85 25
        }
86
87 52
        foreach ($context->getTask()->getExtensions() as $extension) {
88
            $this->handlerFor($extension)->beforeTask($context, $extension);
89 63
        }
90
    }
91 63
92
    public function afterTask(TaskRunContext $context): void
93
    {
94
        if (!$context->hasRun()) {
95 63
            return;
96 36
        }
97
98
        foreach ($context->getTask()->getExtensions() as $extension) {
99 63
            $this->handlerFor($extension)->afterTask($context, $extension);
100 31
        }
101 10
102
        if ($context->isSuccessful()) {
103
            foreach ($context->getTask()->getExtensions() as $extension) {
104
                $this->handlerFor($extension)->onTaskSuccess($context, $extension);
105 63
            }
106 28
        }
107 14
108
        if ($context->isFailure()) {
109
            foreach ($context->getTask()->getExtensions() as $extension) {
110 62
                $this->handlerFor($extension)->onTaskFailure($context, $extension);
111
            }
112
        }
113
    }
114
}
115