Improve CSV import error messages

Include email address in duplicate email error messages.
Add German translation for email uniqueness errors.
Ensure locale is set for translations in async tasks.
This commit is contained in:
Moritz 2026-01-25 18:33:28 +01:00
parent 5acb5e304d
commit 1d0ac6d280
4 changed files with 54 additions and 307 deletions

View file

@ -528,7 +528,9 @@ defmodule Mv.Membership.Import.MemberCSV do
{:ok, member}
{:error, %Ash.Error.Invalid{} = error} ->
{:error, format_ash_error(error, line_number)}
# Extract email from final_attrs for better error messages
email = Map.get(final_attrs, :email) || Map.get(trimmed_member_attrs, :email)
{:error, format_ash_error(error, line_number, email)}
{:error, error} ->
{:error, %Error{csv_line_number: line_number, field: nil, message: inspect(error)}}
@ -621,7 +623,7 @@ defmodule Mv.Membership.Import.MemberCSV do
end
# Formats Ash errors into MemberCSV.Error structs
defp format_ash_error(%Ash.Error.Invalid{errors: errors}, line_number) do
defp format_ash_error(%Ash.Error.Invalid{errors: errors}, line_number, email) do
# Try to find email-related errors first (for better error messages)
email_error =
Enum.find(errors, fn error ->
@ -636,35 +638,37 @@ defmodule Mv.Membership.Import.MemberCSV do
%Error{
csv_line_number: line_number,
field: field,
message: format_error_message(message, field)
message: format_error_message(message, field, email)
}
%{message: message} ->
%Error{
csv_line_number: line_number,
field: nil,
message: format_error_message(message, nil)
message: format_error_message(message, nil, email)
}
_ ->
%Error{
csv_line_number: line_number,
field: nil,
message: "Validation failed"
message: gettext("Validation failed")
}
end
end
# Formats error messages, handling common cases like email uniqueness
defp format_error_message(message, field) when is_binary(message) do
defp format_error_message(message, field, email) when is_binary(message) do
if email_uniqueness_error?(message, field) do
"email has already been taken"
# Include email in error message for better user feedback
email_str = if email, do: to_string(email), else: gettext("email")
gettext("email %{email} has already been taken", email: email_str)
else
message
end
end
defp format_error_message(message, _field), do: to_string(message)
defp format_error_message(message, _field, _email), do: to_string(message)
# Checks if error message indicates email uniqueness constraint violation
defp email_uniqueness_error?(message, :email) do