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