gdbots/ncr-bundle-php

View on GitHub
src/DependencyInjection/Configuration.php

Summary

Maintainability
C
1 day
Test Coverage
<?php
declare(strict_types=1);

namespace Gdbots\Bundle\NcrBundle\DependencyInjection;

use Gdbots\Ncr\Repository\DynamoDb\DynamoDbNcr;
use Gdbots\Ncr\Repository\DynamoDb\TableManager;
use Gdbots\Ncr\Repository\Psr6Ncr;
use Gdbots\Ncr\Search\Elastica\ElasticaNcrSearch;
use Gdbots\Ncr\Search\Elastica\IndexManager;
use Gdbots\Ncr\Search\Elastica\NodeMapper;
use Symfony\Component\Config\Definition\Builder\NodeDefinition;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

final class Configuration implements ConfigurationInterface
{
    public function getConfigTreeBuilder(): TreeBuilder
    {
        $treeBuilder = new TreeBuilder('gdbots_ncr');
        $rootNode = $treeBuilder->getRootNode();

        $rootNode
            ->children()
                ->arrayNode('ncr')
                    ->addDefaultsIfNotSet()
                    ->children()
                        ->scalarNode('provider')
                            ->defaultNull()
                        ->end()
                        ->arrayNode('memoizing')
                            ->addDefaultsIfNotSet()
                            ->children()
                                ->booleanNode('enabled')
                                    ->defaultTrue()
                                    ->treatNullLike(true)
                                ->end()
                                ->booleanNode('read_through')
                                    ->defaultFalse()
                                    ->treatNullLike(false)
                                ->end()
                            ->end()
                        ->end()
                        ->arrayNode('psr6')
                            ->addDefaultsIfNotSet()
                            ->children()
                                ->booleanNode('enabled')
                                    ->defaultTrue()
                                    ->treatNullLike(true)
                                ->end()
                                ->scalarNode('provider')
                                    ->defaultValue('cache.app')
                                ->end()
                                ->booleanNode('read_through')
                                    ->defaultTrue()
                                    ->treatNullLike(true)
                                ->end()
                                ->scalarNode('class')
                                    ->defaultValue(Psr6Ncr::class)
                                ->end()
                            ->end()
                        ->end()
                        ->append($this->getDynamoDbNcrConfigTree())
                    ->end()
                ->end()
                ->arrayNode('ncr_cache')
                    ->addDefaultsIfNotSet()
                    ->children()
                        ->integerNode('max_items')
                            ->defaultValue(500)
                        ->end()
                    ->end()
                ->end()
                ->arrayNode('ncr_search')
                    ->addDefaultsIfNotSet()
                    ->children()
                        ->scalarNode('provider')
                            ->defaultNull()
                        ->end()
                        ->append($this->getElasticaNcrSearchConfigTree())
                    ->end()
                ->end()
                ->arrayNode('node_idempotency_validator')
                    ->addDefaultsIfNotSet()
                    ->children()
                        ->arrayNode('ttl')
                            ->useAttributeAsKey('name')
                            ->normalizeKeys(false)
                            ->treatNullLike([])
                            ->defaultValue([])
                            ->integerPrototype()
                                ->min(0)
                            ->end()
                        ->end()
                    ->end()
                ->end()
            ->end()
        ;

        return $treeBuilder;
    }

    protected function getDynamoDbNcrConfigTree(): NodeDefinition
    {
        $treeBuilder = new TreeBuilder('dynamodb');
        $node = $treeBuilder->getRootNode();

        $node
            ->addDefaultsIfNotSet()
            ->children()
                ->scalarNode('class')
                    ->defaultValue(DynamoDbNcr::class)
                ->end()
                ->arrayNode('table_manager')
                    ->addDefaultsIfNotSet()
                    ->children()
                        ->scalarNode('class')
                            ->defaultValue(TableManager::class)
                        ->end()
                        ->scalarNode('table_name_prefix')
                            ->defaultValue('%env(default:app_env:CLOUD_ENV)%-ncr')
                        ->end()
                        ->arrayNode('node_tables')
                            ->useAttributeAsKey('name')
                            ->normalizeKeys(false)
                            ->treatNullLike([])
                            ->defaultValue([])
                            ->prototype('array')
                                ->fixXmlConfig('node_table')
                                ->performNoDeepMerging()
                                ->children()
                                    ->scalarNode('class')->end()
                                    ->scalarNode('table_name')->end()
                                ->end()
                            ->end()
                        ->end()
                    ->end()
                ->end()
                ->arrayNode('config')
                    ->addDefaultsIfNotSet()
                    ->children()
                        ->integerNode('batch_size')
                            ->defaultValue(100)
                        ->end()
                        ->integerNode('concurrency')
                            ->defaultValue(25)
                        ->end()
                    ->end()
                ->end()
            ->end()
        ;

        return $node;
    }

