mitgliederverwaltung/lib/accounts/user/member_creation_notifier.ex

71 lines
2 KiB
Elixir

defmodule Mv.Accounts.User.MemberCreationNotifier do
@moduledoc """
Notifier that automatically creates a member for newly registered users.
This runs after user creation/registration and ensures every user has an associated member.
It's designed to work with AshAuthentication without interfering with LiveView integration.
"""
use Ash.Notifier
require Logger
@impl Ash.Notifier
def notify(%Ash.Notifier.Notification{
action: %{name: action_name},
resource: Mv.Accounts.User,
data: user
})
when action_name in [:register_with_password, :register_with_rauthy, :create_user] do
# Only create member if user doesn't already have one
if should_create_member?(user) do
create_member_for_user(user)
end
:ok
end
@impl Ash.Notifier
def notify(_), do: :ok
defp should_create_member?(user) do
# Check if user has a member_id and if that member actually exists
case user.member_id do
nil ->
true
member_id ->
case Ash.get(Mv.Membership.Member, member_id, domain: Mv.Membership) do
{:ok, _member} -> false
{:error, _} -> true
end
end
end
defp create_member_for_user(user) do
member_params = %{
email: to_string(user.email),
first_name: "User",
last_name: "Generated"
}
case Mv.Membership.create_member(member_params) do
{:ok, member} ->
# Update user with member_id
case Ash.Changeset.for_update(user, :update_user, %{member_id: member.id})
|> Ash.update(domain: Mv.Accounts) do
{:ok, _updated_user} ->
Logger.info(
"Successfully created and assigned member #{member.id} to user #{user.id}"
)
{:error, error} ->
Logger.warning(
"Failed to assign member #{member.id} to user #{user.id}: #{inspect(error)}"
)
end
{:error, error} ->
Logger.warning("Failed to create member for user #{user.id}: #{inspect(error)}")
end
end
end