WIP feat: member user relation
This commit is contained in:
parent
ba79261d1d
commit
0dddeeb7a6
35 changed files with 1208 additions and 192 deletions
71
lib/accounts/user/member_creation_notifier.ex
Normal file
71
lib/accounts/user/member_creation_notifier.ex
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
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
|
||||
Loading…
Add table
Add a link
Reference in a new issue