Packages

Rapid admin generator for Phoenix

Current section

Files

Jump to
lit priv templates phx.gen.context schema_access.ex
Raw

priv/templates/phx.gen.context/schema_access.ex

import Lit.Helpers, only: [sort: 1, paginate: 4]
import Filtrex.Type.Config
alias <%= inspect schema.module %>
@pagination [page_size: 15]
@pagination_distance 5
@doc """
Paginate the list of <%= schema.plural %> using filtrex
filters.
## Examples
iex> list_<%= schema.plural %>(%{})
%{<%= schema.plural %>: [%<%= inspect schema.alias %>{}], ...}
"""
@spec paginate_<%= schema.plural %>(map) :: {:ok, map} | {:error, any}
def paginate_<%= schema.plural %>(params \\ %{}) do
params =
params
|> Map.put_new("sort_direction", "desc")
|> Map.put_new("sort_field", "inserted_at")
{:ok, sort_direction} = Map.fetch(params, "sort_direction")
{:ok, sort_field} = Map.fetch(params, "sort_field")
with {:ok, filter} <- Filtrex.parse_params(filter_config(<%= inspect String.to_atom(schema.plural) %>), params["<%= schema.singular %>"] || %{}),
%Scrivener.Page{} = page <- do_paginate_<%= schema.plural %>(filter, params) do
{:ok,
%{
<%= schema.plural %>: page.entries,
page_number: page.page_number,
page_size: page.page_size,
total_pages: page.total_pages,
total_entries: page.total_entries,
distance: @pagination_distance,
sort_field: sort_field,
sort_direction: sort_direction
}
}
else
{:error, error} -> {:error, error}
error -> {:error, error}
end
end
defp do_paginate_<%= schema.plural %>(filter, params) do
<%= inspect schema.alias %>
|> Filtrex.query(filter)
|> order_by(^sort(params))
|> paginate(Repo, params, @pagination)
end
@doc """
Returns the list of <%= schema.plural %>.
## Examples
iex> list_<%= schema.plural %>()
[%<%= inspect schema.alias %>{}, ...]
"""
def list_<%= schema.plural %> do
Repo.all(<%= inspect schema.alias %>)
end
@doc """
Gets a single <%= schema.singular %>.
Raises `Ecto.NoResultsError` if the <%= schema.human_singular %> does not exist.
## Examples
iex> get_<%= schema.singular %>!(123)
%<%= inspect schema.alias %>{}
iex> get_<%= schema.singular %>!(456)
** (Ecto.NoResultsError)
"""
def get_<%= schema.singular %>!(id), do: Repo.get!(<%= inspect schema.alias %>, id)
@doc """
Creates a <%= schema.singular %>.
## Examples
iex> create_<%= schema.singular %>(%{field: value})
{:ok, %<%= inspect schema.alias %>{}}
iex> create_<%= schema.singular %>(%{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def create_<%= schema.singular %>(attrs \\ %{}) do
%<%= inspect schema.alias %>{}
|> <%= inspect schema.alias %>.changeset(attrs)
|> Repo.insert()
end
@doc """
Updates a <%= schema.singular %>.
## Examples
iex> update_<%= schema.singular %>(<%= schema.singular %>, %{field: new_value})
{:ok, %<%= inspect schema.alias %>{}}
iex> update_<%= schema.singular %>(<%= schema.singular %>, %{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def update_<%= schema.singular %>(%<%= inspect schema.alias %>{} = <%= schema.singular %>, attrs) do
<%= schema.singular %>
|> <%= inspect schema.alias %>.changeset(attrs)
|> Repo.update()
end
@doc """
Deletes a <%= inspect schema.alias %>.
## Examples
iex> delete_<%= schema.singular %>(<%= schema.singular %>)
{:ok, %<%= inspect schema.alias %>{}}
iex> delete_<%= schema.singular %>(<%= schema.singular %>)
{:error, %Ecto.Changeset{}}
"""
def delete_<%= schema.singular %>(%<%= inspect schema.alias %>{} = <%= schema.singular %>) do
Repo.delete(<%= schema.singular %>)
end
@doc """
Returns an `%Ecto.Changeset{}` for tracking <%= schema.singular %> changes.
## Examples
iex> change_<%= schema.singular %>(<%= schema.singular %>)
%Ecto.Changeset{source: %<%= inspect schema.alias %>{}}
"""
def change_<%= schema.singular %>(%<%= inspect schema.alias %>{} = <%= schema.singular %>, attrs \\ %{}) do
<%= inspect schema.alias %>.changeset(<%= schema.singular %>, attrs)
end
defp filter_config(<%= inspect String.to_atom(schema.plural) %>) do
defconfig do
<%= for {name, type} <- schema.attrs do %><%= cond do %>
<% type in [:string, :text] -> %>text <%= inspect name %>
<% type in [:integer, :number] -> %>number <%= inspect name %>
<% type in [:naive_datetime, :utc_datetime, :datetime, :date] -> %>date <%= inspect name %>
<% type in [:boolean] -> %>boolean <%= inspect name %>
<% true -> %> #TODO add config for <%= name %> of type <%= type %>
<% end %><% end %>
end
end