Completed
Push — master ( 1c14d6...2c9995 )
by Dawid
02:08
created

Configuration::addApiVersionSupport()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 14
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 12
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 14
ccs 12
cts 12
cp 1
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 12
nc 1
nop 1
crap 1
1
<?php
2
3
namespace Spiechu\SymfonyCommonsBundle\DependencyInjection;
4
5
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
6
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
7
use Symfony\Component\Config\Definition\ConfigurationInterface;
8
use Symfony\Component\HttpFoundation\Request;
9
10
class Configuration implements ConfigurationInterface
11
{
12
    /**
13
     * {@inheritdoc}
14
     *
15
     * @throws \RuntimeException
16
     * @throws \InvalidArgumentException
17
     */
18 13
    public function getConfigTreeBuilder(): TreeBuilder
19
    {
20 13
        $treeBuilder = new TreeBuilder();
21 13
        $rootNode = $treeBuilder->root('spiechu_symfony_commons');
22
23 13
        $this->addGetMethodOverride($rootNode);
24 13
        $this->addResponseSchemaValidation($rootNode);
25 13
        $this->addApiVersionSupport($rootNode);
26
27 13
        return $treeBuilder;
28
    }
29
30
    /**
31
     * @param ArrayNodeDefinition $rootNode
32
     *
33
     * @throws \InvalidArgumentException
34
     * @throws \RuntimeException
35
     */
36 13
    protected function addGetMethodOverride(ArrayNodeDefinition $rootNode): void
37
    {
38 13
        $overridableHttpMethods = $this->getOverridableHttpMethods();
39
        $defaultOverridedHttpMethods = [
40 13
            Request::METHOD_DELETE,
41 13
            Request::METHOD_POST,
42 13
            Request::METHOD_PUT,
43
        ];
44
45
        $rootNode
46 13
            ->children()
47 13
                ->arrayNode('get_method_override')
48 13
                    ->addDefaultsIfNotSet()
49 13
                    ->children()
50 13
                        ->booleanNode('enabled')->defaultFalse()->end()
51 13
                        ->scalarNode('listener_service_id')
52 13
                            ->cannotBeEmpty()
53 13
                            ->defaultValue('spiechu_symfony_commons.event_listener.get_method_override_listener')
54 13
                        ->end()
55 13
                        ->scalarNode('query_param_name')
56 13
                            ->cannotBeEmpty()
57 13
                            ->defaultValue('_method')
58 13
                            ->validate()
59
                                ->ifTrue(function ($methodName): bool {
60 1
                                    return !is_string($methodName);
61 13
                                })
62 13
                                ->thenInvalid('Not a string provided')
63 13
                            ->end()
64 13
                        ->end()
65 13
                        ->arrayNode('allow_methods_override')
66 13
                            ->beforeNormalization()
67 13
                                ->ifString()->castToArray()
68 13
                            ->end()
69 13
                            ->defaultValue($defaultOverridedHttpMethods)
70 13
                            ->prototype('scalar')
71 13
                                ->validate()
72 13
                                    ->ifNotInArray($overridableHttpMethods)
73 13
                                    ->thenInvalid(sprintf(
74 13
                                        'Invalid methods to override provided, known are: "%s"',
75 13
                                        implode(', ', $overridableHttpMethods)
76
                                    ))
77 13
                                ->end()
78 13
                            ->end()
79 13
                            ->beforeNormalization()
80 13
                                ->ifArray()
81 13
                                ->then(function (array $methods): array {
82 3
                                    return array_unique(array_map('strtoupper', $methods));
83 13
                                })
84 13
                            ->end()
85 13
                        ->end()
86 13
                    ->end()
87 13
                ->end()
88 13
            ->end()
89 13
        ->end();
90 13
    }
91
92
    /**
93
     * @param ArrayNodeDefinition $rootNode
94
     */
95 13
    protected function addResponseSchemaValidation(ArrayNodeDefinition $rootNode): void
96
    {
97
        $rootNode
98 13
            ->children()
99 13
                ->arrayNode('response_schema_validation')
100 13
                    ->addDefaultsIfNotSet()
101 13
                    ->children()
102 13
                        ->booleanNode('enabled')->defaultFalse()->end()
103 13
                        ->booleanNode('throw_exception_when_format_not_found')->defaultTrue()->end()
104 13
                        ->scalarNode('failed_schema_check_listener_service_id')
105 13
                            ->defaultValue('spiechu_symfony_commons.event_listener.failed_schema_check_listener')
106 13
                        ->end()
107 13
                        ->booleanNode('disable_json_check_schema_subscriber')->defaultFalse()->end()
108 13
                    ->end()
109 13
                ->end()
110 13
            ->end()
111 13
        ->end();
112 13
    }
113
114
    /**
115
     * @param ArrayNodeDefinition $rootNode
116
     */
117 13
    protected function addApiVersionSupport(ArrayNodeDefinition $rootNode): void
118
    {
119
        $rootNode
120 13
            ->children()
121 13
                ->arrayNode('api_versioning')
122 13
                    ->addDefaultsIfNotSet()
123 13
                    ->children()
124 13
                        ->booleanNode('enabled')->defaultFalse()->end()
125 13
                        ->booleanNode('versioned_view_listener')->defaultFalse()->end()
126 13
                    ->end()
127 13
                ->end()
128 13
            ->end()
129 13
        ->end();
130 13
    }
131
132
    /**
133
     * @return string[]
134
     */
135 13
    protected function getOverridableHttpMethods(): array
136
    {
137
        return [
138 13
            Request::METHOD_CONNECT,
139 13
            Request::METHOD_DELETE,
140 13
            Request::METHOD_HEAD,
141 13
            Request::METHOD_OPTIONS,
142 13
            Request::METHOD_PATCH,
143 13
            Request::METHOD_POST,
144 13
            Request::METHOD_PURGE,
145 13
            Request::METHOD_TRACE,
146 13
            Request::METHOD_PUT,
147
        ];
148
    }
149
}
150