Completed
Push — master ( 96560a...777581 )
by Simonas
14s
created

CurrencyRatesService::getRates()   B

Complexity

Conditions 6
Paths 10

Size

Total Lines 30
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 6.0131

Importance

Changes 8
Bugs 0 Features 3
Metric Value
c 8
b 0
f 3
dl 0
loc 30
ccs 13
cts 14
cp 0.9286
rs 8.439
cc 6
eloc 18
nc 10
nop 1
crap 6.0131
1
<?php
2
3
/*
4
 * This file is part of the ONGR package.
5
 *
6
 * (c) NFQ Technologies UAB <[email protected]>
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 ONGR\CurrencyExchangeBundle\Service;
13
14
use Doctrine\Common\Cache\CacheProvider;
15
use ONGR\CurrencyExchangeBundle\Document\CurrencyDocument;
16
use ONGR\CurrencyExchangeBundle\Document\RatesObject;
17
use ONGR\CurrencyExchangeBundle\Driver\CurrencyDriverInterface;
18
use ONGR\CurrencyExchangeBundle\Exception\RatesNotLoadedException;
19
use ONGR\ElasticsearchBundle\Collection\Collection;
20
use ONGR\ElasticsearchBundle\Service\Manager;
21
use Psr\Log\LoggerAwareTrait;
22
23
/**
24
 * This class provides currency rates.
25
 */
26
class CurrencyRatesService
27
{
28
    use LoggerAwareTrait;
29
30
    /**
31
     * @var null|array
32
     */
33
    public $rates = null;
34
35
    /**
36
     * @var CurrencyDriverInterface
37
     */
38
    private $driver;
39
40
    /**
41
     * @var CacheProvider
42
     */
43
    private $cache;
44
45
    /**
46
     * @var Manager
47
     */
48
    private $manager;
49
50
    /**
51
     * @param CurrencyDriverInterface $driver  Currency exchange driver.
52
     * @param Manager                 $manager ES Manager.
53
     * @param CacheProvider           $cache    Cache pool.
54
     */
55
    public function __construct(
56
        CurrencyDriverInterface $driver,
57
        Manager $manager,
58
        CacheProvider $cache
59
    ) {
60 5
        $this->driver = $driver;
61
        $this->manager = $manager;
62
        $this->cache = $cache;
63
    }
64
65 5
    /**
66 5
     * This method returns exchange rates.
67 5
     *
68 5
     * @param string|null $date
69
     *
70
     * @throws RatesNotLoadedException
71
     * @return array
72
     */
73
    public function getRates($date = null)
74
    {
75
        $date = $date ? $date : $this->getCurrentDate();
76 4
77
        if (isset($this->rates[$date])) {
78 4
            return $this->rates[$date];
79 3
        }
80
81
        $rates = $this->cache->fetch($date);
82 4
        if ($rates) {
83 4
            $this->rates[$date] = $rates;
84 4
            return $rates;
85 1
        }
86
87
        $rates = $this->getCurrencyFromEs($date);
88 3
        if ($rates) {
89 3
            $this->rates[$date] = $rates;
90
            return $rates;
91
        }
92
93 3
        $rates = $this->reloadRates($date);
94 3
        if ($rates) {
95 2
            $this->rates[$date] = $rates;
96
            return $rates;
97 1
        }
98
99
        throw new RatesNotLoadedException(
100
            'Currency rates for '.$date.' are not loaded and could not be loaded on demand'
101
        );
102
    }
103
104
    /**
105 3
     * Returns currency rates from ES.
106
     *
107 3
     * @param string|null $date
108 3
     *
109 3
     * @return array
110 3
     */
111 3
    private function getCurrencyFromEs($date = null)
112 3
    {
113 3
        $date = $date ? $date : $this->getCurrentDate();
114
115 3
        $rates = [];
116 3
        #TODO Should be used service instead of getRepository
117 1
        $repository = $this->manager->getRepository('ONGRCurrencyExchangeBundle:CurrencyDocument');
118
        /** @var CurrencyDocument $currency */
119 1
        $currency = $repository->findOneBy(['date' => $date]);
120
121
        if ($currency) {
122 2
            /** @var RatesObject $rate */
123
            foreach ($currency->getRates() as $rate) {
0 ignored issues
show
Bug introduced by
The expression $currency->getRates() of type object<ONGR\CurrencyExch...e\Document\RatesObject> is not traversable.
Loading history...
124
                $rates[$rate->getName()] = $rate->getValue();
125
            }
126
//            $this->logger && $this->logger->info('Rates returned from ES.');
127
            return $rates;
128
        }
129
130
        return null;
131
    }
132 2
133
    /**
134
     * Reloads rates using given driver.
135
     *
136
     * @param string|null $date
137
     *
138
     * @return array|null
139
     */
140 2
    public function reloadRates($date = null)
141
    {
142 2
        $date = $date ? $date : $this->getCurrentDate();
143 2
144
        $rawRates = $this->driver->getRates($date);
145
146
        if ($rawRates) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $rawRates of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
147
            $this->rates[$date] = $rawRates;
148 4
            $this->cache->save($date, $rawRates);
149
150 4
            $repository = $this->manager->getRepository('ONGRCurrencyExchangeBundle:CurrencyDocument');
151
            /** @var CurrencyDocument $currency */
152
            $document = $repository->findOneBy(['date' => $date]);
153
154
            if (!$document) {
155
                $document = new CurrencyDocument();
156
            }
157
158 3
            $rates = [];
159
            foreach ($rawRates as $rate => $value) {
160 3
                $rateObj = new RatesObject();
161 3
                $rateObj->setName($rate);
162
                $rateObj->setValue($value);
163
                $rates[] = $rateObj;
164 3
            }
165 3
166
            $document->setRates(new Collection($rates));
167 3
            $this->manager->persist($document);
168 2
            $this->manager->commit();
169 2
170 2
            return $rawRates;
171 2
        }
172 2
173 2
        return null;
174 2
    }
175 2
176 2
    /**
177 2
     * Returns actual base currency name.
178
     *
179 2
     * @return string
180
     */
181 1
    public function getBaseCurrency()
182
    {
183 1
        return $this->driver->getBaseCurrency();
184
    }
185
186
    /**
187
     * Returns formatted current date
188
     *
189
     * @returns string
190
     */
191 2
    private function getCurrentDate()
192
    {
193 2
        return date('Y-m-d');
194
    }
195
}
196