From 7f034740b07b603e64faaac6063581675827e233 Mon Sep 17 00:00:00 2001 From: carla Date: Fri, 20 Jun 2025 08:21:10 +0200 Subject: [PATCH] review: removed leftovers and ash use builtin validation functions --- Justfile | 2 +- lib/membership/member.ex | 77 +++++++++------------------------------- 2 files changed, 18 insertions(+), 61 deletions(-) diff --git a/Justfile b/Justfile index 4480991..d82bae4 100644 --- a/Justfile +++ b/Justfile @@ -9,7 +9,7 @@ migrate-database: reset-database: mix ash.reset - MIX_ENV=test mix ash.setup + MIX_ENV=test mix ash.reset seed-database: mix run priv/repo/seeds.exs diff --git a/lib/membership/member.ex b/lib/membership/member.ex index 54cc546..ec2b16f 100644 --- a/lib/membership/member.ex +++ b/lib/membership/member.ex @@ -9,7 +9,7 @@ defmodule Mv.Membership.Member do end actions do - defaults [:read] + defaults [:read, :destroy] create :create_member do primary? true @@ -34,11 +34,6 @@ defmodule Mv.Membership.Member do change manage_relationship(:properties, type: :create) end - destroy :destroy do - primary? true - change Ash.Resource.Change.Builtins.cascade_destroy(:properties) - end - update :update_member do primary? true require_atomic? false @@ -73,71 +68,33 @@ defmodule Mv.Membership.Member do validate present(:email) # Birth date not in the future - validate fn changeset, _ -> - birth_date = Ash.Changeset.get_attribute(changeset, :birth_date) - - if birth_date && Date.compare(birth_date, Date.utc_today()) == :gt do - {:error, field: :birth_date, message: "cannot be in the future"} - else - :ok - end - end + validate compare(:birth_date, less_than_or_equal_to: &Date.utc_today/0), + where: [present(:birth_date)], + message: "cannot be in the future" # Join date not in the future - validate fn changeset, _ -> - join_date = Ash.Changeset.get_attribute(changeset, :join_date) + validate compare(:join_date, less_than_or_equal_to: &Date.utc_today/0), + where: [present(:join_date)], + message: "cannot be in the future" - if join_date && Date.compare(join_date, Date.utc_today()) == :gt do - {:error, field: :join_date, message: "cannot be in the future"} - else - :ok - end - end # Exit date not before join date - validate fn changeset, _ -> - join_date = Ash.Changeset.get_attribute(changeset, :join_date) - exit_date = Ash.Changeset.get_attribute(changeset, :exit_date) + validate compare(:exit_date, greater_than: :join_date), + where: [present([:join_date, :exit_date])], + message: "cannot be before join date" - if join_date && exit_date && Date.compare(exit_date, join_date) == :lt do - {:error, field: :exit_date, message: "cannot be before join date"} - else - :ok - end - end # Phone number format (only if set) - validate fn changeset, _ -> - phone = Ash.Changeset.get_attribute(changeset, :phone_number) + validate match(:phone_number, ~r/^\+?[0-9\- ]{6,20}$/), + where: [present(:phone_number)], + message: "is not a valid phone number" - if phone && !Regex.match?(~r/^\+?[0-9\- ]{6,20}$/, phone) do - {:error, field: :phone_number, message: "is not a valid phone number"} - else - :ok - end - end # Postal code format (only if set) - validate fn changeset, _ -> - postal_code = Ash.Changeset.get_attribute(changeset, :postal_code) + validate match(:postal_code, ~r/^\d{5}$/), + where: [present(:postal_code)], + message: "must consist of 5 digits" - if postal_code && !Regex.match?(~r/^\d{5}$/, postal_code) do - {:error, field: :postal_code, message: "must consist of 5 digits"} - else - :ok - end - end - - # paid must be boolean if set - validate fn changeset, _ -> - paid = Ash.Changeset.get_attribute(changeset, :paid) - - if not is_nil(paid) and not is_boolean(paid) do - {:error, field: :paid, message: "must be true or false"} - else - :ok - end - end # Email validation with EctoCommons.EmailValidator validate fn changeset, _ -> @@ -216,6 +173,6 @@ defmodule Mv.Membership.Member do end relationships do - has_many :properties, Mv.Membership.Property, destination_attribute: :member_id + has_many :properties, Mv.Membership.Property end end