Packages

phoenix_kit

1.7.44
1.7.208 1.7.207 1.7.206 1.7.205 1.7.204 1.7.203 1.7.202 1.7.201 1.7.200 1.7.199 1.7.198 1.7.197 1.7.196 1.7.194 1.7.193 1.7.192 1.7.191 1.7.190 1.7.189 1.7.187 1.7.186 1.7.185 1.7.184 1.7.183 1.7.182 1.7.181 1.7.180 1.7.179 1.7.178 1.7.177 1.7.176 1.7.175 1.7.174 1.7.173 1.7.172 1.7.171 1.7.170 1.7.169 1.7.168 1.7.167 1.7.166 1.7.165 1.7.164 1.7.162 1.7.161 1.7.160 1.7.159 1.7.157 1.7.156 1.7.155 1.7.154 1.7.153 1.7.152 1.7.151 1.7.150 1.7.149 1.7.146 1.7.145 1.7.144 1.7.143 1.7.138 1.7.133 1.7.132 1.7.131 1.7.130 1.7.128 1.7.126 1.7.125 1.7.121 1.7.120 1.7.119 1.7.118 1.7.117 1.7.116 1.7.115 1.7.114 1.7.113 1.7.112 1.7.111 1.7.110 1.7.109 1.7.108 1.7.107 1.7.106 1.7.105 1.7.104 1.7.103 1.7.102 1.7.101 1.7.100 1.7.99 1.7.98 1.7.97 1.7.96 1.7.95 1.7.94 1.7.93 1.7.92 1.7.91 1.7.90 1.7.89 1.7.88 1.7.87 1.7.86 1.7.85 1.7.84 1.7.83 1.7.82 1.7.81 1.7.80 1.7.79 1.7.78 1.7.77 1.7.76 1.7.75 1.7.74 1.7.71 1.7.70 1.7.69 1.7.66 1.7.65 1.7.64 1.7.63 1.7.62 1.7.61 1.7.59 1.7.58 1.7.57 1.7.56 1.7.55 1.7.54 1.7.53 1.7.52 1.7.51 1.7.49 1.7.44 1.7.43 1.7.42 1.7.41 1.7.39 1.7.38 1.7.37 1.7.36 1.7.34 1.7.33 1.7.31 1.7.30 1.7.29 1.7.28 1.7.27 1.7.26 1.7.25 1.7.24 1.7.23 1.7.22 1.7.21 1.7.20 1.7.19 1.7.18 1.7.17 1.7.16 1.7.15 1.7.14 1.7.13 1.7.12 1.7.11 1.7.10 1.7.9 1.7.8 1.7.7 1.7.6 1.7.5 1.7.4 1.7.3 1.7.2 1.7.1 1.7.0 1.6.20 1.6.19 1.6.18 1.6.17 1.6.16 1.6.15 1.6.14 1.6.13 1.6.12 1.6.11 1.6.10 1.6.9 1.6.8 1.6.7 1.6.6 1.6.5 1.6.4 1.6.3 1.5.2 1.5.1 1.5.0 1.4.9 1.4.8 1.4.7 1.4.6 1.4.5 1.4.4 1.4.3 1.4.2 1.4.1 1.4.0 1.3.2 1.3.1 1.3.0 1.2.10 1.2.9 1.2.8 1.2.7 1.2.5 1.2.4 1.2.2 1.2.1 1.2.0 1.1.0 1.0.0

A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more

Current section

Files

Jump to
phoenix_kit lib phoenix_kit users scope_notifier.ex
Raw

lib/phoenix_kit/users/scope_notifier.ex

defmodule PhoenixKit.Users.ScopeNotifier do
@moduledoc """
Handles PubSub notifications for user scope refreshes.
When a user's roles change, we broadcast a message on a user-specific topic
so any connected LiveViews can refresh their cached authentication scope
without requiring a full reconnect.
"""
alias PhoenixKit.PubSub.Manager
alias PhoenixKit.Users.Auth
alias PhoenixKit.Users.Auth.User
@topic_prefix "phoenix_kit:user_scope:"
@doc """
Broadcasts a scope refresh notification for the given user.
"""
@spec broadcast_roles_updated(User.t() | integer() | binary() | nil) :: :ok
def broadcast_roles_updated(nil), do: :ok
def broadcast_roles_updated(%User{id: user_id}) do
broadcast_roles_updated(user_id)
end
def broadcast_roles_updated(user_id) when is_integer(user_id) do
Manager.broadcast(topic(user_id), {:phoenix_kit_scope_roles_updated, user_id})
end
def broadcast_roles_updated(user_id) when is_binary(user_id) do
case Integer.parse(user_id) do
{int_id, ""} -> broadcast_roles_updated(int_id)
_ -> resolve_and_broadcast(user_id)
end
end
def broadcast_roles_updated(_), do: :ok
@doc """
Subscribes the current process to scope refresh notifications for the user.
"""
@spec subscribe(User.t() | integer() | binary()) :: :ok | {:error, term()}
def subscribe(%User{id: user_id}), do: subscribe(user_id)
def subscribe(user_id) when is_integer(user_id) do
Manager.subscribe(topic(user_id))
end
def subscribe(user_id) when is_binary(user_id) do
case Integer.parse(user_id) do
{int_id, ""} -> subscribe(int_id)
_ -> resolve_and_subscribe(user_id)
end
end
def subscribe(_), do: :ok
@doc """
Unsubscribes the current process from scope refresh notifications.
"""
@spec unsubscribe(User.t() | integer() | binary() | nil) :: :ok
def unsubscribe(nil), do: :ok
def unsubscribe(%User{id: user_id}) do
unsubscribe(user_id)
end
def unsubscribe(user_id) when is_integer(user_id) do
Manager.unsubscribe(topic(user_id))
end
def unsubscribe(user_id) when is_binary(user_id) do
case Integer.parse(user_id) do
{int_id, ""} -> unsubscribe(int_id)
_ -> resolve_and_unsubscribe(user_id)
end
end
def unsubscribe(_), do: :ok
defp topic(user_id), do: "#{@topic_prefix}#{user_id}"
# Resolve UUID string to integer user ID, then delegate
defp resolve_and_broadcast(uuid) do
case Auth.get_user!(uuid) do
%User{id: int_id} -> broadcast_roles_updated(int_id)
_ -> :ok
end
rescue
_ -> :ok
end
defp resolve_and_subscribe(uuid) do
case Auth.get_user!(uuid) do
%User{id: int_id} -> subscribe(int_id)
_ -> :ok
end
rescue
_ -> :ok
end
defp resolve_and_unsubscribe(uuid) do
case Auth.get_user!(uuid) do
%User{id: int_id} -> unsubscribe(int_id)
_ -> :ok
end
rescue
_ -> :ok
end
end