Current section
Files
Jump to
Current section
Files
lib/infrastructure/api/poke_api.ex
defmodule MaxElixirPokeApi.PokeAPI do
@moduledoc false
@http_client Application.compile_env(:max_elixir_poke_api, :http_client)
@cache Application.compile_env(:max_elixir_poke_api, :cache)
@type id_or_name :: String.t() | integer
@type response :: {:ok, map} | {:error, %{reason: String.t()}}
@url "https://pokeapi.co/api/v2/"
@spec fetch(String.t(), integer, integer) :: response
def fetch(resource, limit, page) do
case @cache.exists?(:max_elixir_cache, resource) do
{:ok, true} ->
{:ok, value} = @cache.get(:max_elixir_cache, resource)
value
{:ok, false} ->
resource
|> make_url(limit, page)
|> get_url
|> save_cache(resource)
end
end
@doc """
Single Resource endpoint pipeline.
"""
@spec fetch(String.t(), id_or_name) :: response
def fetch(resource, id_or_name) do
key = "#{resource}-#{id_or_name}"
case @cache.exists?(:max_elixir_cache, key) do
{:ok, true} ->
{:ok, value} = @cache.get(:max_elixir_cache, key)
value
{:ok, false} ->
resource
|> make_url(id_or_name)
|> get_url
|> save_cache(key)
end
end
defp get_url(url), do: @http_client.get(url)
defp make_url(resource, id_or_name), do: "#{@url}#{resource}/#{to_string(id_or_name)}"
defp make_url(resource, limit, page), do: "#{@url}#{resource}?limit=#{limit}&offset=#{limit * page}"
defp save_cache(resource, key) do
{ _status, data }= @cache.put(:max_elixir_cache, key, resource)
data
end
end