refactor: email sync changes

This commit is contained in:
Moritz 2025-10-17 16:01:48 +02:00
parent 2693f67d33
commit 001fca1d16
Signed by: moritz
GPG key ID: 1020A035E5DD0824
7 changed files with 108 additions and 121 deletions

View file

@ -93,8 +93,11 @@ defmodule Mv.Accounts.User do
# complex checks that are not supported in atomic operations.
require_atomic? false
# Sync email changes to linked member
change Mv.Accounts.User.Changes.SyncEmailToMember
# Sync email changes to linked member (User → Member)
# Only runs when email is being changed
change Mv.EmailSync.Changes.SyncUserEmailToMember do
where [changing(:email)]
end
end
create :create_user do
@ -118,8 +121,8 @@ defmodule Mv.Accounts.User do
on_missing: :ignore
)
# Override member email with user email when linking
change Mv.Accounts.User.Changes.OverrideMemberEmailOnLink
# Sync user email to member when linking (User → Member)
change Mv.EmailSync.Changes.SyncUserEmailToMember
end
update :update_user do
@ -147,10 +150,11 @@ defmodule Mv.Accounts.User do
on_missing: :unrelate
)
# Sync email changes to linked member
change Mv.Accounts.User.Changes.SyncEmailToMember
# Override member email with user email when linking
change Mv.Accounts.User.Changes.OverrideMemberEmailOnLink
# Sync email changes and handle linking (User → Member)
# Runs when email OR member relationship changes
change Mv.EmailSync.Changes.SyncUserEmailToMember do
where any([changing(:email), changing(:member)])
end
end
# Admin action for direct password changes in admin panel
@ -200,8 +204,8 @@ defmodule Mv.Accounts.User do
|> Ash.Changeset.change_attribute(:oidc_id, user_info["sub"] || user_info["id"])
end
# Override member email with user email when linking (if member relationship exists)
change Mv.Accounts.User.Changes.OverrideMemberEmailOnLink
# Sync user email to member when linking (User → Member)
change Mv.EmailSync.Changes.SyncUserEmailToMember
end
end
@ -281,9 +285,8 @@ defmodule Mv.Accounts.User do
# User.email is the source of truth - when a link is established, member.email
# is overridden to match user.email. Subsequent changes to either email will
# sync to the other resource.
# See: Mv.Accounts.User.Changes.SyncEmailToMember
# Mv.Accounts.User.Changes.OverrideMemberEmailOnLink
# Mv.Membership.Member.Changes.SyncEmailToUser
# See: Mv.EmailSync.Changes.SyncUserEmailToMember
# Mv.EmailSync.Changes.SyncMemberEmailToUser
attribute :email, :ci_string do
allow_nil? false
public? true