Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
97 / 97
100.00% covered (success)
100.00%
1 / 1
CRAP
100.00% covered (success)
100.00%
1 / 1
Configuration
100.00% covered (success)
100.00%
97 / 97
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
1 / 1
 addCmsOptions
n/a
0 / 0
n/a
0 / 0
0
 addApiOptions
n/a
0 / 0
n/a
0 / 0
0
 getConfigTreeBuilder
100.00% covered (success)
100.00%
97 / 97
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2namespace Apie\Common\Config;
3
4use Apie\DoctrineEntityDatalayer\IndexStrategy\DirectIndexStrategy;
5use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
6use Symfony\Component\Config\Definition\Builder\TreeBuilder;
7use Symfony\Component\Config\Definition\ConfigurationInterface;
8
9/**
10 * Configuration
11 */
12abstract class Configuration implements ConfigurationInterface
13{
14    private const ENABLE_CONFIGS = [
15        'enable_ai_instructor' => 'Apie\AiInstructor\AiInstructor',
16        'enable_common_plugin' => 'Apie\ApieCommonPlugin\ApieCommonPlugin',
17        'enable_cms' => 'Apie\Cms\RouteDefinitions\CmsRouteDefinitionProvider',
18        'enable_cms_dropdown' => 'Apie\CmsApiDropdownOption\RouteDefinitions\DropdownOptionsForExistingObjectRouteDefinition',
19        'enable_doctrine_entity_converter' => 'Apie\DoctrineEntityConverter\OrmBuilder',
20        'enable_doctrine_entity_datalayer' => 'Apie\DoctrineEntityDatalayer\DoctrineEntityDatalayer',
21        'enable_export' => 'Apie\Export\EntityExport',
22        'enable_faker' => 'Apie\Faker\ApieObjectFaker',
23        'enable_maker' => 'Apie\Maker\Utils',
24        'enable_mcp_server' => 'Apie\McpServer\RunMcpServerCommand',
25        'enable_rest_api' => 'Apie\RestApi\OpenApi\OpenApiGenerator',
26        'enable_console' => 'Apie\Console\ConsoleCommandFactory',
27        'enable_twig_template_layout_renderer' => 'Apie\TwigTemplateLayoutRenderer\TwigRenderer',
28        'enable_typescript_client_builder' => 'Apie\TypescriptClientBuilder\RouteDefinitions\CodeRouteDefinitionProvider',
29        'enable_webdav' => 'Apie\Webdav\Controller\WebdavController',
30    ];
31
32    abstract protected function addCmsOptions(ArrayNodeDefinition $arrayNode): void;
33
34    abstract protected function addApiOptions(ArrayNodeDefinition $arrayNode): void;
35
36    public function getConfigTreeBuilder(): TreeBuilder
37    {
38        $treeBuilder = new TreeBuilder('apie');
39
40        $children = $treeBuilder->getRootNode()->children();
41        $children->booleanNode('enable_core')->defaultValue(true)->end();
42        $children->scalarNode('encryption_key')->end();
43        $cmsConfig = $children->arrayNode('cms');
44        $cmsConfig->children()
45          ->scalarNode('base_url')->defaultValue('/cms')->end()
46          ->arrayNode('asset_folders')->scalarPrototype()->end()
47        ->end();
48        $this->addCmsOptions($cmsConfig);
49        $apiConfig = $children->arrayNode('rest_api');
50        $apiConfig->children()
51          ->scalarNode('base_url')->defaultValue('/api')->end()
52        ->end();
53        $this->addApiOptions($apiConfig);
54
55        $aiConfig = $children->arrayNode('ai')
56          ->addDefaultsIfNotSet();
57        $aiConfig->children()
58            ->scalarNode('base_url')->defaultValue('https://api.openai.com/v1')->end()
59            ->scalarNode('api_key')->defaultValue('no-value')->end()
60        ->end();
61        $children->arrayNode('datalayers')
62                ->children()
63                    ->scalarNode('default_datalayer')->isRequired()->end()
64                    ->arrayNode('context_mapping')
65                        ->useAttributeAsKey('name')
66                        ->arrayPrototype()
67                            ->isRequired()
68                            ->children()
69                                ->scalarNode('default_datalayer')->isRequired()->end()
70                                ->arrayNode('entity_mapping')
71                                    ->useAttributeAsKey('class')
72                                    ->scalarPrototype()
73                                    ->end()
74                                ->end()
75                            ->end()
76                        ->end()
77                    ->end()
78                ->end()
79            ->end()
80            ->arrayNode('doctrine')
81                ->children()
82                    ->arrayNode('indexing')
83                        ->children()
84                            ->enumNode('type')->values(['direct', 'late', 'background', 'custom'])->defaultValue('direct')->end()
85                            ->scalarNode('service')->defaultValue(DirectIndexStrategy::class)->end()
86                        ->end()
87                    ->end()
88                    ->scalarNode('build_once')->defaultValue(false)->end()
89                    ->scalarNode('run_migrations')->defaultValue(true)->end()
90                    ->arrayNode('connection_params')
91                      ->defaultValue(['driver' => 'pdo_sqlite'])
92                      ->useAttributeAsKey('class')
93                      ->scalarPrototype()
94                      ->end()
95                    ->end()
96                ->end()
97            ->end()
98            ->arrayNode('storage')
99              ->arrayPrototype()
100                ->children()
101                  ->scalarNode('class')->isRequired()->end()
102                  ->arrayNode('options')->defaultValue([])
103                    ->scalarPrototype()
104                    ->end()
105                  ->end()
106                ->end()
107              ->end()
108            ->end()
109            ->arrayNode('maker')
110                ->children()
111                  ->scalarNode('target_path')->defaultValue(false)->end()
112                  ->scalarNode('target_namespace')->defaultValue('App\Apie')->end()
113                ->end()
114            ->end()
115            ->arrayNode('bounded_contexts')
116                ->useAttributeAsKey('name')
117                ->arrayPrototype()
118                    ->children()
119                        ->scalarNode('entities_folder')->isRequired()->end()
120                        ->scalarNode('entities_namespace')->isRequired()->end()
121                        ->scalarNode('actions_folder')->isRequired()->end()
122                        ->scalarNode('actions_namespace')->isRequired()->end()
123                    ->end()
124                ->end()
125            ->end()
126            ->arrayNode('scan_bounded_contexts')
127                ->children()
128                    ->scalarNode('search_path')->end()
129                    ->scalarNode('search_namespace')->end()
130                ->end()
131            ->end();
132        $childNode = $treeBuilder->getRootNode()->children();
133        foreach (self::ENABLE_CONFIGS as $configKey => $classNameToExist) {
134            $childNode->booleanNode($configKey)->defaultValue(class_exists($classNameToExist));
135        }
136        $childNode->scalarNode('remote_mcp_path')->defaultValue(null)->end();
137        return $treeBuilder;
138    }
139}