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

Completed
Push — master ( 8ac73c...b87729 )
by Jérémiah
21s queued 14s
created

setDefaultFieldResolver()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
eloc 1
dl 0
loc 3
ccs 2
cts 2
cp 1
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 2
crap 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Overblog\GraphQLBundle\DependencyInjection;
6
7
use GraphQL\Error\UserError;
8
use GraphQL\Type\Definition\Type;
9
use GraphQL\Type\Schema;
10
use Overblog\GraphQLBundle\CacheWarmer\CompileCacheWarmer;
11
use Overblog\GraphQLBundle\Config\Processor\BuilderProcessor;
12
use Overblog\GraphQLBundle\Definition\Builder\SchemaBuilder;
13
use Overblog\GraphQLBundle\Definition\Resolver\MutationInterface;
14
use Overblog\GraphQLBundle\Definition\Resolver\ResolverInterface;
15
use Overblog\GraphQLBundle\Error\ErrorHandler;
16
use Overblog\GraphQLBundle\Error\UserWarning;
17
use Overblog\GraphQLBundle\Event\Events;
18
use Overblog\GraphQLBundle\EventListener\ClassLoaderListener;
19
use Overblog\GraphQLBundle\EventListener\DebugListener;
20
use Overblog\GraphQLBundle\EventListener\ErrorHandlerListener;
21
use Overblog\GraphQLBundle\EventListener\ErrorLoggerListener;
22
use Overblog\GraphQLBundle\EventListener\TypeDecoratorListener;
23
use Overblog\GraphQLBundle\Request\Executor;
24
use Symfony\Component\Config\FileLocator;
25
use Symfony\Component\DependencyInjection\ContainerBuilder;
26
use Symfony\Component\DependencyInjection\ContainerInterface;
27
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
28
use Symfony\Component\DependencyInjection\Reference;
29
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
30
31
class OverblogGraphQLExtension extends Extension
32
{
33 41
    public function load(array $configs, ContainerBuilder $container): void
34
    {
35 41
        $this->loadConfigFiles($container);
36 41
        $configuration = $this->getConfiguration($configs, $container);
37 41
        $config = $this->processConfiguration($configuration, $configs);
38
39 41
        $this->setBatchingMethod($config, $container);
40 41
        $this->setServicesAliases($config, $container);
41 41
        $this->setSchemaBuilderArguments($config, $container);
42 41
        $this->setSchemaArguments($config, $container);
43 41
        $this->setErrorHandler($config, $container);
44 41
        $this->setSecurity($config, $container);
45 41
        $this->setConfigBuilders($config, $container);
46 41
        $this->setDebugListener($config, $container);
47 41
        $this->setDefinitionParameters($config, $container);
48 41
        $this->setClassLoaderListener($config, $container);
49 41
        $this->setCompilerCacheWarmer($config, $container);
50 41
        $this->registerForAutoconfiguration($container);
51
        $this->setDefaultFieldResolver($config, $container);
52 41
53 41
        $container->setParameter($this->getAlias().'.config', $config);
54 41
        $container->setParameter($this->getAlias().'.resources_dir', \realpath(__DIR__.'/../Resources'));
55
    }
56 41
57
    public function getAlias()
58 41
    {
59
        return Configuration::NAME;
60
    }
61 41
62
    public function getConfiguration(array $config, ContainerBuilder $container)
63 41
    {
64 41
        return new Configuration(
65 41
            $container->getParameter('kernel.debug'),
66
            $container->hasParameter('kernel.cache_dir') ? $container->getParameter('kernel.cache_dir') : null
67
        );
68
    }
69 41
70
    private function loadConfigFiles(ContainerBuilder $container): void
71 41
    {
72 41
        $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
73 41
        $loader->load('services.yaml');
74 41
        $loader->load('commands.yaml');
75 41
        $loader->load('listeners.yaml');
76 41
        $loader->load('graphql_types.yaml');
77 41
        $loader->load('graphql_resolvers.yaml');
78 41
        $loader->load('expression_language_functions.yaml');
79 41
        $loader->load('definition_config_processors.yaml');
80 41
        $loader->load('aliases.yaml');
81
    }
82 41
83
    private function registerForAutoconfiguration(ContainerBuilder $container): void
84 41
    {
85 41
        $container->registerForAutoconfiguration(MutationInterface::class)
86 41
            ->addTag('overblog_graphql.mutation');
87 41
        $container->registerForAutoconfiguration(ResolverInterface::class)
88 41
            ->addTag('overblog_graphql.resolver');
89 41
        $container->registerForAutoconfiguration(Type::class)
90 41
            ->addTag('overblog_graphql.type');
91
    }
92 41
93
    private function setDefaultFieldResolver(array $config, ContainerBuilder $container): void
94 41
    {
95 41
        $container->setAlias($this->getAlias().'.default_field_resolver', $config['definitions']['default_field_resolver']);
96 41
    }
97 41
98
    private function setCompilerCacheWarmer(array $config, ContainerBuilder $container): void
99 41
    {
100
        $container->register(CompileCacheWarmer::class)
101 41
            ->setArguments([
102
                new Reference($this->getAlias().'.cache_compiler'),
103 41
                $config['definitions']['auto_compile'],
104
            ])
105 41
            ->addTag('kernel.cache_warmer', ['priority' => 50])
106 41
        ;
107 40
    }
108 40
109 40
    private function setClassLoaderListener(array $config, ContainerBuilder $container): void
110
    {
111 40
        $container->setParameter($this->getAlias().'.use_classloader_listener', $config['definitions']['use_classloader_listener']);
112 40
        if ($config['definitions']['use_classloader_listener']) {
113 40
            $definition = $container->register(
114 40
                $this->getAlias().'.event_listener.classloader_listener',
115
                ClassLoaderListener::class
116 41
            );
117
            $definition->setPublic(true);
118 41
            $definition->setArguments([new Reference($this->getAlias().'.cache_compiler')]);
119
            $definition->addTag('kernel.event_listener', ['event' => 'kernel.request', 'method' => 'load', 'priority' => 255]);
120
            $definition->addTag('kernel.event_listener', ['event' => 'console.command', 'method' => 'load', 'priority' => 255]);
121 41
        }
122 41
    }
123 41
124 41
    private function setDefinitionParameters(array $config, ContainerBuilder $container): void
125 41
    {
126 41
        // generator and config
127 41
        $container->setParameter($this->getAlias().'.class_namespace', $config['definitions']['class_namespace']);
128
        $container->setParameter($this->getAlias().'.cache_dir', $config['definitions']['cache_dir']);
129 41
        $container->setParameter($this->getAlias().'.cache_dir_permissions', $config['definitions']['cache_dir_permissions']);
130
        $container->setParameter($this->getAlias().'.argument_class', $config['definitions']['argument_class']);
131 41
        $container->setParameter($this->getAlias().'.use_experimental_executor', $config['definitions']['use_experimental_executor']);
132 41
    }
133
134 41
    private function setBatchingMethod(array $config, ContainerBuilder $container): void
135
    {
136 41
        $container->setParameter($this->getAlias().'.batching_method', $config['batching_method']);
137 1
    }
138 1
139 1
    private function setDebugListener(array $config, ContainerBuilder $container): void
140
    {
141 41
        if ($config['definitions']['show_debug_info']) {
142
            $definition = $container->register(DebugListener::class);
143 41
            $definition->addTag('kernel.event_listener', ['event' => Events::PRE_EXECUTOR, 'method' => 'onPreExecutor']);
144
            $definition->addTag('kernel.event_listener', ['event' => Events::POST_EXECUTOR, 'method' => 'onPostExecutor']);
145 41
        }
146 41
    }
147 5
148 5
    private function setConfigBuilders(array $config, ContainerBuilder $container): void
149 5
    {
150
        foreach (BuilderProcessor::BUILDER_TYPES as $type) {
151
            if (!empty($config['definitions']['builders'][$type])) {
152
                foreach ($config['definitions']['builders'][$type] as $params) {
153 41
                    $container->addObjectResource($params['class']);
154
                    BuilderProcessor::addBuilderClass($params['alias'], $type, $params['class']);
155 41
                }
156
            }
157 41
        }
158 41
    }
159 40
160
    private function setSecurity(array $config, ContainerBuilder $container): void
161 1
    {
162
        $executorDefinition = $container->getDefinition(Executor::class);
163
        if ($config['security']['enable_introspection']) {
164 41
            $executorDefinition->addMethodCall('enableIntrospectionQuery');
165 41
        } else {
166
            $executorDefinition->addMethodCall('disableIntrospectionQuery');
167 41
        }
168
169 41
        foreach ($config['security'] as $key => $value) {
170
            $container->setParameter(\sprintf('%s.%s', $this->getAlias(), $key), $value);
171 41
        }
172 41
    }
173 41
174 41
    private function setErrorHandler(array $config, ContainerBuilder $container): void
175
    {
176 41
        if ($config['errors_handler']['enabled']) {
177 41
            $id = $this->getAlias().'.error_handler';
178 41
            $container->register($id, ErrorHandler::class)
179 41
                ->setArguments(
180
                    [
181
                        new Reference('event_dispatcher'),
182
                        $config['errors_handler']['internal_error_message'],
183 41
                        $this->buildExceptionMap($config['errors_handler']['exceptions']),
184 41
                        $config['errors_handler']['map_exceptions_to_parent'],
185 41
                    ]
186 41
                );
187
188 41
            $errorHandlerListenerDefinition = $container->register(ErrorHandlerListener::class);
189 41
            $errorHandlerListenerDefinition->setPublic(true)
190 41
                ->setArguments([new Reference($id), $config['errors_handler']['rethrow_internal_exceptions'], $config['errors_handler']['debug']])
191 41
                ->addTag('kernel.event_listener', ['event' => Events::POST_EXECUTOR, 'method' => 'onPostExecutor']);
192 41
193 41
            if ($config['errors_handler']['log']) {
194 41
                $loggerServiceId = $config['errors_handler']['logger_service'];
195
                $invalidBehavior = ErrorLoggerListener::DEFAULT_LOGGER_SERVICE === $loggerServiceId ? ContainerInterface::NULL_ON_INVALID_REFERENCE : ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE;
196
                $container->register(ErrorLoggerListener::class)
197 41
                    ->setPublic(true)
198
                    ->setArguments([new Reference($loggerServiceId, $invalidBehavior)])
199 41
                    ->addTag('kernel.event_listener', ['event' => Events::ERROR_FORMATTING, 'method' => 'onErrorFormatting']);
200
            }
201 41
        }
202 41
    }
203 41
204
    private function setSchemaBuilderArguments(array $config, ContainerBuilder $container): void
205 41
    {
206
        $container->getDefinition(SchemaBuilder::class)
207 41
            ->replaceArgument(1, $config['definitions']['config_validation']);
208 41
    }
209 41
210
    private function setSchemaArguments(array $config, ContainerBuilder $container): void
211 41
    {
212
        if (isset($config['definitions']['schema'])) {
213 33
            $executorDefinition = $container->getDefinition(Executor::class);
214 33
            $typeDecoratorListenerDefinition = $container->getDefinition(TypeDecoratorListener::class);
215 33
216 33
            foreach ($config['definitions']['schema'] as $schemaName => $schemaConfig) {
217 33
                // builder
218 33
                $schemaBuilderID = \sprintf('%s.schema_builder_%s', $this->getAlias(), $schemaName);
219 33
                $definition = $container->register($schemaBuilderID, \Closure::class);
220 33
                $definition->setFactory([new Reference('overblog_graphql.schema_builder'), 'getBuilder']);
221 33
                $definition->setArguments([
222
                    $schemaName,
223
                    $schemaConfig['query'],
224 33
                    $schemaConfig['mutation'],
225 33
                    $schemaConfig['subscription'],
226 33
                    $schemaConfig['types'],
227
                ]);
228 33
                // schema
229 1
                $schemaID = \sprintf('%s.schema_%s', $this->getAlias(), $schemaName);
230 1
                $definition = $container->register($schemaID, Schema::class);
231
                $definition->setFactory([new Reference($schemaBuilderID), 'call']);
232 1
233
                if (!empty($schemaConfig['resolver_maps'])) {
234 1
                    $typeDecoratorListenerDefinition->addMethodCall(
235 1
                        'addSchemaResolverMaps',
236
                        [
237
                            $schemaName,
238
                            \array_map(function ($id) {
239 33
                                return new Reference($id);
240
                            }, $schemaConfig['resolver_maps']),
241
                        ]
242 41
                    );
243
                }
244 41
                $executorDefinition->addMethodCall('addSchemaBuilder', [$schemaName, new Reference($schemaBuilderID)]);
245
            }
246 41
        }
247 41
    }
248 41
249 41
    private function setServicesAliases(array $config, ContainerBuilder $container): void
250
    {
251
        if (isset($config['services'])) {
252 41
            foreach ($config['services'] as $name => $id) {
253
                $alias = \sprintf('%s.%s', $this->getAlias(), $name);
254
                $container->setAlias($alias, $id);
255
            }
256
        }
257
    }
258
259
    /**
260
     * Returns a list of custom exceptions mapped to error/warning classes.
261 41
     *
262
     * @param array $exceptionConfig
263 41
     *
264
     * @return array Custom exception map, [exception => UserError/UserWarning]
265 41
     */
266
    private function buildExceptionMap(array $exceptionConfig)
267
    {
268
        $exceptionMap = [];
269 41
        $errorsMapping = [
270 41
            'errors' => UserError::class,
271 2
            'warnings' => UserWarning::class,
272
        ];
273
274
        foreach ($exceptionConfig as $type => $exceptionList) {
275 41
            foreach ($exceptionList as $exception) {
276
                $exceptionMap[$exception] = $errorsMapping[$type];
277
            }
278
        }
279
280
        return $exceptionMap;
281
    }
282
}
283