32 lines
988 B
Elixir
32 lines
988 B
Elixir
defmodule Mv.Membership.Member.Changes.SyncEmailToUser do
|
|
@moduledoc """
|
|
Synchronizes member email changes to the linked user.
|
|
Uses `around_transaction` for atomicity - both updates in the same transaction.
|
|
"""
|
|
use Ash.Resource.Change
|
|
alias Mv.EmailSync.{Helpers, Loader}
|
|
|
|
@impl true
|
|
def change(changeset, _opts, context) do
|
|
cond do
|
|
Map.get(context, :syncing_email, false) -> changeset
|
|
not Ash.Changeset.changing_attribute?(changeset, :email) -> changeset
|
|
true -> sync_email(changeset)
|
|
end
|
|
end
|
|
|
|
defp sync_email(changeset) do
|
|
new_email = Ash.Changeset.get_attribute(changeset, :email)
|
|
|
|
Ash.Changeset.around_transaction(changeset, fn cs, callback ->
|
|
result = callback.(cs)
|
|
|
|
with {:ok, member} <- Helpers.extract_record(result),
|
|
linked_user <- Loader.get_linked_user(member) do
|
|
Helpers.sync_email_to_linked_record(result, linked_user, new_email)
|
|
else
|
|
_ -> result
|
|
end
|
|
end)
|
|
end
|
|
end
|