lib/ident/role_map/lib.ex

defmodule Rivet.Ident.RoleMap.Lib do
  alias Rivet.Ident
  use Rivet.Ecto.Collection.Context, model: Ident.RoleMap

  # should probably be on Ident.Accesses
  def get_actions(%Ident.Access{role: %{id: role_id}, domain: domain, ref_id: ref_id}),
    do: get_actions(role_id, domain, ref_id)

  def get_actions(role_id, domain, ref_id) when is_integer(role_id) do
    key = [role_id, domain, ref_id]

    case Ident.Role.Cache.lookup(key) do
      [{_role_name, actions, _}] ->
        actions

      _no_cache ->
        actions = map_actions(key)
        Ident.Role.Cache.insert(key, actions, 300_000)
        actions
    end
  end

  def map_actions([role_id, domain, ref_id]) do
    Ident.RoleMap.all!(role_id: role_id)
    |> Enum.map(fn e -> [Ident.RoleMap.preload!(e, [:action]).action.name, domain, ref_id] end)
  end
end