Completed
Push — master ( 79451c...b20886 )
by Dawid
04:40
created

Configuration   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 176
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Test Coverage

Coverage 98.31%

Importance

Changes 0
Metric Value
wmc 7
lcom 1
cbo 4
dl 0
loc 176
ccs 116
cts 118
cp 0.9831
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A getConfigTreeBuilder() 0 11 1
A addGetMethodOverride() 0 55 1
A addResponseSchemaValidation() 0 18 1
A addApiVersionSupport() 0 47 3
A getOverridableHttpMethods() 0 14 1
1
<?php
2
3
namespace Spiechu\SymfonyCommonsBundle\DependencyInjection;
4
5
use function foo\func;
6
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
7
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
8
use Symfony\Component\Config\Definition\ConfigurationInterface;
9
use Symfony\Component\HttpFoundation\Request;
10
11
class Configuration implements ConfigurationInterface
12
{
13
    /**
14
     * {@inheritdoc}
15
     *
16
     * @throws \RuntimeException
17
     * @throws \InvalidArgumentException
18
     */
19 18
    public function getConfigTreeBuilder(): TreeBuilder
20
    {
21 18
        $treeBuilder = new TreeBuilder();
22 18
        $rootNode = $treeBuilder->root('spiechu_symfony_commons');
23
24 18
        $this->addGetMethodOverride($rootNode);
25 18
        $this->addResponseSchemaValidation($rootNode);
26 18
        $this->addApiVersionSupport($rootNode);
27
28 18
        return $treeBuilder;
29
    }
30
31
    /**
32
     * @param ArrayNodeDefinition $rootNode
33
     *
34
     * @throws \InvalidArgumentException
35
     * @throws \RuntimeException
36
     */
37 18
    protected function addGetMethodOverride(ArrayNodeDefinition $rootNode): void
38
    {
39 18
        $overridableHttpMethods = $this->getOverridableHttpMethods();
40
        $defaultOverridedHttpMethods = [
41 18
            Request::METHOD_DELETE,
42 18
            Request::METHOD_POST,
43 18
            Request::METHOD_PUT,
44
        ];
45
46
        $rootNode
47 18
            ->children()
48 18
                ->arrayNode('get_method_override')
49 18
                    ->addDefaultsIfNotSet()
50 18
                    ->canBeEnabled()
51 18
                    ->children()
52 18
                        ->scalarNode('listener_service_id')
53 18
                            ->cannotBeEmpty()
54 18
                            ->defaultValue('spiechu_symfony_commons.event_listener.get_method_override_listener')
55 18
                        ->end()
56 18
                        ->scalarNode('query_param_name')
57 18
                            ->cannotBeEmpty()
58 18
                            ->defaultValue('_method')
59 18
                            ->validate()
60
                                ->ifTrue(function ($methodName): bool {
61 1
                                    return !is_string($methodName);
62 18
                                })
63 18
                                ->thenInvalid('Not a string provided')
64 18
                            ->end()
65 18
                        ->end()
66 18
                        ->arrayNode('allow_methods_override')
67 18
                            ->beforeNormalization()
68 18
                                ->ifString()->castToArray()
69 18
                            ->end()
70 18
                            ->defaultValue($defaultOverridedHttpMethods)
71 18
                            ->prototype('scalar')
72 18
                                ->validate()
73 18
                                    ->ifNotInArray($overridableHttpMethods)
74 18
                                    ->thenInvalid(sprintf(
75 18
                                        'Invalid methods to override provided, known are: "%s"',
76 18
                                        implode(', ', $overridableHttpMethods)
77
                                    ))
78 18
                                ->end()
79 18
                            ->end()
80 18
                            ->beforeNormalization()
81 18
                                ->ifArray()
82
                                ->then(function (array $methods): array {
83 3
                                    return array_unique(array_map('strtoupper', $methods));
84 18
                                })
85 18
                            ->end()
86 18
                        ->end()
87 18
                    ->end()
88 18
                ->end()
89 18
            ->end()
90 18
        ->end();
91 18
    }
92
93
    /**
94
     * @param ArrayNodeDefinition $rootNode
95
     */
96 18
    protected function addResponseSchemaValidation(ArrayNodeDefinition $rootNode): void
97
    {
98
        $rootNode
99 18
            ->children()
100 18
                ->arrayNode('response_schema_validation')
101 18
                    ->addDefaultsIfNotSet()
102 18
                    ->canBeEnabled()
103 18
                    ->children()
104 18
                        ->booleanNode('throw_exception_when_format_not_found')->defaultTrue()->end()
105 18
                        ->scalarNode('failed_schema_check_listener_service_id')
106 18
                            ->defaultValue('spiechu_symfony_commons.event_listener.failed_schema_check_listener')
107 18
                        ->end()
108 18
                        ->booleanNode('disable_json_check_schema_subscriber')->defaultFalse()->end()
109 18
                    ->end()
110 18
                ->end()
111 18
            ->end()
112 18
        ->end();
113 18
    }
114
115
    /**
116
     * @param ArrayNodeDefinition $rootNode
117
     *
118
     * @throws \InvalidArgumentException
119
     * @throws \RuntimeException
120
     */
121
    protected function addApiVersionSupport(ArrayNodeDefinition $rootNode): void
122
    {
123 3
        $versionNormalizer = static function($version): string {
124 3
            if (is_string($version)) {
125
                return $version;
126
            }
127
128 3
            if (!is_numeric($version)) {
129
                throw new \InvalidArgumentException(sprintf('"%s" is not numeric', $version));
130
            }
131
132 3
            return number_format($version, 1, '.', '');
133
        };
134
135
        $rootNode
136 18
            ->children()
137 18
                ->arrayNode('api_versioning')
138 18
                    ->addDefaultsIfNotSet()
139 18
                    ->canBeEnabled()
140 18
                    ->children()
141 18
                        ->booleanNode('versioned_view_listener')->defaultFalse()->end()
142 18
                        ->arrayNode('features')
143 18
                            ->useAttributeAsKey('name')
144 18
                            ->prototype('array')
145 18
                                ->children()
146 18
                                    ->scalarNode('since')
147 18
                                        ->defaultNull()
148 18
                                        ->beforeNormalization()
149 18
                                            ->always()
150 18
                                            ->then($versionNormalizer)
151 18
                                        ->end()
152 18
                                    ->end()
153 18
                                    ->scalarNode('until')
154 18
                                        ->defaultNull()
155 18
                                        ->beforeNormalization()
156 18
                                            ->always()
157 18
                                            ->then($versionNormalizer)
158 18
                                        ->end()
159 18
                                    ->end()
160 18
                                ->end()
161 18
                            ->end()
162 18
                        ->end()
163 18
                    ->end()
164 18
                ->end()
165 18
            ->end()
166 18
        ->end();
167 18
    }
168
169
    /**
170
     * @return string[]
171
     */
172 18
    protected function getOverridableHttpMethods(): array
173
    {
174
        return [
175 18
            Request::METHOD_CONNECT,
176 18
            Request::METHOD_DELETE,
177 18
            Request::METHOD_HEAD,
178 18
            Request::METHOD_OPTIONS,
179 18
            Request::METHOD_PATCH,
180 18
            Request::METHOD_POST,
181 18
            Request::METHOD_PURGE,
182 18
            Request::METHOD_TRACE,
183 18
            Request::METHOD_PUT,
184
        ];
185
    }
186
}
187