71 lines
2 KiB
Elixir
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
|