Completed
Push — master ( 02bdb0...8b9461 )
by Rafał
22s
created

RulesProcessor::merge()   B

Complexity

Conditions 7
Paths 5

Size

Total Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 15
rs 8.8333
c 0
b 0
f 0
cc 7
nc 5
nop 2
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the Superdesk Web Publisher Core Bundle.
7
 *
8
 * Copyright 2018 Sourcefabric z.ú. and contributors.
9
 *
10
 * For the full copyright and license information, please see the
11
 * AUTHORS and LICENSE files distributed with this source code.
12
 *
13
 * @copyright 2018 Sourcefabric z.ú
14
 * @license http://www.superdesk.org/license
15
 */
16
17
namespace SWP\Bundle\CoreBundle\Processor;
18
19
use SWP\Bundle\ContentBundle\Model\RouteInterface;
20
use SWP\Bundle\ContentBundle\Model\RouteRepositoryInterface;
21
use SWP\Bundle\CoreBundle\Model\RuleInterface;
22
use SWP\Component\MultiTenancy\Repository\TenantRepositoryInterface;
23
24
final class RulesProcessor implements RulesProcessorInterface
25
{
26
    /**
27
     * @var TenantRepositoryInterface
28
     */
29
    private $tenantRepository;
30
31
    /**
32
     * @var RouteRepositoryInterface
33
     */
34
    private $routeRepository;
35
36
    /**
37
     * RulesProcessor constructor.
38
     *
39
     * @param TenantRepositoryInterface $tenantRepository
40
     * @param RouteRepositoryInterface  $routeRepository
41
     */
42
    public function __construct(TenantRepositoryInterface $tenantRepository, RouteRepositoryInterface $routeRepository)
43
    {
44
        $this->tenantRepository = $tenantRepository;
45
        $this->routeRepository = $routeRepository;
46
    }
47
48
    /**
49
     * {@inheritdoc}
50
     */
51
    public function process(array $evaluatedRules): array
52
    {
53
        $processedEvaluatedRules = $this->processEvaluatedRules($evaluatedRules);
54
        $tenants = [];
55
56
        foreach ($processedEvaluatedRules as $key => $processedEvaluatedRule) {
57
            foreach ($evaluatedRules as $evaluatedRule) {
58
                if (null !== $evaluatedRule->getTenantCode()) {
59
                    if (!empty($processedEvaluatedRule)) {
60
                        $matched = $this->match((array) $processedEvaluatedRule[self::KEY_TENANTS], $evaluatedRule);
61
62
                        if (!empty($matched)) {
63
                            $tenants[] = $matched;
64
                        }
65
                    }
66
                }
67
            }
68
        }
69
70
        return $this->merge($processedEvaluatedRules, $tenants);
71
    }
72
73
    private function processEvaluatedRules(array $rules): array
74
    {
75
        $processedRules = [
76
            self::KEY_ORGANIZATION => null,
77
            self::KEY_TENANTS => [],
78
        ];
79
80
        foreach ($rules as $evaluatedRule) {
81
            if (null === $evaluatedRule->getTenantCode()) {
82
                $processedRules[self::KEY_ORGANIZATION] = $evaluatedRule->getOrganization();
83
                $evaluatedRuleConfig = $evaluatedRule->getConfiguration();
84
85
                foreach ((array) $evaluatedRuleConfig['destinations'] as $item) {
86
                    $processedRules[self::KEY_TENANTS][][self::KEY_TENANT] = $this->tenantRepository->findOneByCode($item[self::KEY_TENANT]);
87
                }
88
            }
89
        }
90
91
        return [$processedRules];
92
    }
93
94
    private function match(array $tenants, RuleInterface $evaluatedRule): array
95
    {
96
        $tenantsTemp = [];
97
        $ruleConfig = $evaluatedRule->getConfiguration();
98
        foreach ($tenants as $tenant) {
99
            if (isset($tenant[self::KEY_TENANT]) && $tenant[self::KEY_TENANT]->getCode() === $evaluatedRule->getTenantCode()) {
100
                if (null === $route = $this->findRoute($evaluatedRule)) {
101
                    continue;
102
                }
103
104
                $tenant[self::KEY_ROUTE] = $route;
105
                $tenant[self::KEY_FBIA] = isset($ruleConfig[self::KEY_FBIA]) ?? false;
106
                $tenant[self::KEY_PUBLISHED] = isset($ruleConfig[self::KEY_PUBLISHED]) ?? false;
107
                $tenant[self::KEY_PAYWALL_SECURED] = isset($ruleConfig[self::KEY_PAYWALL_SECURED]) ?? false;
108
                $tenantsTemp[] = $tenant;
109
            }
110
        }
111
112
        if (empty($tenantsTemp)) {
113
            return $tenantsTemp;
114
        }
115
116
        return $tenantsTemp[0];
117
    }
118
119
    private function findRoute(RuleInterface $evaluatedRule): ?RouteInterface
120
    {
121
        return $this->routeRepository->findOneBy(['id' => $evaluatedRule->getConfiguration()[self::KEY_ROUTE]]);
122
    }
123
124
    private function merge(array $organizationRules, array $tenants): array
125
    {
126
        foreach ($organizationRules as $keyOrg => $processedEvaluatedRule) {
127
            foreach ($tenants as $tenant) {
128
                foreach ((array) $processedEvaluatedRule[self::KEY_TENANTS] as $key => $orgTenant) {
129
                    if (isset($tenant[self::KEY_TENANT]) && isset($orgTenant[self::KEY_TENANT])
130
                        && $tenant[self::KEY_TENANT]->getCode() === $orgTenant[self::KEY_TENANT]->getCode()) {
131
                        $organizationRules[$keyOrg][self::KEY_TENANTS][$key] = $tenant;
132
                    }
133
                }
134
            }
135
        }
136
137
        return $organizationRules[0];
138
    }
139
}
140