Current section

Files

Jump to
ex_admin_runtime lib ex_admin schema.ex
Raw

lib/ex_admin/schema.ex

defmodule ExAdmin.Schema do
@moduledoc false
def primary_key(%Ecto.Query{from: {_, mod}}) do
primary_key mod
end
def primary_key(module) when is_atom(module) do
case module.__schema__(:primary_key) do
[] -> nil
[key | _] -> key
end
end
def primary_key(resource) do
primary_key resource.__struct__
end
def get_id(resource) do
Map.get(resource, primary_key(resource))
end
def type(%Ecto.Query{from: {_, mod}}, key), do: type(mod, key)
def type(module, key) when is_atom(module) do
module.__schema__(:type, key)
end
def type(resource, key), do: type(resource.__struct__, key)
def get_intersection_keys(resource, assoc_name) do
resource_model = resource.__struct__
%{through: [link1, link2]} = resource_model.__schema__(:association, assoc_name)
intersection_model = resource |> Ecto.build_assoc(link1) |> Map.get(:__struct__)
[
resource_key: resource_model.__schema__(:association, link1).related_key,
assoc_key: intersection_model.__schema__(:association, link2).owner_key
]
end
end