Move duplicate ensure_user_role_loaded logic into MvWeb.LiveHelpers on_mount hook to eliminate code duplication across RoleLive modules and centralize security-related user role loading.
53 lines
1.3 KiB
Elixir
53 lines
1.3 KiB
Elixir
defmodule MvWeb.LiveHelpers do
|
|
@moduledoc """
|
|
Shared LiveView lifecycle hooks and helper functions.
|
|
|
|
## on_mount Hooks
|
|
- `:default` - Sets the user's locale from session (defaults to "de")
|
|
- `:ensure_user_role_loaded` - Ensures current_user has role relationship loaded
|
|
|
|
## Usage
|
|
Add to LiveView modules via:
|
|
```elixir
|
|
on_mount {MvWeb.LiveHelpers, :default}
|
|
on_mount {MvWeb.LiveHelpers, :ensure_user_role_loaded}
|
|
```
|
|
"""
|
|
import Phoenix.Component
|
|
|
|
def on_mount(:default, _params, session, socket) do
|
|
locale = session["locale"] || "de"
|
|
Gettext.put_locale(locale)
|
|
{:cont, socket}
|
|
end
|
|
|
|
def on_mount(:ensure_user_role_loaded, _params, _session, socket) do
|
|
socket = ensure_user_role_loaded(socket)
|
|
{:cont, socket}
|
|
end
|
|
|
|
defp ensure_user_role_loaded(socket) do
|
|
if socket.assigns[:current_user] do
|
|
user = socket.assigns.current_user
|
|
user_with_role = load_user_role(user)
|
|
assign(socket, :current_user, user_with_role)
|
|
else
|
|
socket
|
|
end
|
|
end
|
|
|
|
defp load_user_role(user) do
|
|
case Map.get(user, :role) do
|
|
%Ash.NotLoaded{} -> load_role_safely(user)
|
|
nil -> load_role_safely(user)
|
|
_role -> user
|
|
end
|
|
end
|
|
|
|
defp load_role_safely(user) do
|
|
case Ash.load(user, :role, domain: Mv.Accounts) do
|
|
{:ok, loaded_user} -> loaded_user
|
|
{:error, _} -> user
|
|
end
|
|
end
|
|
end
|