Vereinfacht: update existing contact when found by email
Before saving contact_id to member, sync current data to the existing contact so Vereinfacht stays up to date.
This commit is contained in:
parent
bc2d91f9e7
commit
124857cc9c
1 changed files with 37 additions and 9 deletions
|
|
@ -36,21 +36,49 @@ defmodule Mv.Vereinfacht do
|
|||
|
||||
defp do_sync_member(member) do
|
||||
if present_contact_id?(member.vereinfacht_contact_id) do
|
||||
case Client.update_contact(member.vereinfacht_contact_id, member) do
|
||||
{:ok, _} -> :ok
|
||||
{:error, reason} -> {:error, reason}
|
||||
end
|
||||
sync_existing_contact(member)
|
||||
else
|
||||
case Client.create_contact(member) do
|
||||
{:ok, contact_id} ->
|
||||
save_contact_id(member, contact_id)
|
||||
ensure_contact_then_save(member)
|
||||
end
|
||||
end
|
||||
|
||||
{:error, reason} ->
|
||||
{:error, reason}
|
||||
defp sync_existing_contact(member) do
|
||||
case Client.update_contact(member.vereinfacht_contact_id, member) do
|
||||
{:ok, _} -> :ok
|
||||
{:error, reason} -> {:error, reason}
|
||||
end
|
||||
end
|
||||
|
||||
defp ensure_contact_then_save(member) do
|
||||
case get_or_create_contact_id(member) do
|
||||
{:ok, contact_id} -> save_contact_id(member, contact_id)
|
||||
{:error, _} = err -> err
|
||||
end
|
||||
end
|
||||
|
||||
# Before create: find by email to avoid duplicate contacts (idempotency).
|
||||
# When an existing contact is found, update it with current member data.
|
||||
defp get_or_create_contact_id(member) do
|
||||
email = member |> Map.get(:email) |> to_string() |> String.trim()
|
||||
|
||||
if email == "" do
|
||||
Client.create_contact(member)
|
||||
else
|
||||
case Client.find_contact_by_email(email) do
|
||||
{:ok, existing_id} -> update_existing_contact_and_return_id(existing_id, member)
|
||||
{:error, :not_found} -> Client.create_contact(member)
|
||||
{:error, _} = err -> err
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
defp update_existing_contact_and_return_id(contact_id, member) do
|
||||
case Client.update_contact(contact_id, member) do
|
||||
{:ok, _} -> {:ok, contact_id}
|
||||
{:error, _} = err -> err
|
||||
end
|
||||
end
|
||||
|
||||
defp save_contact_id(member, contact_id) do
|
||||
system_actor = SystemActor.get_system_actor()
|
||||
opts = Helpers.ash_actor_opts(system_actor)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue