Passed
Push — master ( 1a7a28...c3773f )
by Mikołaj
03:50
created

OptionTaxonsBuilder::consumeEvent()   B

Complexity

Conditions 5
Paths 4

Size

Total Lines 25
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 13
nc 4
nop 1
dl 0
loc 25
rs 8.439
c 0
b 0
f 0
1
<?php
2
3
/*
4
 * This file has been created by developers from BitBag.
5
 * Feel free to contact us once you face any issues or want to start
6
 * another great project.
7
 * You can find more information about us on https://bitbag.shop and write us
8
 * an email on [email protected].
9
 */
10
11
declare(strict_types=1);
12
13
namespace BitBag\SyliusElasticsearchPlugin\PropertyBuilder;
14
15
use BitBag\SyliusElasticsearchPlugin\EntityRepository\ProductVariantRepositoryInterface;
16
use BitBag\SyliusElasticsearchPlugin\PropertyBuilder\Mapper\ProductTaxonsMapperInterface;
17
use FOS\ElasticaBundle\Event\TransformEvent;
18
use Sylius\Component\Core\Model\ProductInterface;
19
use Sylius\Component\Product\Model\ProductOptionInterface;
20
use Sylius\Component\Product\Model\ProductOptionValueInterface;
21
use Sylius\Component\Resource\Repository\RepositoryInterface;
22
23
final class OptionTaxonsBuilder extends AbstractBuilder
24
{
25
    /**
26
     * @var RepositoryInterface
27
     */
28
    private $productOptionValueRepository;
29
30
    /**
31
     * @var ProductVariantRepositoryInterface
32
     */
33
    private $productVariantRepository;
34
35
    /**
36
     * @var ProductTaxonsMapperInterface
37
     */
38
    private $productTaxonsMapper;
39
40
    /**
41
     * @var string
42
     */
43
    private $optionProperty;
44
45
    /**
46
     * @var string
47
     */
48
    private $taxonsProperty;
49
50
    /**
51
     * @var array
52
     */
53
    private $excludedOptions;
54
55
    /**
56
     * @param RepositoryInterface $productOptionValueRepository
57
     * @param ProductVariantRepositoryInterface $productVariantRepository
58
     * @param ProductTaxonsMapperInterface $productTaxonsMapper
59
     * @param string $optionProperty
60
     * @param string $taxonsProperty
61
     * @param array $excludedOptions
62
     */
63
    public function __construct(
64
        RepositoryInterface $productOptionValueRepository,
65
        ProductVariantRepositoryInterface $productVariantRepository,
66
        ProductTaxonsMapperInterface $productTaxonsMapper,
67
        string $optionProperty,
68
        string $taxonsProperty,
69
        array $excludedOptions = []
70
    ) {
71
        $this->productOptionValueRepository = $productOptionValueRepository;
72
        $this->productVariantRepository = $productVariantRepository;
73
        $this->productTaxonsMapper = $productTaxonsMapper;
74
        $this->optionProperty = $optionProperty;
75
        $this->taxonsProperty = $taxonsProperty;
76
        $this->excludedOptions = $excludedOptions;
77
    }
78
79
    /**
80
     * @param TransformEvent $event
81
     */
82
    public function consumeEvent(TransformEvent $event): void
83
    {
84
        $documentProductOption = $event->getObject();
85
86
        if (!$documentProductOption instanceof ProductOptionInterface
87
            || in_array($documentProductOption->getCode(), $this->excludedOptions)
88
        ) {
89
            return;
90
        }
91
92
        $document = $event->getDocument();
93
        $optionValues = $this->productOptionValueRepository->findAll();
94
        $taxons = [];
95
96
        /** @var ProductOptionValueInterface $optionValue */
97
        foreach ($optionValues as $optionValue) {
98
            $option = $optionValue->getOption();
99
            if ($documentProductOption === $option) {
100
                /** @var ProductInterface $product */
101
                $product = $this->productVariantRepository->findOneByOptionValue($optionValue)->getProduct();
102
                $taxons = $this->productTaxonsMapper->mapToUniqueCodes($product);
103
            }
104
        }
105
106
        $document->set($this->taxonsProperty, $taxons);
107
    }
108
}
109