This commit is contained in:
carla 2026-01-20 14:23:27 +01:00 committed by Moritz
parent 092fd99d48
commit 04b0916c1e
Signed by: moritz
GPG key ID: 1020A035E5DD0824
4 changed files with 182 additions and 95 deletions

View file

@ -124,6 +124,45 @@ defmodule Mv.Membership.Import.HeaderMapper do
end)
end
@doc """
Returns a MapSet of normalized member field names.
This is the single source of truth for known member fields.
Used to distinguish between member fields and custom fields.
## Returns
- `MapSet.t(String.t())` - Set of normalized member field names
## Examples
iex> HeaderMapper.known_member_fields()
#MapSet<["email", "firstname", "lastname", "street", "postalcode", "city"]>
"""
@spec known_member_fields() :: MapSet.t(String.t())
def known_member_fields do
cached = Process.get({__MODULE__, :known_member_fields})
if cached do
cached
else
fields =
@member_field_variants_raw
|> Map.keys()
|> Enum.map(fn canonical ->
# Normalize the canonical field name (e.g., :first_name -> "firstname")
canonical
|> Atom.to_string()
|> String.replace("_", "")
|> String.downcase()
end)
|> MapSet.new()
Process.put({__MODULE__, :known_member_fields}, fields)
fields
end
end
@doc """
Normalizes a CSV header string for comparison.

View file

@ -84,17 +84,6 @@ defmodule Mv.Membership.Import.MemberCSV do
@default_chunk_size 200
@default_max_rows 1000
# Known member field names (normalized) for efficient lookup
# These match the canonical fields in HeaderMapper
@known_member_fields [
"email",
"firstname",
"lastname",
"street",
"postalcode",
"city"
]
@doc """
Prepares CSV content for import by parsing, mapping headers, and validating limits.
@ -205,9 +194,9 @@ defmodule Mv.Membership.Import.MemberCSV do
end
# Checks if a normalized header matches a member field
# Uses direct lookup for better performance (avoids calling build_maps/2)
# Uses HeaderMapper.known_member_fields/0 as single source of truth
defp member_field?(normalized) when is_binary(normalized) do
normalized in @known_member_fields
MapSet.member?(HeaderMapper.known_member_fields(), normalized)
end
defp member_field?(_), do: false