Current section
Files
Jump to
Current section
Files
priv/templates/ecto_schema.eex
defmodule <%= inspect @module %> do
@moduledoc """
Generated by Caravela from <%= inspect @domain_module %>.
Regenerate with `mix caravela.gen.schema <%= inspect @domain_module %>`.
Custom code placed below the `# --- CUSTOM ---` marker is preserved.
"""
use Ecto.Schema
import Ecto.Changeset
@primary_key {:id, :binary_id, autogenerate: true}
@foreign_key_type :binary_id
schema "<%= @table %>" do
<%= for f <- @plain_fields do %> field :<%= f.name %>, <%= inspect Caravela.Types.ecto_type(f.type) %><%= if Keyword.has_key?(f.opts, :default), do: ", default: " <> inspect(Keyword.get(f.opts, :default)) %>
<% end %><%= for r <- @belongs_to do %> belongs_to :<%= r.assoc_name %>, <%= inspect r.target_module %>
<% end %><%= for r <- @has_many do %> has_many :<%= r.assoc_name %>, <%= inspect r.target_module %>
<% end %><%= for r <- @has_one do %> has_one :<%= r.assoc_name %>, <%= inspect r.target_module %>
<% end %>
timestamps(type: :utc_datetime)
end
@required_fields <%= inspect @required_fields %>
@optional_fields <%= inspect @optional_fields %>
@doc false
def changeset(entity, attrs) do
entity
|> cast(attrs, @required_fields ++ @optional_fields)
|> validate_required(@required_fields)
<%= for {line, _} <- @validation_lines do %> |> <%= line %>
<% end %><%= for r <- @belongs_to do %> |> foreign_key_constraint(:<%= r.fk %>)
<% end %> end
# --- CUSTOM :changeset ---
# --- END :changeset ---
<%= if @auth_password? do %>
@doc """
Changeset for self-registration. Same casting rules as `changeset/2`,
plus reading a virtual `password` attr and writing its Argon2 hash.
"""
def registration_changeset(user, attrs) do
user
|> changeset(attrs)
|> unique_constraint(:email)
|> put_hashed_password(attrs)
end
@doc "Changeset used by password reset / explicit password updates."
def password_changeset(user, attrs) do
user
|> cast(attrs, [])
|> put_hashed_password(attrs)
end
defp put_hashed_password(changeset, %{"password" => password})
when is_binary(password) and byte_size(password) > 0,
do: do_put_password(changeset, password)
defp put_hashed_password(changeset, %{password: password})
when is_binary(password) and byte_size(password) > 0,
do: do_put_password(changeset, password)
defp put_hashed_password(changeset, _), do: changeset
defp do_put_password(changeset, password) do
if Code.ensure_loaded?(Argon2) and function_exported?(Argon2, :hash_pwd_salt, 1) do
put_change(changeset, :hashed_password, apply(Argon2, :hash_pwd_salt, [password]))
else
add_error(changeset, :password, "argon2_elixir not available")
end
end
<% end %><%= if @auth_confirm? do %>
@doc false
def confirm_changeset(user, attrs) do
cast(user, attrs, [:confirmed_at])
end
<% end %><%= if @auth_api_token? do %>
@doc false
def api_tokens_changeset(user, attrs) do
cast(user, attrs, [:api_tokens])
end
<% end %>
<%= @custom_marker %>