diff --git a/lib/membership/member.ex b/lib/membership/member.ex index 114814a..074f7e4 100644 --- a/lib/membership/member.ex +++ b/lib/membership/member.ex @@ -545,40 +545,48 @@ defmodule Mv.Membership.Member do end end - # Validate member fields that are marked as required in settings or by Vereinfacht + # Validate member fields that are marked as required in settings or by Vereinfacht. + # When settings cannot be loaded, we still enforce email + Vereinfacht-required fields. validate fn changeset, _context -> - case Mv.Membership.get_settings() do - {:ok, settings} -> - required_config = settings.member_field_required || %{} - normalized = VisibilityConfig.normalize(required_config) - vereinfacht_required? = Mv.Config.vereinfacht_configured?() + vereinfacht_required? = Mv.Config.vereinfacht_configured?() + + required_fields = + case Mv.Membership.get_settings() do + {:ok, settings} -> + required_config = settings.member_field_required || %{} + normalized = VisibilityConfig.normalize(required_config) - required_fields = Enum.filter(Mv.Constants.member_fields(), fn field -> field == :email || (vereinfacht_required? && Mv.Constants.vereinfacht_required_field?(field)) || Map.get(normalized, field, false) end) - missing = - Enum.filter(required_fields, fn field -> - value = Ash.Changeset.get_attribute(changeset, field) - not member_field_value_present?(field, value) + {:error, reason} -> + Logger.warning( + "Member required-fields validation: could not load settings (#{inspect(reason)}). " <> + "Enforcing only email and Vereinfacht-required fields." + ) + + Enum.filter(Mv.Constants.member_fields(), fn field -> + field == :email || + (vereinfacht_required? && Mv.Constants.vereinfacht_required_field?(field)) end) + end - if Enum.empty?(missing) do - :ok - else - # Return first missing field error (Ash shows one at a time per field) - field = hd(missing) + missing = + Enum.filter(required_fields, fn field -> + value = Ash.Changeset.get_attribute(changeset, field) + not member_field_value_present?(field, value) + end) - {:error, - field: field, message: Gettext.dgettext(MvWeb.Gettext, "default", "can't be blank")} - end + if Enum.empty?(missing) do + :ok + else + field = hd(missing) - {:error, _} -> - # If settings cannot be loaded, skip this validation (e.g. bootstrap) - :ok + {:error, + field: field, message: Gettext.dgettext(MvWeb.Gettext, "default", "can't be blank")} end end end