Passed
Push — master ( 0057b2...3e8fcf )
by Marek
02:11
created

TaskFactory::matchTaskToTicket()   B

Complexity

Conditions 5
Paths 5

Size

Total Lines 17
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 5

Importance

Changes 0
Metric Value
dl 0
loc 17
ccs 10
cts 10
cp 1
rs 8.8571
c 0
b 0
f 0
cc 5
eloc 11
nc 5
nop 2
crap 5
1
<?php
2
3
declare(strict_types = 1);
4
5
namespace AppBuilder\Application\Module\TaskManager\Factory;
6
7
use AppBuilder\Application\Configuration\ValueObject\Parameters;
8
use AppBuilder\Application\Model\ValueObject\Ticket;
9
use AppBuilder\Application\Module\TaskManager\Exception\MisguidedTaskException;
10
use AppBuilder\Application\Module\TaskManager\Task\NoActionTask;
11
use AppBuilder\Application\Module\TaskManager\Task\Task;
12
use AppBuilder\Application\Utils\FileManager\FileManagerService;
13
use FileNotFoundException;
14
use Psr\Log\LoggerInterface;
15
16
class TaskFactory
17
{
18
    /** @var LoggerInterface */
19
    private $logger;
20
21
    /** @var Parameters */
22
    private $applicationParams;
23
24
    /** @var FileManagerService */
25
    private $fileManager;
26
27 3
    public function __construct(
28
        LoggerInterface $logger,
29
        Parameters $applicationParams,
30
        FileManagerService $fileManager
31
    ) {
32 3
        $this->logger            = $logger;
33 3
        $this->applicationParams = $applicationParams;
34 3
        $this->fileManager       = $fileManager;
35 3
    }
36
37 3
    public function create(Ticket $ticket) : Task
38
    {
39 3
        $factoriesByPriority = $this->groupByPriority($this->createFactories());
40
41 3
        return $this->matchTaskToTicket($ticket, $factoriesByPriority);
42
    }
43
44
    /**
45
     * Groups task factories by priority.
46
     */
47 3
    private function groupByPriority(array $factories) : array
48
    {
49 3
        $factoriesByPriority = [];
50 3
        foreach ($factories as $factory) {
51 3
            $factoriesByPriority[$factory::PRIORITY][] = $factory;
52
        }
53 3
        ksort($factoriesByPriority);
54
55 3
        return $factoriesByPriority;
56
    }
57
58
    /**
59
     * Return objects of all available task factories.
60
     */
61 3
    private function createFactories() : array
62
    {
63
        return [
64 3
            new CreateTicketDirTaskFactory(),
65 3
            new RemoveFinishedTicketTaskFactory(),
66 3
            new UpdateTicketTaskFactory(),
67
        ];
68
    }
69
70
    /**
71
     * Matches task to passed application.
72
     */
73 3
    private function matchTaskToTicket(Ticket $ticket, array $factoriesByPriority) : Task
74
    {
75 3
        foreach ($factoriesByPriority as $currentPriorityFactories) {
76 3
            foreach ($currentPriorityFactories as $factory) {
77
                try {
78 3
                    return $factory->create($ticket, $this->applicationParams, $this->fileManager);
79 2
                } catch (MisguidedTaskException $exception) {
80 2
                    continue;
81 1
                } catch (FileNotFoundException $exception) {
82 2
                    $this->logger->critical($exception->getMessage(), [$exception]);
83
                }
84
            }
85
        }
86 2
        $this->logger->info('No task matched, no action performed.');
87
88 2
        return new NoActionTask();
89
    }
90
}
91