Completed
Push — master ( d87b58...45003b )
by Kamil
125:34 queued 104:29
created

UniqueCurrencyPairValidator::validate()   B

Complexity

Conditions 6
Paths 5

Size

Total Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 21
rs 8.9617
c 0
b 0
f 0
cc 6
nc 5
nop 2
1
<?php
2
3
/*
4
 * This file is part of the Sylius package.
5
 *
6
 * (c) Paweł Jędrzejewski
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
declare(strict_types=1);
13
14
namespace Sylius\Bundle\CurrencyBundle\Validator\Constraints;
15
16
use Sylius\Component\Currency\Model\CurrencyInterface;
17
use Sylius\Component\Currency\Model\ExchangeRateInterface;
18
use Sylius\Component\Currency\Repository\ExchangeRateRepositoryInterface;
19
use Symfony\Component\Validator\Constraint;
20
use Symfony\Component\Validator\ConstraintValidator;
21
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
22
use Webmozart\Assert\Assert;
23
24
class UniqueCurrencyPairValidator extends ConstraintValidator
25
{
26
    /**
27
     * @var ExchangeRateRepositoryInterface
28
     */
29
    private $exchangeRateRepository;
30
31
    /**
32
     * @param ExchangeRateRepositoryInterface $exchangeRateRepository
33
     */
34
    public function __construct(ExchangeRateRepositoryInterface $exchangeRateRepository)
35
    {
36
        $this->exchangeRateRepository = $exchangeRateRepository;
37
    }
38
39
    /**
40
     * {@inheritdoc}
41
     */
42
    public function validate($value, Constraint $constraint)
43
    {
44
        /** @var UniqueCurrencyPair $constraint */
45
        Assert::isInstanceOf($constraint, UniqueCurrencyPair::class);
46
47
        if (!$value instanceof ExchangeRateInterface) {
48
            throw new UnexpectedTypeException($value, ExchangeRateInterface::class);
49
        }
50
51
        if (null !== $value->getId()) {
52
            return;
53
        }
54
55
        if (null === $value->getSourceCurrency() || null === $value->getTargetCurrency()) {
56
            return;
57
        }
58
59
        if (!$this->isCurrencyPairUnique($value->getSourceCurrency(), $value->getTargetCurrency())) {
60
            $this->context->buildViolation($constraint->message)->addViolation();
61
        }
62
    }
63
64
    /**
65
     * @param CurrencyInterface $baseCurrency
66
     * @param CurrencyInterface $targetCurrency
67
     *
68
     * @return bool
69
     */
70
    private function isCurrencyPairUnique(CurrencyInterface $baseCurrency, CurrencyInterface $targetCurrency): bool
71
    {
72
        $exchangeRate = $this->exchangeRateRepository->findOneWithCurrencyPair($baseCurrency->getCode(), $targetCurrency->getCode());
73
74
        return null === $exchangeRate;
75
    }
76
}
77