Scrutinizer GitHub App not installed

We could not synchronize checks via GitHub's checks API since Scrutinizer's GitHub App is not installed for this repository.

Install GitHub App

Passed
Push — master ( c29a4b...bee2e3 )
by Jérémiah
03:28 queued 11s
created

Configuration::securityQuerySection()   A

Complexity

Conditions 3
Paths 1

Size

Total Lines 26
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 18
CRAP Score 3

Importance

Changes 0
Metric Value
eloc 18
c 0
b 0
f 0
dl 0
loc 26
ccs 18
cts 18
cp 1
rs 9.6666
cc 3
nc 1
nop 2
crap 3
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Overblog\GraphQLBundle\DependencyInjection;
6
7
use GraphQL\Executor\Promise\Adapter\SyncPromiseAdapter;
8
use GraphQL\Validator\Rules\QueryComplexity;
9
use GraphQL\Validator\Rules\QueryDepth;
10
use Overblog\GraphQLBundle\Definition\Argument;
11
use Overblog\GraphQLBundle\DependencyInjection\Compiler\ConfigParserPass;
12
use Overblog\GraphQLBundle\Error\ErrorHandler;
13
use Overblog\GraphQLBundle\EventListener\ErrorLoggerListener;
14
use Overblog\GraphQLBundle\Executor\Executor;
15
use Overblog\GraphQLBundle\ExpressionLanguage\ExpressionLanguage;
16
use Overblog\GraphQLBundle\Resolver\FieldResolver;
17
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
18
use Symfony\Component\Config\Definition\Builder\EnumNodeDefinition;
19
use Symfony\Component\Config\Definition\Builder\ScalarNodeDefinition;
20
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
21
use Symfony\Component\Config\Definition\ConfigurationInterface;
22
use Symfony\Component\HttpKernel\Kernel;
23
use function array_keys;
24
use function is_array;
25
use function is_int;
26
use function is_numeric;
27
use function is_string;
28
use function sprintf;
29
30
class Configuration implements ConfigurationInterface
31
{
32
    public const NAME = 'overblog_graphql';
33
34
    private bool $debug;
35
36
    /**
37
     * @param bool $debug Whether to use the debug mode
38
     */
39 43
    public function __construct(bool $debug)
40
    {
41 43
        $this->debug = $debug;
42 43
    }
43
44 43
    public function getConfigTreeBuilder(): TreeBuilder
45
    {
46 43
        $treeBuilder = new TreeBuilder(self::NAME);
47
48 43
        $rootNode = $treeBuilder->getRootNode();
49
50
        // @phpstan-ignore-next-line
51
        $rootNode
52 43
            ->children()
53 43
                ->append($this->batchingMethodSection())
54 43
                ->append($this->definitionsSection())
55 43
                ->append($this->errorsHandlerSection())
56 43
                ->append($this->servicesSection())
57 43
                ->append($this->securitySection())
58 43
                ->append($this->doctrineSection())
59 43
                ->append($this->profilerSection())
60 43
            ->end();
61
62 43
        return $treeBuilder;
63
    }
64
65 43
    private function batchingMethodSection(): EnumNodeDefinition
66
    {
67 43
        $builder = new TreeBuilder('batching_method', 'enum');
68
69
        /** @var EnumNodeDefinition $node */
70 43
        $node = $builder->getRootNode();
71
72
        $node
73 43
            ->values(['relay', 'apollo'])
74 43
            ->defaultValue('relay')
75 43
        ->end();
76
77 43
        return $node;
78
    }
79
80 43
    private function errorsHandlerSection(): ArrayNodeDefinition
81
    {
82 43
        $builder = new TreeBuilder('errors_handler');
83
84
        /** @var ArrayNodeDefinition $node */
85 43
        $node = $builder->getRootNode();
86
87
        // @phpstan-ignore-next-line
88
        $node
89 43
            ->treatFalseLike(['enabled' => false])
90 43
            ->treatTrueLike(['enabled' => true])
91 43
            ->treatNullLike(['enabled' => true])
92 43
            ->addDefaultsIfNotSet()
93 43
            ->children()
94 43
                ->booleanNode('enabled')->defaultTrue()->end()
95 43
                ->scalarNode('internal_error_message')->defaultValue(ErrorHandler::DEFAULT_ERROR_MESSAGE)->end()
0 ignored issues
show
Bug introduced by
The method scalarNode() does not exist on Symfony\Component\Config...der\NodeParentInterface. It seems like you code against a sub-type of Symfony\Component\Config...der\NodeParentInterface such as Symfony\Component\Config...ion\Builder\NodeBuilder. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

95
                ->/** @scrutinizer ignore-call */ scalarNode('internal_error_message')->defaultValue(ErrorHandler::DEFAULT_ERROR_MESSAGE)->end()
Loading history...
96 43
                ->booleanNode('rethrow_internal_exceptions')->defaultFalse()->end()
97 43
                ->booleanNode('debug')->defaultValue($this->debug)->end()
98 43
                ->booleanNode('log')->defaultTrue()->end()
99 43
                ->scalarNode('logger_service')->defaultValue(ErrorLoggerListener::DEFAULT_LOGGER_SERVICE)->end()
100 43
                ->booleanNode('map_exceptions_to_parent')->defaultFalse()->end()
101 43
                ->arrayNode('exceptions')
102 43
                    ->addDefaultsIfNotSet()
103 43
                    ->children()
104 43
                        ->arrayNode('warnings')
105 43
                            ->treatNullLike([])
106 43
                            ->prototype('scalar')->end()
107 43
                        ->end()
108 43
                        ->arrayNode('errors')
109 43
                            ->treatNullLike([])
110 43
                            ->prototype('scalar')->end()
111 43
                    ->end()
112 43
                ->end()
113 43
            ->end();
114
115 43
        return $node;
116
    }
117
118 43
    private function definitionsSection(): ArrayNodeDefinition
119
    {
120 43
        $builder = new TreeBuilder('definitions');
121
        /** @var ArrayNodeDefinition $node */
122 43
        $node = $builder->getRootNode();
123
124
        // @phpstan-ignore-next-line
125
        $node
126 43
            ->addDefaultsIfNotSet()
127 43
            ->children()
128 43
                ->scalarNode('argument_class')->defaultValue(Argument::class)->end()
129 43
                ->scalarNode('use_experimental_executor')->defaultFalse()->end()
130 43
                ->scalarNode('default_field_resolver')->defaultValue(FieldResolver::class)->end()
131 43
                ->scalarNode('class_namespace')->defaultValue('Overblog\\GraphQLBundle\\__DEFINITIONS__')->end()
132 43
                ->scalarNode('cache_dir')->defaultNull()->end()
133 43
                ->scalarNode('cache_dir_permissions')->defaultNull()->end()
134 43
                ->booleanNode('use_classloader_listener')->defaultTrue()->end()
135 43
                ->scalarNode('auto_compile')->defaultTrue()->end()
136 43
                ->booleanNode('show_debug_info')->info('Show some performance stats in extensions')->defaultFalse()->end()
137 43
                ->booleanNode('config_validation')->defaultValue($this->debug)->end()
138 43
                ->append($this->definitionsSchemaSection())
139 43
                ->append($this->definitionsMappingsSection())
140 43
                ->arrayNode('builders')
141 43
                    ->children()
142 43
                        ->append($this->builderSection('field'))
143 43
                        ->append($this->builderSection('fields'))
144 43
                        ->append($this->builderSection('args'))
145 43
                    ->end()
146 43
                ->end()
147
148 43
            ->end()
149 43
        ->end();
150
151 43
        return $node;
152
    }
153
154 43
    private function servicesSection(): ArrayNodeDefinition
155
    {
156 43
        $builder = new TreeBuilder('services');
157
158
        /** @var ArrayNodeDefinition $node */
159 43
        $node = $builder->getRootNode();
160
161
        // @phpstan-ignore-next-line
162
        $node
163 43
            ->addDefaultsIfNotSet()
164 43
            ->children()
165 43
                ->scalarNode('executor')
166 43
                    ->defaultValue(Executor::class)
167 43
                ->end()
168 43
                ->scalarNode('promise_adapter')
169 43
                    ->defaultValue(SyncPromiseAdapter::class)
170 43
                ->end()
171 43
                ->scalarNode('expression_language')
172 43
                    ->defaultValue(ExpressionLanguage::class)
173 43
                ->end()
174 43
                ->scalarNode('cache_expression_language_parser')->end()
175 43
            ->end()
176 43
        ->end();
177
178 43
        return $node;
179
    }
180
181 43
    private function securitySection(): ArrayNodeDefinition
182
    {
183 43
        $builder = new TreeBuilder('security');
184
185
        /** @var ArrayNodeDefinition $node */
186 43
        $node = $builder->getRootNode();
187
188
        // @phpstan-ignore-next-line
189
        $node
190 43
            ->addDefaultsIfNotSet()
191 43
            ->children()
192 43
                ->append($this->securityQuerySection('query_max_depth', QueryDepth::DISABLED))
193 43
                ->append($this->securityQuerySection('query_max_complexity', QueryComplexity::DISABLED))
194 43
                ->booleanNode('enable_introspection')->defaultTrue()->end()
195 43
                ->booleanNode('handle_cors')->defaultFalse()->end()
0 ignored issues
show
Bug introduced by
The method booleanNode() does not exist on Symfony\Component\Config...der\NodeParentInterface. It seems like you code against a sub-type of Symfony\Component\Config...der\NodeParentInterface such as Symfony\Component\Config...ion\Builder\NodeBuilder. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

195
                ->/** @scrutinizer ignore-call */ booleanNode('handle_cors')->defaultFalse()->end()
Loading history...
196 43
            ->end()
197 43
        ->end();
198
199 43
        return $node;
200
    }
201
202 43
    private function definitionsSchemaSection(): ArrayNodeDefinition
203
    {
204 43
        $builder = new TreeBuilder('schema');
205
206
        /** @var ArrayNodeDefinition $node */
207 43
        $node = $builder->getRootNode();
208
209 43
        if (Kernel::VERSION_ID >= 50100) {
210 43
            $deprecatedArgs = [
211
                'overblog/graphql-bundle',
212
                '0.13',
213
                'The "%path%.%node%" configuration is deprecated and will be removed in 1.0. Add the "overblog_graphql.resolver_map" tag to the services instead.',
214
            ];
215
        } else {
216
            $deprecatedArgs = ['The "%path%.%node%" configuration is deprecated since version 0.13 and will be removed in 1.0. Add the "overblog_graphql.resolver_map" tag to the services instead.'];
217
        }
218
219
        // @phpstan-ignore-next-line
220
        $node
221 43
            ->beforeNormalization()
222 43
                ->ifTrue(fn ($v) => isset($v['query']) && is_string($v['query']) || isset($v['mutation']) && is_string($v['mutation']))
223 43
                ->then(fn ($v) => ['default' => $v])
224 43
            ->end()
225 43
            ->useAttributeAsKey('name')
0 ignored issues
show
Bug introduced by
The method useAttributeAsKey() does not exist on Symfony\Component\Config...\Builder\NodeDefinition. It seems like you code against a sub-type of Symfony\Component\Config...\Builder\NodeDefinition such as Symfony\Component\Config...der\ArrayNodeDefinition. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

225
            ->/** @scrutinizer ignore-call */ useAttributeAsKey('name')
Loading history...
226 43
            ->prototype('array')
227 43
                ->addDefaultsIfNotSet()
228 43
                ->children()
229 43
                    ->scalarNode('query')->defaultNull()->end()
230 43
                    ->scalarNode('mutation')->defaultNull()->end()
231 43
                    ->scalarNode('subscription')->defaultNull()->end()
232 43
                    ->arrayNode('resolver_maps')
233 43
                        ->defaultValue([])
234 43
                        ->prototype('scalar')->end()
235 43
                        ->setDeprecated(...$deprecatedArgs)
236 43
                    ->end()
237 43
                    ->arrayNode('types')
238 43
                        ->defaultValue([])
239 43
                        ->prototype('scalar')->end()
240 43
                    ->end()
241 43
                ->end()
242 43
            ->end()
243 43
        ->end();
244
245 43
        return $node;
246
    }
247
248 43
    private function definitionsMappingsSection(): ArrayNodeDefinition
249
    {
250 43
        $builder = new TreeBuilder('mappings');
251
252
        /** @var ArrayNodeDefinition $node */
253 43
        $node = $builder->getRootNode();
254
255
        // @phpstan-ignore-next-line
256
        $node
257 43
            ->children()
258 43
                ->arrayNode('auto_discover')
259 43
                    ->treatFalseLike(['bundles' => false, 'root_dir' => false, 'built_in' => true])
260 43
                    ->treatTrueLike(['bundles' => true, 'root_dir' => true, 'built_in' => true])
261 43
                    ->treatNullLike(['bundles' => true, 'root_dir' => true, 'built_in' => true])
262 43
                    ->addDefaultsIfNotSet()
263 43
                    ->children()
264 43
                        ->booleanNode('bundles')->defaultFalse()->end()
265 43
                        ->booleanNode('root_dir')->defaultFalse()->end()
266 43
                        ->booleanNode('built_in')->defaultTrue()->end()
267 43
                    ->end()
268 43
                ->end()
269 43
                ->arrayNode('types')
270 43
                    ->prototype('array')
271 43
                        ->addDefaultsIfNotSet()
272 43
                        ->beforeNormalization()
273 43
                            ->ifTrue(function ($v) {
274 33
                                return isset($v['type']) && is_string($v['type']);
275 43
                            })
276 43
                            ->then(function ($v) {
277 32
                                if ('yml' === $v['type']) {
278 7
                                    $v['types'] = ['yaml'];
279
                                } else {
280 25
                                    $v['types'] = [$v['type']];
281
                                }
282 32
                                unset($v['type']);
283
284 32
                                return $v;
285 43
                            })
286 43
                        ->end()
287 43
                        ->children()
288 43
                            ->arrayNode('types')
289 43
                                ->prototype('enum')->values(array_keys(ConfigParserPass::SUPPORTED_TYPES_EXTENSIONS))->isRequired()->end()
290 43
                            ->end()
291 43
                            ->scalarNode('dir')->defaultNull()->end()
292 43
                            ->scalarNode('suffix')->defaultValue(ConfigParserPass::DEFAULT_TYPES_SUFFIX)->end()
293 43
                        ->end()
294 43
                    ->end()
295 43
                ->end()
296 43
            ->end()
297
        ;
298
299 43
        return $node;
300
    }
301
302 43
    private function doctrineSection(): ArrayNodeDefinition
303
    {
304 43
        $builder = new TreeBuilder('doctrine');
305
306
        /** @var ArrayNodeDefinition $node */
307 43
        $node = $builder->getRootNode();
308
309
        // @phpstan-ignore-next-line
310
        $node
311 43
            ->addDefaultsIfNotSet()
312 43
            ->children()
313 43
                ->arrayNode('types_mapping')
314 43
                    ->defaultValue([])
315 43
                    ->prototype('scalar')->end()
316 43
                ->end()
0 ignored issues
show
Bug introduced by
The method end() does not exist on Symfony\Component\Config...der\NodeParentInterface. It seems like you code against a sub-type of said class. However, the method does not exist in Symfony\Component\Config...ion\Builder\TreeBuilder. Are you sure you never get one of those? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

316
                ->/** @scrutinizer ignore-call */ end()
Loading history...
317 43
            ->end()
318
        ;
319
320 43
        return $node;
321
    }
322
323 43
    private function profilerSection(): ArrayNodeDefinition
324
    {
325 43
        $builder = new TreeBuilder('profiler');
326
327
        /** @var ArrayNodeDefinition $node */
328 43
        $node = $builder->getRootNode();
329
330
        // @phpstan-ignore-next-line
331
        $node
332 43
            ->addDefaultsIfNotSet()
333 43
            ->children()
334 43
                ->scalarNode('query_match')->defaultNull()->end()
335 43
            ->end()
336
        ;
337
338 43
        return $node;
339
    }
340
341 43
    private function builderSection(string $name): ArrayNodeDefinition
342
    {
343 43
        $builder = new TreeBuilder($name);
344
345
        /** @var ArrayNodeDefinition $node */
346 43
        $node = $builder->getRootNode();
347
348 43
        $node->beforeNormalization()
349 43
            ->ifTrue(fn ($v) => is_array($v) && !empty($v))
350 43
            ->then(function ($v) {
351 5
                foreach ($v as $key => &$config) {
352 5
                    if (is_string($config)) {
353 5
                        $config = [
354 5
                            'alias' => $key,
355 5
                            'class' => $config,
356
                        ];
357
                    }
358
                }
359
360 5
                return $v;
361 43
            })
362 43
        ->end();
363
364
        // @phpstan-ignore-next-line
365 43
        $node->prototype('array')
366 43
            ->children()
367 43
                ->scalarNode('alias')->isRequired()->end()
368 43
                ->scalarNode('class')->isRequired()->end()
369 43
            ->end()
370 43
        ->end()
371
        ;
372
373 43
        return $node;
374
    }
375
376
    /**
377
     * @param mixed $disabledValue
378
     */
379 43
    private function securityQuerySection(string $name, $disabledValue): ScalarNodeDefinition
380
    {
381 43
        $builder = new TreeBuilder($name, 'scalar');
382
383
        /** @var ScalarNodeDefinition $node */
384 43
        $node = $builder->getRootNode();
385
386 43
        $node->beforeNormalization()
387 43
                ->ifTrue(fn ($v) => is_string($v) && is_numeric($v))
388 43
                ->then(fn ($v) => (int) $v)
389 43
            ->end();
390
391
        $node
392 43
            ->info('Disabled if equal to false.')
393 43
            ->beforeNormalization()
394 43
                ->ifTrue(fn ($v) => false === $v)
395 43
                ->then(fn () => $disabledValue)
396 43
            ->end()
397 43
            ->defaultValue($disabledValue)
398 43
            ->validate()
399 43
                ->ifTrue(fn ($v) => is_int($v) && $v < 0)
400 43
                ->thenInvalid(sprintf('"%s.security.%s" must be greater or equal to 0.', self::NAME, $name))
401 43
            ->end()
402
        ;
403
404 43
        return $node;
405
    }
406
}
407