    protected function getElasticaNcrSearchConfigTree(): NodeDefinition
    {
        $treeBuilder = new TreeBuilder('elastica');
        $node = $treeBuilder->getRootNode();

        $defaultServers = [['host' => '127.0.0.1', 'port' => 9200]];
        $defaultCluster = [
            'default' => [
                'round_robin' => true,
                'timeout'     => 300,
                'debug'       => false,
                'persistent'  => true,
                'ssl'         => true,
                'servers'     => $defaultServers,
            ],
        ];

        $node
            ->addDefaultsIfNotSet()
            ->fixXmlConfig('cluster')
            ->children()
                ->scalarNode('class')
                    ->defaultValue(ElasticaNcrSearch::class)
                ->end()
                ->arrayNode('index_manager')
                    ->addDefaultsIfNotSet()
                    ->children()
                        ->scalarNode('class')
                            ->defaultValue(IndexManager::class)
                        ->end()
                        ->scalarNode('index_prefix')
                            ->defaultValue('%env(default:app_vendor:APP_VENDOR)%-%env(default:app_env:CLOUD_ENV)%-ncr')
                        ->end()
                        ->arrayNode('indexes')
                            ->useAttributeAsKey('name')
                            ->normalizeKeys(false)
                            ->treatNullLike([])
                            ->defaultValue([])
                            ->prototype('array')
                                ->fixXmlConfig('index')
                                ->performNoDeepMerging()
                                ->children()
                                    ->integerNode('number_of_shards')
                                        ->defaultValue(5)
                                    ->end()
                                    ->integerNode('number_of_replicas')
                                        ->defaultValue(1)
                                    ->end()
                                ->end()
                            ->end()
                        ->end()
                        ->arrayNode('types')
                            ->useAttributeAsKey('name')
                            ->normalizeKeys(false)
                            ->treatNullLike([])
                            ->defaultValue([])
                            ->prototype('array')
                                ->fixXmlConfig('type')
                                ->performNoDeepMerging()
                                ->children()
                                    ->scalarNode('mapper_class')
                                        ->defaultValue(NodeMapper::class)
                                    ->end()
                                    ->scalarNode('index_name')->end()
                                ->end()
                            ->end()
                        ->end()
                    ->end()
                ->end()
                ->scalarNode('query_timeout')
                    ->defaultValue('500ms')
                    ->treatNullLike('500ms')
                ->end()
                ->arrayNode('clusters')
                    ->useAttributeAsKey('name')
                    ->normalizeKeys(false)
                    ->treatNullLike($defaultCluster)
                    ->defaultValue($defaultCluster)
                    ->prototype('array')
                        ->fixXmlConfig('server')
                        ->addDefaultsIfNotSet()
                        ->performNoDeepMerging()
                        ->children()
                            ->booleanNode('round_robin')
                                ->defaultTrue()
                                ->treatNullLike(true)
                            ->end()
                            ->integerNode('timeout')
                                ->info(
                                    'Number of seconds after a timeout occurs for every request. ' .
                                    'If using indexing of file large value necessary.'
                                )
                                ->defaultValue(300)
                                ->treatNullLike(300)
                            ->end()
                            ->booleanNode('debug')
                                ->defaultFalse()
                                ->treatNullLike(false)
                            ->end()
                            ->booleanNode('persistent')
                                ->defaultTrue()
                                ->treatNullLike(true)
                            ->end()
                            ->booleanNode('ssl')
                                ->defaultTrue()
                                ->treatNullLike(true)
                            ->end()
                            ->arrayNode('servers')
                                ->requiresAtLeastOneElement()
                                ->treatNullLike($defaultServers)
                                ->defaultValue($defaultServers)
                                ->prototype('array')
                                    ->performNoDeepMerging()
                                    ->addDefaultsIfNotSet()
                                    ->children()
                                        ->scalarNode('host')
                                            ->defaultValue('127.0.0.1')
                                            ->treatNullLike('127.0.0.1')
                                        ->end()
                                        ->integerNode('port')
                                            ->defaultValue(9200)
                                            ->treatNullLike(9200)
                                        ->end()
                                    ->end()
                                ->end()
                            ->end()
                        ->end()
                    ->end()
                ->end()
            ->end()
        ;

        return $node;
    }
}