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