Configuration::typesNode()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 25
Code Lines 23

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 23
nc 1
nop 1
dl 0
loc 25
rs 9.552
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Damax\Media\Bridge\Symfony\Bundle\DependencyInjection;
6
7
use Closure;
8
use Damax\Media\Domain\Image\Manipulator;
9
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
10
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
11
use Symfony\Component\Config\Definition\ConfigurationInterface;
12
13
final class Configuration implements ConfigurationInterface
14
{
15
    public const ADAPTER_GAUFRETTE = 'gaufrette';
16
    public const ADAPTER_FLYSYSTEM = 'flysystem';
17
18
    public const DRIVER_GD = 'gd';
19
    public const DRIVER_IMAGICK = 'imagick';
20
21
    public function getConfigTreeBuilder(): TreeBuilder
22
    {
23
        $treeBuilder = new TreeBuilder('damax_media');
24
25
        $rootNode = $treeBuilder->getRootNode();
26
        $rootNode
27
            ->children()
28
                ->append($this->storageNode('storage'))
29
                ->append($this->typesNode('types'))
30
                ->append($this->glideNode('glide'))
31
            ->end()
32
        ;
33
34
        return $treeBuilder;
35
    }
36
37
    private function storageNode(string $name): ArrayNodeDefinition
38
    {
39
        return (new ArrayNodeDefinition($name))
40
            ->isRequired()
41
            ->beforeNormalization()
42
                ->ifString()
43
                ->then(function (string $adapter) {
44
                    return ['adapter' => $adapter];
45
                })
46
            ->end()
47
            ->children()
48
                ->enumNode('adapter')
49
                    ->isRequired()
50
                    ->values([self::ADAPTER_GAUFRETTE, self::ADAPTER_FLYSYSTEM])
51
                ->end()
52
                ->integerNode('key_length')
53
                    ->defaultValue(8)
54
                ->end()
55
            ->end()
56
        ;
57
    }
58
59
    private function typesNode(string $name): ArrayNodeDefinition
60
    {
61
        return (new ArrayNodeDefinition($name))
62
            ->prototype('array')
63
                ->children()
64
                    ->scalarNode('storage')
65
                        ->isRequired()
66
                        ->cannotBeEmpty()
67
                    ->end()
68
                    ->integerNode('max_file_size')
69
                        ->beforeNormalization()
70
                            ->always()
71
                            ->then(Closure::fromCallable([$this, 'toMegabytes']))
72
                        ->end()
73
                        ->isRequired()
74
                    ->end()
75
                    ->arrayNode('mime_types')
76
                        ->isRequired()
77
                        ->requiresAtLeastOneElement()
78
                        ->prototype('scalar')
79
                            ->cannotBeEmpty()
80
                        ->end()
81
                    ->end()
82
                ->end()
83
            ->end()
84
        ;
85
    }
86
87
    private function glideNode(string $name): ArrayNodeDefinition
88
    {
89
        return (new ArrayNodeDefinition($name))
90
            ->children()
91
                ->enumNode('driver')
92
                    ->isRequired()
93
                    ->values([self::DRIVER_GD, self::DRIVER_IMAGICK])
94
                ->end()
95
                ->scalarNode('source')
96
                    ->isRequired()
97
                ->end()
98
                ->scalarNode('cache')
99
                    ->isRequired()
100
                ->end()
101
                ->booleanNode('group_cache_in_folders')
102
                    ->defaultTrue()
103
                ->end()
104
                ->integerNode('max_image_size')
105
                    ->beforeNormalization()
106
                        ->always()
107
                        ->then(Closure::fromCallable([$this, 'toMegabytes']))
108
                    ->end()
109
                ->end()
110
                ->scalarNode('sign_key')
111
                    ->cannotBeEmpty()
112
                    ->defaultValue('%kernel.secret%')
113
                ->end()
114
                ->arrayNode('presets')
115
                    ->useAttributeAsKey(true)
116
                    ->variablePrototype()
117
                        ->validate()
118
                            ->ifTrue(function (array $config): bool {
119
                                return !Manipulator::validParams($config);
120
                            })
121
                            ->thenInvalid('Invalid manipulation specified.')
122
                        ->end()
123
                    ->end()
124
                ->end()
125
                ->variableNode('defaults')
126
                    ->validate()
127
                        ->ifTrue(function (array $config): bool {
128
                            return !Manipulator::validParams($config);
129
                        })
130
                        ->thenInvalid('Invalid manipulation specified.')
131
                    ->end()
132
                ->end()
133
            ->end()
134
        ;
135
    }
136
137
    private function toMegabytes(int $size): int
138
    {
139
        return $size * 1024 * 1024;
140
    }
141
}
142