Passed
Pull Request — master (#20)
by Patrick
02:59
created

readPeriodicalConfig()   A

Complexity

Conditions 3
Paths 7

Size

Total Lines 37
Code Lines 23

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 23
c 1
b 0
f 0
nc 7
nop 1
dl 0
loc 37
ccs 0
cts 21
cp 0
crap 12
rs 9.552
1
<?php
2
3
/*
4
 * This file is part of forecast.it.fill project.
5
 * (c) Patrick Jaja <[email protected]>
6
 * This source file is subject to the MIT license that is bundled
7
 * with this source code in the file LICENSE.
8
 */
9
10
namespace ForecastAutomation\PeriodicalActivityDataImport\Business;
11
12
use ForecastAutomation\Log\LogFacade;
13
use ForecastAutomation\PeriodicalActivityDataImport\Shared\Dto\PeriodicalActivityConfigDto;
14
use JsonSchema\Validator;
15
16
class PeriodicalActivityConfigReader
17
{
18
    public function __construct(
19
        private string $periodicalActivityConfig,
20
        private string $periodicalActivitySchemaPath,
21
        private Validator $validator,
22
        private LogFacade $logFacade,
23
    ) {
24
    }
25
26
    /**
27
     * @return PeriodicalActivityConfigDto[] array
28
     */
29
    public function readPeriodicalConfig(string $periodicalDate): array
30
    {
31
        try {
32
            //ToDo: Move to separate Plugins in Business Layer to reduce class complexity and responsibility
33
            $periodicalConfigCollection = json_decode(
34
                $this->periodicalActivityConfig,
35
                null,
36
                JSON_PARTIAL_OUTPUT_ON_ERROR,
37
                JSON_THROW_ON_ERROR
38
            );
39
40
            $this->validator->validate(
41
                $periodicalConfigCollection,
42
                (object) ['$ref' => $this->periodicalActivitySchemaPath]
43
            );
44
45
            if ($this->validator->isValid()) {
46
                $periodicalConfigDtoCollection = $this->filterPeriodicalConfigDto(
47
                    $this->periodicalConfigDtoMapper($periodicalConfigCollection),
48
                    $periodicalDate
49
                );
50
            } else {
51
                $this->logFacade->error(
52
                    \sprintf(
53
                        'JSON (%s) is not validate. %s',
54
                        $this->periodicalActivityConfig,
55
                        json_encode($this->validator->getErrors(), JSON_THROW_ON_ERROR)
56
                    )
57
                );
58
            }
59
        } catch (\JsonException $exception) {
60
            $this->logFacade->error('Invalid JSON.', $exception);
61
62
            throw $exception;
63
        }
64
65
        return $periodicalConfigDtoCollection;
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $periodicalConfigDtoCollection does not seem to be defined for all execution paths leading up to this point.
Loading history...
66
    }
67
68
    /**
69
     * @return PeriodicalActivityConfigDto[] array
70
     */
71
    private function periodicalConfigDtoMapper(array $periodicalConfigCollection): array
72
    {
73
        $periodicalConfigDtoCollection = [];
74
        foreach ($periodicalConfigCollection as $periodicalConfig) {
75
            $periodicalConfigDtoCollection[] = new PeriodicalActivityConfigDto(...(array) $periodicalConfig);
76
        }
77
78
        return $periodicalConfigDtoCollection;
79
    }
80
81
    /**
82
     * @return PeriodicalActivityConfigDto[] array
83
     */
84
    private function filterPeriodicalConfigDto(array $periodicalConfigDtoCollection, string $periodicalDate): array
85
    {
86
        $activityCandidates = [];
87
        foreach ($periodicalConfigDtoCollection as $periodicalActivityConfigDto) {
88
            if (str_contains($periodicalActivityConfigDto->frequency, date('N', strtotime($periodicalDate)))) {
89
                $activityCandidates[] = $periodicalActivityConfigDto;
90
            }
91
        }
92
93
        return $activityCandidates;
94
    }
95
}
96