defmodule Tesla.Middleware.Cache do @moduledoc false @behaviour Tesla.Middleware def call(env, next, ttl: ttl) do env |> get_from_cache(env.method) |> run(next) |> set_to_cache(ttl) end defp get_from_cache(env, :get) do {Cachex.get!(:tesla_cache_cachex, cache_key(env)), env} end defp get_from_cache(env, _), do: {nil, env} defp run({nil, env}, next) do {:ok, env} = Tesla.run(env, next) {:miss, env} end defp run({cached_env, _env}, _next) do {:hit, cached_env} end defp set_to_cache({:miss, %Tesla.Env{status: status} = env}, ttl) when status == 200 do Cachex.set(:tesla_cache_cachex, cache_key(env), env, ttl: ttl) {:ok, env} end defp set_to_cache({:miss, env}, _ttl), do: {:ok, env} defp set_to_cache({:hit, env}, _ttl), do: {:ok, env} defp cache_key(%Tesla.Env{url: url, query: query}), do: Tesla.build_url(url, query) end