Current section

Files

Jump to
soft_bank lib Currency currency_conversion update_worker.ex
Raw

lib/Currency/currency_conversion/update_worker.ex

defmodule SoftBank.Currency.Conversion.UpdateWorker do
@moduledoc false
use GenServer
alias SoftBank.Currency.Conversion.Rates
require Logger
@update_worker SoftBank.Currency.Conversion.UpdateWorker
@doc """
Starts the update worker.
"""
def start_link do
GenServer.start_link(__MODULE__, :ok, [name: @update_worker])
end
@spec init(:ok) :: {:ok, Rates.t} | {:stop, any}
def init(:ok) do
Process.send_after(self(), :refresh, get_refresh_interval())
case refresh() do
{:ok, rates} -> {:ok, rates}
{:error, binary} -> {:stop, {:error, binary}}
end
end
@spec handle_call(:get, any, Rates.t) :: {:reply, Rates.t, Rates.t}
def handle_call(:get, _options, state) do
{:reply, state, state}
end
@spec handle_info(:refresh, Rates.t) :: {:noreply, Rates.t}
def handle_info(:refresh, state) do
Process.send_after(self(), :refresh, get_refresh_interval())
case refresh() do
{:ok, rates} -> {:noreply, rates}
{:error, _} -> {:noreply, state}
end
end
defp refresh do
case get_source().load() do
{:ok, rates} ->
Logger.info "Refreshed currency rates."
Logger.debug inspect(rates)
{:ok, rates}
{:error, error} ->
Logger.error "An error occured while rereshing currency rates. " <> inspect(error)
{:error, error}
end
end
@spec get_source() :: atom
defp get_source, do: Application.get_env(:soft_bank, :source, SoftBank.Currency.Conversion.Source.Fixer)
# Default: One Day
@spec get_refresh_interval() :: integer
defp get_refresh_interval, do: Application.get_env(:soft_bank, :refresh_interval, 1000 * 60 * 60 * 24)
@spec get_rates() :: Rates.t
def get_rates, do: GenServer.call(@update_worker, :get)
end