WIP: validate required fields
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
Moritz 2025-06-02 22:41:04 +02:00
parent 967a89b18d
commit 156cdb24d0
Signed by: moritz
GPG key ID: 1020A035E5DD0824
5 changed files with 62 additions and 4 deletions

View file

@ -13,6 +13,9 @@ defmodule Mv.Membership.Email do
max_length: @max_length max_length: @max_length
] ]
@impl true
def cast_input("", _), do: {:ok, nil}
@impl true @impl true
def cast_input(value, _) when is_binary(value) do def cast_input(value, _) when is_binary(value) do
value = String.trim(value) value = String.trim(value)

View file

@ -11,9 +11,9 @@ defmodule Mv.Membership do
end end
resource Mv.Membership.Property do resource Mv.Membership.Property do
define :create_property, action: :create define :create_property, action: :create_property
define :list_property, action: :read define :list_property, action: :read
define :update_property, action: :update define :update_property, action: :update_property
define :destroy_property, action: :destroy define :destroy_property, action: :destroy
end end

View file

@ -9,14 +9,28 @@ defmodule Mv.Membership.Property do
end end
actions do actions do
defaults [:create, :read, :update, :destroy] defaults [:read, :destroy]
default_accept [:value, :member_id, :property_type_id] default_accept [:value, :member_id, :property_type_id]
create :create_property do
primary? true
load [:property_type]
end end
update :update_property do
primary? true
require_atomic? false
load [:property_type]
end
end
attributes do attributes do
uuid_primary_key :id uuid_primary_key :id
attribute :value, :union, attribute :value, :union,
allow_nil?: true,
constraints: [ constraints: [
storage: :type_and_value, storage: :type_and_value,
types: [ types: [
@ -39,4 +53,15 @@ defmodule Mv.Membership.Property do
calculations do calculations do
calculate :value_to_string, :string, expr(value[:value] <> "") calculate :value_to_string, :string, expr(value[:value] <> "")
end end
aggregates do
first :property_type_required,
:property_type,
:required
end
validations do
validate {Mv.Membership.Validations.ValidateProperty, attribute: :value}
end
end end

View file

@ -0,0 +1,27 @@
defmodule Mv.Membership.Validations.ValidateProperty do
use Ash.Resource.Validation
@impl true
def init(opts) do
if is_atom(opts[:value]) do
{:ok, opts}
else
{:error, "attribute must be an atom!"}
end
end
@impl true
def validate(changeset, _opts, _context) do
changeset = Ash.Changeset.load(changeset, [:property_type])
property_type = changeset.data.property_type
IO.inspect(property_type)
required? = property_type.required
union_value = Ash.Changeset.get_attribute(changeset, :value)
if required? and union_value in [nil, ""] do
{:error, field: :value, message: "is required"}
else
:ok
end
end
end

View file

@ -72,7 +72,10 @@ defmodule MvWeb.MemberLive.FormComponent do
@impl true @impl true
def handle_event("validate", %{"member" => member_params}, socket) do def handle_event("validate", %{"member" => member_params}, socket) do
{:noreply, assign(socket, form: AshPhoenix.Form.validate(socket.assigns.form, member_params))} #IO.inspect(socket.assigns.form, label: "BEFORE_VALIDATION!!!")
form = AshPhoenix.Form.validate(socket.assigns.form, member_params)
#IO.inspect(form, label: "AFTER_VALIDATION!!!")
{:noreply, assign(socket, form: form)}
end end
def handle_event("save", %{"member" => member_params}, socket) do def handle_event("save", %{"member" => member_params}, socket) do