refactoring
This commit is contained in:
parent
86a3c4e50e
commit
12715f3d85
1 changed files with 104 additions and 68 deletions
|
|
@ -524,6 +524,26 @@ defmodule Mv.Membership.Import.MemberCSV do
|
||||||
{:error, %Error{csv_line_number: line_number, field: nil, message: first_error}}
|
{:error, %Error{csv_line_number: line_number, field: nil, message: first_error}}
|
||||||
|
|
||||||
{:ok, custom_field_values} ->
|
{: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
|
# Create member with custom field values
|
||||||
member_attrs_with_cf =
|
member_attrs_with_cf =
|
||||||
trimmed_member_attrs
|
trimmed_member_attrs
|
||||||
|
|
@ -547,15 +567,9 @@ defmodule Mv.Membership.Import.MemberCSV do
|
||||||
{:error, format_ash_error(error, line_number, email)}
|
{:error, format_ash_error(error, line_number, email)}
|
||||||
|
|
||||||
{:error, error} ->
|
{:error, error} ->
|
||||||
{:error,
|
{:error, %Error{csv_line_number: line_number, field: nil, message: inspect(error)}}
|
||||||
%Error{csv_line_number: line_number, field: nil, message: inspect(error)}}
|
|
||||||
end
|
end
|
||||||
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
|
# Prepares custom field values from row map for Ash
|
||||||
# Returns {:ok, [custom_field_value_maps]} or {:error, [validation_errors]}
|
# Returns {:ok, [custom_field_value_maps]} or {:error, [validation_errors]}
|
||||||
|
|
@ -564,6 +578,32 @@ defmodule Mv.Membership.Import.MemberCSV do
|
||||||
custom_attrs
|
custom_attrs
|
||||||
|> Enum.filter(fn {_id, value} -> value != nil && value != "" end)
|
|> Enum.filter(fn {_id, value} -> value != nil && value != "" end)
|
||||||
|> Enum.reduce({[], []}, fn {custom_field_id_str, value}, {acc_values, acc_errors} ->
|
|> 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
|
case Map.get(custom_field_lookup, custom_field_id_str) do
|
||||||
nil ->
|
nil ->
|
||||||
# Custom field not found, skip
|
# Custom field not found, skip
|
||||||
|
|
@ -583,16 +623,7 @@ defmodule Mv.Membership.Import.MemberCSV do
|
||||||
{acc_values, [reason | acc_errors]}
|
{acc_values, [reason | acc_errors]}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end)
|
|
||||||
|
|
||||||
if Enum.empty?(errors) do
|
|
||||||
{:ok, Enum.reverse(values)}
|
|
||||||
else
|
|
||||||
{:error, Enum.reverse(errors)}
|
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
defp prepare_custom_field_values(_, _), do: {:ok, []}
|
|
||||||
|
|
||||||
# Formats a custom field value according to its type
|
# Formats a custom field value according to its type
|
||||||
# Uses _union_type and _union_value format as expected by Ash
|
# 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
|
defp format_custom_field_value(value, :boolean, custom_field_name) when is_binary(value) do
|
||||||
trimmed = String.trim(value)
|
trimmed = String.trim(value)
|
||||||
lower = String.downcase(trimmed)
|
|
||||||
|
|
||||||
bool_value =
|
case parse_boolean_value(trimmed) do
|
||||||
case lower do
|
{:ok, bool_value} ->
|
||||||
"true" -> true
|
|
||||||
"1" -> true
|
|
||||||
"yes" -> true
|
|
||||||
"ja" -> true
|
|
||||||
"false" -> false
|
|
||||||
"0" -> false
|
|
||||||
"no" -> false
|
|
||||||
"nein" -> false
|
|
||||||
_ -> nil
|
|
||||||
end
|
|
||||||
|
|
||||||
if bool_value != nil do
|
|
||||||
{:ok, %{"_union_type" => "boolean", "_union_value" => bool_value}}
|
{:ok, %{"_union_type" => "boolean", "_union_value" => bool_value}}
|
||||||
else
|
|
||||||
|
:error ->
|
||||||
{:error,
|
{:error,
|
||||||
format_custom_field_error_with_details(
|
format_custom_field_error_with_details(
|
||||||
custom_field_name,
|
custom_field_name,
|
||||||
|
|
@ -690,6 +709,23 @@ defmodule Mv.Membership.Import.MemberCSV do
|
||||||
{:ok, %{"_union_type" => "string", "_union_value" => String.trim(value)}}
|
{:ok, %{"_union_type" => "string", "_union_value" => String.trim(value)}}
|
||||||
end
|
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
|
# Generates a consistent error message for custom field validation failures
|
||||||
# Uses human-readable field type labels (e.g., "Number" instead of "integer")
|
# Uses human-readable field type labels (e.g., "Number" instead of "integer")
|
||||||
defp format_custom_field_error(custom_field_name, value_type, value) do
|
defp format_custom_field_error(custom_field_name, value_type, value) do
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue