lib/ident/user/cache.ex

defmodule Rivet.Ident.User.Cache do
  @moduledoc """
  Used by websockets token authentication.  Very short term cache to efficiently
  load ~30 websockets all at once for a single dashboard.
  """
  use Rivet.Utils.LazyCache

  @persist_for 30_000

  alias Rivet.Ident

  def get_user(id) do
    case lookup(id) do
      [{_, user, _}] ->
        {:ok, user}

      _no_cache ->
        with {:ok, user} <- Ident.User.one(id: id) do
          Ident.User.Lib.get_authz(user) |> persist
        end
    end
  end

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