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