WIP: member property validation closes #49 #71
5 changed files with 62 additions and 4 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
27
lib/membership/validate_property.ex
Normal file
27
lib/membership/validate_property.ex
Normal 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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue