FilterValidator::initFilters()   B
last analyzed

Complexity

Conditions 7
Paths 6

Size

Total Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 13
rs 8.8333
c 0
b 0
f 0
cc 7
nc 6
nop 1
1
<?php
2
3
namespace Mdiyakov\DoctrineSolrBundle\Filter;
4
5
use Mdiyakov\DoctrineSolrBundle\Config\Config;
6
use Mdiyakov\DoctrineSolrBundle\Exception\FilterConfigException;
7
use Mdiyakov\DoctrineSolrBundle\Exception\FilterException;
8
use Mdiyakov\DoctrineSolrBundle\Filter\Field\EntityFieldFilter;
9
10
class FilterValidator
11
{
12
13
    /**
14
     * @var EntityFilterInterface[]
15
     */
16
    private $filters = [];
17
18
    /**
19
     * @var string[][]
20
     */
21
    private $entityClassFilterMap = [];
22
23
    /**
24
     * @var string[][]
25
     */
26
    private $operatorFieldFilterConfigMap = [];
27
28
    /**
29
     * @var string[][]
30
     */
31
    private $serviceFilterConfigMap = [];
32
33
    /**
34
     * @param Config $config
35
     * @throws \Exception
36
     */
37
    public function __construct(Config $config)
38
    {
39
        $entitiesConfigs = $config->getIndexedEntities();
40
41
        foreach ($entitiesConfigs as $entityConfig) {
42
            if (array_key_exists('filters', $entityConfig)) {
43
                $this->entityClassFilterMap[$entityConfig['class']] = $entityConfig['filters'];
44
            }
45
        }
46
47
        $this->initFilters($config->getFilters());
48
    }
49
50
    /**
51
     * @param EntityFieldFilter $entityFieldFilter
52
     */
53
    public function addFieldFilter(EntityFieldFilter $entityFieldFilter)
54
    {
55
        $operator = $entityFieldFilter->getSupportedOperator();
56
57
        if (array_key_exists($operator, $this->operatorFieldFilterConfigMap) && is_array($this->operatorFieldFilterConfigMap[$operator])) {
58
            foreach($this->operatorFieldFilterConfigMap[$operator] as $filterName => $filterConfig) {
59
                $entityFieldFilterInstance = clone $entityFieldFilter;
60
                $entityFieldFilterInstance->setEntityFieldName($filterConfig['entity_field_name']);
61
                $entityFieldFilterInstance->setEntityFieldValue($filterConfig['entity_field_value']);
62
63
                $this->filters[$filterName] = $entityFieldFilterInstance;
64
            }
65
        }
66
    }
67
68
    /**
69
     * @param string $serviceId
70
     * @param EntityFilterInterface $entityFilter
71
     */
72
    public function addServiceEntityFilter($serviceId, EntityFilterInterface $entityFilter)
73
    {
74
        if (is_array($this->serviceFilterConfigMap[$serviceId])) {
0 ignored issues
show
introduced by
The condition is_array($this->serviceF...rConfigMap[$serviceId]) is always true.
Loading history...
75
            foreach($this->serviceFilterConfigMap[$serviceId] as $filterName => $filterConfig) {
76
                if ($serviceId == $filterConfig['service']) {
77
                    $this->filters[$filterName] = $entityFilter;
78
                }
79
            }
80
        }
81
    }
82
83
84
    /**
85
     * @param object $entity
86
     * @return bool
87
     * @throws FilterException
88
     * @throws \InvalidArgumentException
89
     */
90
    public function validate($entity)
91
    {
92
        if (!is_object($entity)) {
93
            throw new \InvalidArgumentException('Argument must an object');
94
        }
95
96
        $entityClass = get_class($entity);
97
        if (array_key_exists($entityClass, $this->entityClassFilterMap) &&
98
            is_array($this->entityClassFilterMap[$entityClass])
99
        ) {
100
            $filtersNames = $this->entityClassFilterMap[$entityClass];
101
            foreach ($filtersNames as $filterName) {
102
                if (!array_key_exists($filterName, $this->filters)) {
103
                    throw new FilterConfigException(
104
                        sprintf(
105
                            'Filter "%s" is not initialized',
106
                            $filterName
107
                        )
108
                    );
109
                }
110
111
                $filter = $this->filters[$filterName];
112
                if (!$filter->isFilterValid($entity)) {
113
                    throw new FilterException($filter->getErrorMessage());
114
                }
115
            }
116
        }
117
    }
118
119
    /**
120
     * @param $filtersConfig
121
     */
122
    private function initFilters($filtersConfig)
123
    {
124
        if (array_key_exists('fields', $filtersConfig) && is_array($filtersConfig['fields'])) {
125
            foreach($filtersConfig['fields'] as $filterName => $filterConfig) {
126
                $filterOperator = $filterConfig['operator'];
127
                $this->operatorFieldFilterConfigMap[$filterOperator][$filterName] = $filterConfig;
128
            }
129
        }
130
131
        if (array_key_exists('services', $filtersConfig) && is_array($filtersConfig['services'])) {
132
            foreach($filtersConfig['services'] as $filterName => $filterConfig) {
133
                $serviceId = $filterConfig['service'];
134
                $this->serviceFilterConfigMap[$serviceId][$filterName] = $filterConfig;
135
            }
136
137
        }
138
    }
139
}