Configurable member field "required" flag and Vereinfacht-required fields closes #440 #441
1 changed files with 30 additions and 22 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue