refactoring

This commit is contained in:
carla 2026-02-02 13:07:08 +01:00
parent 86a3c4e50e
commit 12715f3d85

View file

@ -524,6 +524,26 @@ defmodule Mv.Membership.Import.MemberCSV do
{:error, %Error{csv_line_number: line_number, field: nil, message: first_error}}
{:ok, custom_field_values} ->
create_member_with_custom_fields(
trimmed_member_attrs,
custom_field_values,
line_number,
actor
)
end
end
rescue
e ->
{:error, %Error{csv_line_number: line_number, field: nil, message: Exception.message(e)}}
end
# Creates a member with custom field values, handling errors appropriately
defp create_member_with_custom_fields(
trimmed_member_attrs,
custom_field_values,
line_number,
actor
) do
# Create member with custom field values
member_attrs_with_cf =
trimmed_member_attrs
@ -547,15 +567,9 @@ defmodule Mv.Membership.Import.MemberCSV do
{:error, format_ash_error(error, line_number, email)}
{:error, error} ->
{:error,
%Error{csv_line_number: line_number, field: nil, message: inspect(error)}}
{:error, %Error{csv_line_number: line_number, field: nil, message: inspect(error)}}
end
end
end
rescue
e ->
{:error, %Error{csv_line_number: line_number, field: nil, message: Exception.message(e)}}
end
# Prepares custom field values from row map for Ash
# Returns {:ok, [custom_field_value_maps]} or {:error, [validation_errors]}
@ -564,6 +578,32 @@ defmodule Mv.Membership.Import.MemberCSV do
custom_attrs
|> Enum.filter(fn {_id, value} -> value != nil && value != "" end)
|> Enum.reduce({[], []}, fn {custom_field_id_str, value}, {acc_values, acc_errors} ->
process_single_custom_field(
custom_field_id_str,
value,
custom_field_lookup,
acc_values,
acc_errors
)
end)
if Enum.empty?(errors) do
{:ok, Enum.reverse(values)}
else
{:error, Enum.reverse(errors)}
end
end
defp prepare_custom_field_values(_, _), do: {:ok, []}
# Processes a single custom field value and returns updated accumulator
defp process_single_custom_field(
custom_field_id_str,
value,
custom_field_lookup,
acc_values,
acc_errors
) do
case Map.get(custom_field_lookup, custom_field_id_str) do
nil ->
# Custom field not found, skip
@ -583,16 +623,7 @@ defmodule Mv.Membership.Import.MemberCSV do
{acc_values, [reason | acc_errors]}
end
end
end)
if Enum.empty?(errors) do
{:ok, Enum.reverse(values)}
else
{:error, Enum.reverse(errors)}
end
end
defp prepare_custom_field_values(_, _), do: {:ok, []}
# Formats a custom field value according to its type
# Uses _union_type and _union_value format as expected by Ash
@ -620,24 +651,12 @@ defmodule Mv.Membership.Import.MemberCSV do
defp format_custom_field_value(value, :boolean, custom_field_name) when is_binary(value) do
trimmed = String.trim(value)
lower = String.downcase(trimmed)
bool_value =
case lower do
"true" -> true
"1" -> true
"yes" -> true
"ja" -> true
"false" -> false
"0" -> false
"no" -> false
"nein" -> false
_ -> nil
end
if bool_value != nil do
case parse_boolean_value(trimmed) do
{:ok, bool_value} ->
{:ok, %{"_union_type" => "boolean", "_union_value" => bool_value}}
else
:error ->
{:error,
format_custom_field_error_with_details(
custom_field_name,
@ -690,6 +709,23 @@ defmodule Mv.Membership.Import.MemberCSV do
{:ok, %{"_union_type" => "string", "_union_value" => String.trim(value)}}
end
# Parses a boolean value from a string, supporting multiple formats
defp parse_boolean_value(value) when is_binary(value) do
lower = String.downcase(value)
parse_boolean_value_lower(lower)
end
# Helper function with pattern matching for boolean values
defp parse_boolean_value_lower("true"), do: {:ok, true}
defp parse_boolean_value_lower("1"), do: {:ok, true}
defp parse_boolean_value_lower("yes"), do: {:ok, true}
defp parse_boolean_value_lower("ja"), do: {:ok, true}
defp parse_boolean_value_lower("false"), do: {:ok, false}
defp parse_boolean_value_lower("0"), do: {:ok, false}
defp parse_boolean_value_lower("no"), do: {:ok, false}
defp parse_boolean_value_lower("nein"), do: {:ok, false}
defp parse_boolean_value_lower(_), do: :error
# Generates a consistent error message for custom field validation failures
# Uses human-readable field type labels (e.g., "Number" instead of "integer")
defp format_custom_field_error(custom_field_name, value_type, value) do