Current section

Files

Jump to
blossom lib blossom schemas casks.ex
Raw

lib/blossom/schemas/casks.ex

defmodule Blossom.Schemas.Casks do
alias Ecto.Changeset
alias KilnCore.Utils
defmacro __using__(opts \\ []) do
quote do
use KilnCore.Schema,
repo: unquote(opts)[:repo],
actions: unquote(opts)[:actions],
private_fields: [:inserted_at, :updated_at],
required_fields: [:name, :realm, :slug],
writable_fields: [
:autojoin,
:autojoin_role,
:id,
:enabled,
:name,
:realm,
:slug
],
reduceable_embeds: %{
"casks_roles" => :casks_roles,
"users" => {:casks_roles, [:users]}
}
import Djinn
@casks_roles Utils.option_or_mod_replace(
@caller,
unquote(opts),
:casks_roles,
CasksRoles,
2
)
@realms Utils.option_or_mod_replace(
@caller,
unquote(opts),
:realms,
Realms,
2
)
@users Utils.option_or_mod_replace(
@caller,
unquote(opts),
:users,
Users,
2
)
schema "casks" do
field(:autojoin, :boolean, default: false)
field(:autojoin_role, :string)
field(:enabled, :boolean, default: false)
field(:name, :string)
field(:slug, :string)
belongs_to(:realms, @realms, foreign_key: :realm)
has_many(:casks_roles, @casks_roles, foreign_key: :cask)
timestamps()
end
def check_constraints(changeset) do
Changeset.unique_constraint(changeset, :slug,
name: :casks_realm_slug_index
)
end
filter_list("id", [o], o)
filter_boolean("autojoin", [o], o)
filter_boolean("enabled", [o], o)
filter_value("name", [o], o)
filter_value("realm", [o], o)
filter_value("slug", [o], o)
def filter_by_params(query, params) do
query
|> filter_by_id(params)
|> filter_by_autojoin(params)
|> filter_by_enabled(params)
|> filter_by_name(params)
|> filter_by_realm(params)
|> filter_by_slug(params)
end
def join_roles(query) do
join(query, :left, [o], cr in @casks_roles,
as: :cr,
on: cr.cask == o.id
)
end
def join_users(query) do
join(query, :left, [o, r: r], u in @users,
as: :u,
on: r.user == u.id
)
end
def prepare_query(_params, embeds) do
Enum.reduce(embeds, @caller, fn embed, query ->
cond do
embed == :casks_roles ->
@caller.join_roles(query)
embed == {:casks_roles, [:users]} ->
query
|> @caller.join_roles()
|> @caller.join_users()
true ->
query
end
end)
end
end
end
end