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
Pull Request — master (#325)
by Jérémiah
13:59
created

AccessResolver   A

Complexity

Total Complexity 15

Size/Duplication

Total Lines 78
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 5

Test Coverage

Coverage 7.14%

Importance

Changes 0
Metric Value
wmc 15
c 0
b 0
f 0
lcom 1
cbo 5
dl 0
loc 78
ccs 3
cts 42
cp 0.0714
rs 10

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A resolve() 0 15 3
A filterResultUsingAccess() 0 18 4
B processFilter() 0 24 6
A hasAccess() 0 7 1
1
<?php
2
3
namespace Overblog\GraphQLBundle\Resolver;
4
5
use GraphQL\Executor\Promise\Adapter\SyncPromise;
6
use GraphQL\Executor\Promise\Promise;
7
use GraphQL\Executor\Promise\PromiseAdapter;
8
use Overblog\GraphQLBundle\Error\UserError;
9
use Overblog\GraphQLBundle\Error\UserWarning;
10
use Overblog\GraphQLBundle\Relay\Connection\Output\Connection;
11
use Overblog\GraphQLBundle\Relay\Connection\Output\Edge;
12
13
class AccessResolver
14
{
15
    /** @var PromiseAdapter */
16
    private $promiseAdapter;
17
18 39
    public function __construct(PromiseAdapter $promiseAdapter)
19
    {
20 39
        $this->promiseAdapter = $promiseAdapter;
21 39
    }
22
23
    public function resolve(callable $accessChecker, callable $resolveCallback, array $resolveArgs = [], $isMutation = false)
24
    {
25
        // operation is mutation and is mutation field
26
        if ($isMutation) {
27
            if (!$this->hasAccess($accessChecker, null, $resolveArgs)) {
28
                throw new UserError('Access denied to this field.');
29
            }
30
31
            $result = call_user_func_array($resolveCallback, $resolveArgs);
32
        } else {
33
            $result = $this->filterResultUsingAccess($accessChecker, $resolveCallback, $resolveArgs);
34
        }
35
36
        return $result;
37
    }
38
39
    private function filterResultUsingAccess(callable $accessChecker, callable $resolveCallback, array $resolveArgs = [])
40
    {
41
        $result = call_user_func_array($resolveCallback, $resolveArgs);
42
        if ($result instanceof Promise) {
43
            $result = $result->adoptedPromise;
44
        }
45
46
        if ($this->promiseAdapter->isThenable($result) || $result instanceof SyncPromise) {
47
            return $this->promiseAdapter->then(
48
                new Promise($result, $this->promiseAdapter),
49
                function ($result) use ($accessChecker, $resolveArgs) {
50
                    return $this->processFilter($result, $accessChecker, $resolveArgs);
51
                }
52
            );
53
        }
54
55
        return $this->processFilter($result, $accessChecker, $resolveArgs);
56
    }
57
58
    private function processFilter($result, $accessChecker, $resolveArgs)
59
    {
60
        if (is_array($result)) {
61
            $result = array_map(
62
                function ($object) use ($accessChecker, $resolveArgs) {
63
                    return $this->hasAccess($accessChecker, $object, $resolveArgs) ? $object : null;
64
                },
65
                $result
66
            );
67
        } elseif ($result instanceof Connection) {
68
            $result->edges = array_map(
69
                function (Edge $edge) use ($accessChecker, $resolveArgs) {
70
                    $edge->node = $this->hasAccess($accessChecker, $edge->node, $resolveArgs) ? $edge->node : null;
71
72
                    return $edge;
73
                },
74
                $result->edges
75
            );
76
        } elseif (!$this->hasAccess($accessChecker, $result, $resolveArgs)) {
77
            throw new UserWarning('Access denied to this field.');
78
        }
79
80
        return $result;
81
    }
82
83
    private function hasAccess(callable $accessChecker, $object, array $resolveArgs = [])
84
    {
85
        $resolveArgs[] = $object;
86
        $access = (bool) call_user_func_array($accessChecker, $resolveArgs);
87
88
        return $access;
89
    }
90
}
91