Passed
Push — master ( 61ebc4...c33ad8 )
by Pavel
17:39
created

Configuration::configureSearchAction()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 27
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 27
rs 8.8571
cc 1
eloc 18
nc 1
nop 1
1
<?php
2
3
namespace ScayTrase\Api\Cruds\DependencyInjection;
4
5
use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
6
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
7
use Symfony\Component\Config\Definition\ConfigurationInterface;
8
9
final class Configuration implements ConfigurationInterface
10
{
11
    /** {@inheritdoc} */
12
    public function getConfigTreeBuilder()
13
    {
14
        $builder = new TreeBuilder();
15
        $root    = $builder->root('cruds');
16
17
        $root
18
            ->children()
19
            ->scalarNode('prefix')
20
            ->defaultNull()
21
            ->info('Route prefix')
22
            ->example('/api');
23
24
        $entities = $root->children()->arrayNode('entities');
25
        $entities->useAttributeAsKey('name');
26
        $entities->normalizeKeys(false);
27
        /** @var ArrayNodeDefinition $entitiesProto */
28
        $entitiesProto = $entities->prototype('array');
29
30
        $this->configureEntityProto($entitiesProto);
31
32
        return $builder;
33
    }
34
35
    private function configureEntityProto(ArrayNodeDefinition $parent)
36
    {
37
        $parent
38
            ->children()
39
            ->scalarNode('class')
40
            ->isRequired()
41
            ->info('Doctrine class')
42
            ->example('MyBundle:MyEntity');
43
44
        $parent
45
            ->children()
46
            ->scalarNode('prefix')
47
            ->defaultNull()
48
            ->info('Route prefix. Defaults to entity key if not set')
49
            ->example('/my-entity');
50
51
        $parent
52
            ->children()
53
            ->scalarNode('repository')
54
            ->defaultNull()
55
            ->info('Entity repository. service reference, default to factory-acquired doctrine repository')
56
            ->example('@my_entity.repository');
57
58
59
        $actions = $parent
60
            ->children()
61
            ->arrayNode('actions');
62
63
        $actions
64
            ->beforeNormalization()
65
            ->ifArray()
66
            ->then(
67
                function (array $v) {
68
                    if (array_keys($v) !== range(0, count($v) - 1)) {
69
                        return $v;
70
                    }
71
72
                    $result = [];
73
                    foreach ($v as $key) {
74
                        $result[$key] = ['enabled' => true];
75
                    }
76
77
                    return $result;
78
                }
79
            )
80
            ->end()
81
            ->info('Action configuration')
82
            ->example(
83
                [
84
                    'create' => ['enabled' => false],
85
                    'read'   => null,
86
                    'update' => null,
87
                    'delete' => ['enabled' => true, 'path' => '/remove'],
88
                    'search' => null,
89
                ]
90
            );
91
92
        $this->configureCreateAction($actions);
93
        $this->configureReadAction($actions);
94
        $this->configureUpdateAction($actions);
95
        $this->configureDeleteAction($actions);
96
        $this->configureSearchAction($actions);
97
    }
98
99
    private function configureCreateAction(ArrayNodeDefinition $parent)
100
    {
101
        $create = $parent
102
            ->children()
103
            ->arrayNode('create');
104
        $this->configureActionNode($create, 'create');
105
    }
106
107
    private function configureSearchAction(ArrayNodeDefinition $parent)
108
    {
109
        $search = $parent
110
            ->children()
111
            ->arrayNode('search');
112
        $this->configureActionNode($search, 'search');
113
114
        $criteria = $search->children()->variableNode('criteria');
115
        $criteria
116
            ->defaultValue([])
117
            ->beforeNormalization()
118
            ->ifString()
119
            ->then(
120
                function ($v) {
121
                    return [$v];
122
                }
123
            )
124
            ->ifNull()
125
            ->thenEmptyArray();
126
127
        $criteria->info('List of prioritized criteria modifiers');
128
        $criteria->example(
129
            [
130
                '@my.criteria.modifier',
131
            ]
132
        );
133
    }
134
135
136
    private function configureReadAction(ArrayNodeDefinition $parent)
137
    {
138
        $read = $parent
139
            ->children()
140
            ->arrayNode('read');
141
        $this->configureActionNode($read, 'read');
142
    }
143
144
    private function configureUpdateAction(ArrayNodeDefinition $parent)
145
    {
146
        $update = $parent
147
            ->children()
148
            ->arrayNode('update');
149
        $this->configureActionNode($update, 'update');
150
    }
151
152
    private function configureDeleteAction(ArrayNodeDefinition $parent)
153
    {
154
        $delete = $parent
155
            ->children()
156
            ->arrayNode('delete');
157
        $this->configureActionNode($delete, 'delete');
158
    }
159
160
    private function configureActionNode(ArrayNodeDefinition $parent, $action)
161
    {
162
        $parent->canBeEnabled();
163
164
        $parent
165
            ->children()
166
            ->scalarNode('path')
167
            ->example('/'.$action)
168
            ->info('Action path (prefixed)')
169
            ->defaultValue('/'.$action);
170
    }
171
}
172