diff($today)->days < 0) { return 0.0; } /** * 1 - Redis * 2 - DB * 3 - Fetch from web */ try { $ufs = $this->getRedisUFs(); if (!isset($ufs[$date->format('Y-m-d')])) { throw new EmptyRedis($this->redisKey); } return $ufs[$date->format('Y-m-d')]; } catch (EmptyRedis) { try { $model = $this->ufRepository->fetchByFecha($date); return $model->valor; } catch (EmptyResult) { $uf = $this->moneyService->getUF($date); if ($uf === 0.0) { return 0.0; } $this->saveUF($date, $uf); } } return $uf; } public function updateMany(array $dates): array { $ufs = []; try { $ufs = json_decode($this->redisService->get($this->redisKey), JSON_OBJECT_AS_ARRAY); } catch (EmptyRedis) {} $updated = []; foreach ($dates as $date) { if (!isset($ufs[$date->format('Y-m-d')]) or $ufs[$date->format('Y-m-d')] === 0) { $uf = $this->moneyService->getUF($date); if ($uf === 0.0) { continue; } $this->saveUF($date, $uf); $updated[$date->format('Y-m-d')] = $uf; $ufs[$date->format('Y-m-d')] = $this->moneyService->getUF($date); } } ksort($ufs); $this->redisService->set($this->redisKey, json_encode($ufs), 60 * 60 * 24 * 30); return $updated; } public function transform(DateTimeInterface $date, float $input, string $from = 'uf'): float { $uf = $this->get($date); return $input * (($from === 'uf') ? $uf : 1/$uf); } protected array $redisUFs; public function getRedisUFs(): array { if (!isset($this->redisUFs)) { try { $this->redisUFs = json_decode($this->redisService->get($this->redisKey), JSON_OBJECT_AS_ARRAY); } catch (EmptyRedis) { $this->redisUFs = []; } } return $this->redisUFs; } protected function saveUF(DateTimeInterface $date, float $value): void { $this->saveUFinRedis($date, $value); $this->saveUFinDB($date, $value); } protected function saveUFinRedis(DateTimeInterface $date, float $value): void { $ufs = $this->redisUFs; $ufs[$date->format('Y-m-d')] = $value; if (count($ufs) > 1) { ksort($ufs); } $this->redisUFs = $ufs; $this->redisService->set($this->redisKey, json_encode($ufs), 60 * 60 * 24 * 30); } protected function saveUFinDB(DateTimeInterface $date, float $value): void { try { $this->ufRepository->fetchByFecha($date); } catch (EmptyResult) { try { $model = $this->ufRepository->create(['fecha' => $date->format('Y-m-d'), 'valor' => $value]); $this->ufRepository->save($model); } catch (PDOException) {} } } }