Completed
Push — master ( 2af63f...bfd93b )
by Paweł
76:32 queued 64:10
created

UniqueCurrencyPairValidator::validate()   B

Complexity

Conditions 6
Paths 5

Size

Total Lines 18
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 18
rs 8.8571
c 0
b 0
f 0
cc 6
eloc 9
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
namespace Sylius\Bundle\CurrencyBundle\Validator\Constraints;
13
14
use Sylius\Component\Currency\Model\CurrencyInterface;
15
use Sylius\Component\Currency\Model\ExchangeRateInterface;
16
use Sylius\Component\Currency\Repository\ExchangeRateRepositoryInterface;
17
use Symfony\Component\Validator\Constraint;
18
use Symfony\Component\Validator\ConstraintValidator;
19
use Symfony\Component\Validator\Exception\UnexpectedTypeException;
20
21
/**
22
 * @author Jan Góralski <[email protected]>
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
        if (!$value instanceof ExchangeRateInterface) {
45
            throw new UnexpectedTypeException($value, ExchangeRateInterface::class);
46
        }
47
48
        if (null !== $value->getId()) {
49
            return;
50
        }
51
52
        if (null === $value->getSourceCurrency() || null === $value->getTargetCurrency()) {
53
            return;
54
        }
55
56
        if (!$this->isCurrencyPairUnique($value->getSourceCurrency(), $value->getTargetCurrency())) {
57
            $this->context->buildViolation($constraint->message)->addViolation();
58
        }
59
    }
60
61
    /**
62
     * @param CurrencyInterface $baseCurrency
63
     * @param CurrencyInterface $targetCurrency
64
     *
65
     * @return bool
66
     */
67
    private function isCurrencyPairUnique(CurrencyInterface $baseCurrency, CurrencyInterface $targetCurrency)
68
    {
69
        $exchangeRate = $this->exchangeRateRepository->findOneWithCurrencyPair($baseCurrency->getCode(), $targetCurrency->getCode());
70
71
        return null === $exchangeRate;
72
    }
73
}
74