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 Blossom.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: %{
"roles_assignments" => :roles_assignments,
"users" => {:roles_assignments, [:users]}
}
@realms Utils.option_or_mod_replace(
@caller,
unquote(opts),
:realms,
Realms,
2
)
@roles_assignments Utils.option_or_mod_replace(
@caller,
unquote(opts),
:roles_assignments,
RolesAssignments,
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(:roles_assignments, @roles_assignments, foreign_key: :cask)
timestamps()
end
def check_constraints(changeset) do
changeset
|> Changeset.foreign_key_constraint(:realm)
|> Changeset.unique_constraint(:slug,
name: :casks_realm_slug_index
)
end
filter_list("allowed_ids", [c], c, column: id)
filter_list("id", [c], c)
filter_boolean("autojoin", [c], c)
filter_boolean("enabled", [c], c)
filter_value("name", [c], c)
filter_value("realm", [c], c)
filter_value("slug", [c], c)
def filter_by_params(query, params) do
query
|> filter_by_id(params)
|> filter_by_allowed_ids(params)
|> filter_by_autojoin(params)
|> filter_by_enabled(params)
|> filter_by_name(params)
|> filter_by_realm(params)
|> filter_by_slug(params)
end
def join_assignments(query) do
join(query, :left, [c], ra in @roles_assignments,
as: :ra,
on: ra.cask == c.id
)
end
def join_users(query) do
join(query, :left, [c, 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 == :roles_assignments ->
@caller.join_assignments(query)
embed == {:roles_assignments, [:users]} ->
query
|> @caller.join_assignments()
|> @caller.join_users()
true ->
query
end
end)
end
end
end
end