Current section
Files
Jump to
Current section
Files
lib/repository.ex
defmodule UltraPlug.Repository do
@moduledoc """
Accesses the configured repo.
TODO: Document configuration
TODO: Document options
"""
import Plug.Conn
@repo Application.get_env(:ultra_plug, :repo)
def init(opts) do
{to, [{action, from}]} = Keyword.pop(opts, :to)
to = cond do
!to and action == :all -> detect_to(from, true)
!to -> detect_to(from)
true -> to
end
{action, from, to}
end
defp detect_to(from, plural? \\ false) do
schema? = Kernel.function_exported?(from, :__schema__, 1)
cond do
schema? and plural? -> detect_plural(from)
schema? -> detect_singular(from)
true -> from
end
end
defp detect_plural(from) do
from.__schema__(:source)
|> String.to_atom
end
defp detect_singular(from) do
from.__schema__(:source)
|> String.replace_suffix("s", "")
|> String.to_atom
end
def call(conn, opts \\ [])
def call(conn = %{assigns: %{error: _}}, _) do
conn
end
def call(conn, {:all, from, to}) do
result = apply(@repo, :all, [from])
assign(conn, to, result)
end
def call(conn, {:delete!, from, to}) do
result = apply(@repo, :delete!, [conn.assigns[from]])
assign(conn, to, result)
end
def call(conn, {:get!, from, to}) do
id = String.trim(conn.params["id"])
result = apply(@repo, :get!, [from, id])
assign(conn, to, result)
end
def call(conn, {:insert, from, to}) do
case apply(@repo, :insert, [conn.assigns[from]]) do
{:error, error} -> assign(conn, :error, error)
{:ok, result} -> assign(conn, to, result)
end
end
def call(conn, {:insert!, from, to}) do
result = apply(@repo, :insert!, [conn.assigns[from]])
assign(conn, to, result)
end
def call(conn, {:update, from, to}) do
case apply(@repo, :update, [conn.assigns[from]]) do
{:error, error} -> assign(conn, :error, error)
{:ok, result} -> assign(conn, to, result)
end
end
def call(conn, opts) when is_list(opts) do
call(conn, init(opts))
end
end