Passed
Push — main ( 8599f1...f44baa )
by Thierry
06:14
created

DatabagPlugin::initDatabag()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 4
c 0
b 0
f 0
nc 2
nop 0
dl 0
loc 10
rs 10

1 Method

Rating   Name   Duplication   Size   Complexity  
A DatabagPlugin::__construct() 0 2 1
1
<?php
2
3
namespace Jaxon\Plugin\Response\Databag;
4
5
use Jaxon\App\Databag\Databag;
6
use Jaxon\App\Databag\DatabagContext;
7
use Jaxon\Plugin\AbstractResponsePlugin;
8
use Closure;
9
10
use function array_map;
11
use function is_array;
12
use function is_string;
13
use function json_decode;
14
15
class DatabagPlugin extends AbstractResponsePlugin
16
{
17
    /**
18
     * @const The plugin name
19
     */
20
    public const NAME = 'bags';
21
22
    /**
23
     * @var Databag
24
     */
25
    protected $xDatabag = null;
26
27
    /**
28
     * @var array<DatabagContext>
29
     */
30
    protected array $aContext = [];
31
32
    /**
33
     * The constructor
34
     *
35
     * @param Closure $fData
36
     */
37
    public function __construct(private Closure $fData)
38
    {}
39
40
    /**
41
     * @inheritDoc
42
     */
43
    public function getName(): string
44
    {
45
        return self::NAME;
46
    }
47
48
    /**
49
     * @return array
50
     */
51
    private function readData(): array
52
    {
53
        // Todo: clean input data.
54
        // Todo: verify the checksums.
55
        $xData = ($this->fData)();
56
        $aData = is_string($xData) ?
57
            (json_decode($xData, true) ?: []) :
58
            (is_array($xData) ? $xData : []);
59
        // Ensure all contents are arrays.
60
        return array_map(fn($aValue) => is_array($aValue) ? $aValue : [], $aData);
61
    }
62
63
    /**
64
     * @return Databag
65
     */
66
    private function databag(): Databag
67
    {
68
        return $this->xDatabag ?? $this->xDatabag = new Databag($this->readData());
69
    }
70
71
    /**
72
     * @inheritDoc
73
     */
74
    public function getHash(): string
75
    {
76
        // Use the version number as hash
77
        return '4.0.0';
78
    }
79
80
    /**
81
     * @return void
82
     */
83
    public function writeCommand(): void
84
    {
85
        $xDatabag = $this->databag();
86
        if($xDatabag->touched())
87
        {
88
            // Todo: calculate the checksums.
89
            $this->addCommand('databag.set', ['values' => $xDatabag]);
90
        }
91
    }
92
93
    /**
94
     * @param string $sName
95
     *
96
     * @return DatabagContext
97
     */
98
    public function bag(string $sName): DatabagContext
99
    {
100
        // The contexts are saved and reused.
101
        return $this->aContext[$sName] ??
102
            $this->aContext[$sName] = new DatabagContext($this->databag(), $sName);
103
    }
104
}
105