lib/ident/factor/cache.ex

defmodule Rivet.Ident.Factor.Cache do
  use Rivet.Utils.LazyCache

  @persist_for 600_000

  alias Rivet.Ident

  @doc """
  Read-through cache for loading user factors from Ident.
  """
  def get_user_factor(id) do
    case lookup(id) do
      [{_, factor, _}] ->
        {:ok, factor}

      _no_cache ->
        :miss
    end
  end

  def persist(%Ident.Factor{} = factor) do
    insert(factor.id, factor, @persist_for)
    {:ok, factor}
  end

  # used to update cache if user state changes
  def update_user(%Ident.User{state: %{active_factor_id: id}} = user) do
    with {:ok, factor} <- get_user_factor(id) do
      persist(%Ident.Factor{factor | user: user})
    end

    :ok
  end

  def update_user(_), do: :ok
end