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
Pull Request — master (#494)
by Jérémiah
18:56
created

AclConfigProcessor   A

Complexity

Total Complexity 13

Size/Duplication

Total Lines 72
Duplicated Lines 0 %

Test Coverage

Coverage 86.67%

Importance

Changes 0
Metric Value
wmc 13
eloc 31
dl 0
loc 72
ccs 26
cts 30
cp 0.8667
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A process() 0 15 3
A findFieldResolver() 0 11 3
A acl() 0 21 6
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Overblog\GraphQLBundle\Definition\ConfigProcessor;
6
7
use GraphQL\Type\Definition\ResolveInfo;
8
use Overblog\GraphQLBundle\Definition\LazyConfig;
9
use Overblog\GraphQLBundle\Error\UserWarning;
10
use Overblog\GraphQLBundle\Resolver\AccessResolver;
11
12
final class AclConfigProcessor implements ConfigProcessorInterface
13
{
14
    /** @var AccessResolver */
15
    private $accessResolver;
16
17
    /** @var callable */
18
    private $defaultResolver;
19
20 69
    public function __construct(AccessResolver $accessResolver, callable $defaultResolver)
21
    {
22 69
        $this->accessResolver = $accessResolver;
23 69
        $this->defaultResolver = $defaultResolver;
24 69
    }
25
26 57
    public static function acl(array $fields, AccessResolver $accessResolver, callable $defaultResolver)
27
    {
28
        $deniedAccess = static function (): void {
29
            throw new UserWarning('Access denied to this field.');
30 57
        };
31 57
        foreach ($fields as &$field) {
32 57
            if (isset($field['access']) && true !== $field['access']) {
33 1
                $accessChecker = $field['access'];
34 1
                if (false === $accessChecker) {
35
                    $field['resolve'] = $deniedAccess;
36 1
                } elseif (\is_callable($accessChecker)) {
37
                    $field['resolve'] = function ($value, $args, $context, ResolveInfo $info) use ($field, $accessChecker, $accessResolver, $defaultResolver) {
38 1
                        $resolverCallback = self::findFieldResolver($field, $info, $defaultResolver);
39
40 1
                        return $accessResolver->resolve($accessChecker, $resolverCallback, [$value, $args, $context, $info], $field['useStrictAccess']);
41
                    };
42
                }
43
            }
44
        }
45
46 57
        return $fields;
47
    }
48
49 69
    public function process(LazyConfig $lazyConfig): LazyConfig
50
    {
51
        $lazyConfig->addPostLoader(function ($config) {
52 69
            if (isset($config['fields']) && \is_callable($config['fields'])) {
53
                $config['fields'] = function () use ($config) {
54 57
                    $fields = $config['fields']();
55
56 57
                    return static::acl($fields, $this->accessResolver, $this->defaultResolver);
57
                };
58
            }
59
60 69
            return $config;
61 69
        });
62
63 69
        return $lazyConfig;
64
    }
65
66
    /**
67
     * @param array       $field
68
     * @param ResolveInfo $info
69
     * @param callable    $defaultResolver
70
     *
71
     * @return callable
72
     */
73 1
    private static function findFieldResolver(array $field, ResolveInfo $info, callable $defaultResolver): callable
74
    {
75 1
        if (isset($field['resolve'])) {
76
            $resolver = $field['resolve'];
77 1
        } elseif (isset($info->parentType->config['resolveField'])) {
78 1
            $resolver = $info->parentType->config['resolveField'];
79
        } else {
80
            $resolver = $defaultResolver;
81
        }
82
83 1
        return $resolver;
84
    }
85
}
86