WIP: member property validation closes #49 #71

Closed
moritz wants to merge 3 commits from validation into main
5 changed files with 62 additions and 4 deletions
Showing only changes of commit 156cdb24d0 - Show all commits

View file

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

View file

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

View file

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