Completed
Pull Request — release-v2.1 (#14)
by Quentin
09:51 queued 06:38
created

Configuration::createDriverStrategyNode()   B

Complexity

Conditions 3
Paths 1

Size

Total Lines 37
Code Lines 28

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 37
ccs 0
cts 35
cp 0
rs 8.8571
cc 3
eloc 28
nc 1
nop 1
crap 12
1
<?php
2
3
namespace Majora\Bundle\OAuthServerBundle\DependencyInjection;
4
5
use Majora\Component\OAuth\Entity\AccessToken;
6
use Majora\Component\OAuth\Entity\RefreshToken;
7
use Majora\Component\OAuth\Model\AccessTokenInterface;
8
use Majora\Component\OAuth\Model\RefreshTokenInterface;
9
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
10
use Symfony\Component\Config\Definition\ConfigurationInterface;
11
12
/**
13
 * Majora OAuth server bundle semantical configuration class.
14
 */
15
class Configuration implements ConfigurationInterface
16
{
17
    /**
18
     * {@inheritdoc}
19
     *
20
     * @see http://symfony.com/doc/current/components/config/definition.html
21
     */
22
    public function getConfigTreeBuilder()
23
    {
24
        $treeBuilder = new TreeBuilder();
25
        $treeBuilder->root('majora_oauth_server')
26
            ->children()
27
                ->scalarNode('secret')
28
                    ->isRequired()
29
                    ->cannotBeEmpty()
30
                ->end()
31
                ->append($this->createTokenNode(
32
                    'access_token',
33
                    AccessToken::class,
34
                    AccessTokenInterface::class,
35
                    AccessTokenInterface::DEFAULT_TTL
36
                ))
37
                ->append($this->createTokenNode(
38
                    'refresh_token',
39
                    RefreshToken::class,
40
                    RefreshTokenInterface::class,
41
                    RefreshTokenInterface::DEFAULT_TTL
42
                ))
43
                ->arrayNode('application')
44
                    ->children()
45
                        ->append($this->createDriverStrategyNode('loader'))
46
                        ->append($this->createDriverStrategyNode('repository'))
47
                    ->end()
48
                ->end()
49
                ->arrayNode('account')
50
                    ->children()
51
                        ->append($this->createDriverStrategyNode('loader'))
52
                        ->append($this->createDriverStrategyNode('repository'))
53
                    ->end()
54
                ->end()
55
            ->end()
56
        ;
57
58
        return $treeBuilder;
59
    }
60
61
    /**
62
     * Create a token configuration node.
63
     *
64
     * @param string $tokenName
65
     * @param string $defaultClass
66
     * @param string $tokenInterface
67
     * @param string $defaultTtl
68
     *
69
     * @return Node
70
     */
71
    private function createTokenNode($tokenName, $defaultClass, $tokenInterface, $defaultTtl)
72
    {
73
        $builder = new TreeBuilder();
74
        $node = $builder->root($tokenName);
75
        $node
76
            ->addDefaultsIfNotSet()
77
            ->children()
78
                ->integerNode('ttl')
79
                    ->defaultValue($defaultTtl)
80
                ->end()
81
                ->scalarNode('class')
82
                    ->cannotBeEmpty()
83
                    ->defaultValue($defaultClass)
84
                    ->validate()
85
                        ->ifTrue(function ($accessTokenClass) use ($tokenInterface) {
86
                            return !(
87
                                class_exists($accessTokenClass, true)
88
                                && (new \ReflectionClass($accessTokenClass))
89
                                    ->implementsInterface($tokenInterface)
90
                            );
91
                        })
92
                        ->thenInvalid(sprintf(
93
                            'Provided access_token configuration has to be a valid class which implements %s.',
94
                            $tokenInterface
95
                        ))
96
                    ->end()
97
                ->end()
98
                ->append($this->createDriverStrategyNode('loader'))
99
                ->append($this->createDriverStrategyNode('repository'))
100
            ->end()
101
        ;
102
103
        return $node;
104
    }
105
106
    private function createDriverStrategyNode($strategyName)
107
    {
108
        $builder = new TreeBuilder();
109
        $node = $builder->root($strategyName);
110
        $node
111
            ->addDefaultsIfNotSet()
112
            ->children()
113
                ->scalarNode('id')->end()
114
                ->arrayNode('orm')
115
                    ->children()
116
                        ->scalarNode('entity_manager')
117
                            ->defaultValue('default')
118
                            ->cannotBeEmpty()
119
                        ->end()
120
                    ->end()
121
                ->end()
122
                ->scalarNode('empty')->defaultNull()->end()
123
            ->end()
124
            ->validate()
125
                ->always()
126
                ->then(function ($v) {
127
                    if (count($v) == 2) {
128
                        unset($v['empty']);
129
                    }
130
                    if (count($v) > 1) {
131
                        throw new \InvalidArgumentException(
132
                            'You provided too much drivers, you have to choose only one.'
133
                        );
134
                    }
135
136
                    return $v;
137
                })
138
            ->end()
139
        ;
140
141
        return $node;
142
    }
143
}
144