fix: extract member_id from relationship changes during validation (#168)

This commit is contained in:
Moritz 2025-11-20 15:52:30 +01:00
parent 39b285a714
commit 52a62bd679
Signed by: moritz
GPG key ID: 1020A035E5DD0824

View file

@ -41,18 +41,37 @@ defmodule Mv.Accounts.User.Validations.EmailNotUsedByOtherMember do
if should_validate? do if should_validate? do
case Ash.Changeset.fetch_change(changeset, :email) do case Ash.Changeset.fetch_change(changeset, :email) do
{:ok, new_email} -> {:ok, new_email} ->
check_email_uniqueness(new_email, member_id) # Extract member_id from relationship changes for new links
member_id_to_exclude = get_member_id_from_changeset(changeset)
check_email_uniqueness(new_email, member_id_to_exclude)
:error -> :error ->
# No email change, get current email # No email change, get current email
current_email = Ash.Changeset.get_attribute(changeset, :email) current_email = Ash.Changeset.get_attribute(changeset, :email)
check_email_uniqueness(current_email, member_id) # Extract member_id from relationship changes for new links
member_id_to_exclude = get_member_id_from_changeset(changeset)
check_email_uniqueness(current_email, member_id_to_exclude)
end end
else else
:ok :ok
end end
end end
# Extract member_id from changeset, checking relationship changes first
# This is crucial for new links where member_id is in manage_relationship changes
defp get_member_id_from_changeset(changeset) do
# Try to get from relationships (for new links via manage_relationship)
case Map.get(changeset.relationships, :member) do
[{[%{id: id}], _opts}] when not is_nil(id) ->
# Found in relationships - this is a new link
id
_ ->
# Fall back to attribute (for existing links)
Ash.Changeset.get_attribute(changeset, :member_id)
end
end
defp check_email_uniqueness(email, exclude_member_id) do defp check_email_uniqueness(email, exclude_member_id) do
query = query =
Mv.Membership.Member Mv.Membership.Member