Member: enforce email + Vereinfacht-required when get_settings fails

Compute vereinfacht_required? outside case; on error log and validate
only base required (email + Vereinfacht fields), not full settings.
This commit is contained in:
Moritz 2026-02-23 22:49:54 +01:00
parent cca2ca4632
commit 0d1b776e78
Signed by: moritz
GPG key ID: 1020A035E5DD0824

View file

@ -545,40 +545,48 @@ defmodule Mv.Membership.Member do
end end
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 -> validate fn changeset, _context ->
case Mv.Membership.get_settings() do vereinfacht_required? = Mv.Config.vereinfacht_configured?()
{:ok, settings} ->
required_config = settings.member_field_required || %{} required_fields =
normalized = VisibilityConfig.normalize(required_config) case Mv.Membership.get_settings() do
vereinfacht_required? = Mv.Config.vereinfacht_configured?() {:ok, settings} ->
required_config = settings.member_field_required || %{}
normalized = VisibilityConfig.normalize(required_config)
required_fields =
Enum.filter(Mv.Constants.member_fields(), fn field -> Enum.filter(Mv.Constants.member_fields(), fn field ->
field == :email || field == :email ||
(vereinfacht_required? && Mv.Constants.vereinfacht_required_field?(field)) || (vereinfacht_required? && Mv.Constants.vereinfacht_required_field?(field)) ||
Map.get(normalized, field, false) Map.get(normalized, field, false)
end) end)
missing = {:error, reason} ->
Enum.filter(required_fields, fn field -> Logger.warning(
value = Ash.Changeset.get_attribute(changeset, field) "Member required-fields validation: could not load settings (#{inspect(reason)}). " <>
not member_field_value_present?(field, value) "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)
end
if Enum.empty?(missing) do missing =
:ok Enum.filter(required_fields, fn field ->
else value = Ash.Changeset.get_attribute(changeset, field)
# Return first missing field error (Ash shows one at a time per field) not member_field_value_present?(field, value)
field = hd(missing) end)
{:error, if Enum.empty?(missing) do
field: field, message: Gettext.dgettext(MvWeb.Gettext, "default", "can't be blank")} :ok
end else
field = hd(missing)
{:error, _} -> {:error,
# If settings cannot be loaded, skip this validation (e.g. bootstrap) field: field, message: Gettext.dgettext(MvWeb.Gettext, "default", "can't be blank")}
:ok
end end
end end
end end