diff --git a/lib/mv_web/live/role_live/index.ex b/lib/mv_web/live/role_live/index.ex index a2d2c36..e44f11a 100644 --- a/lib/mv_web/live/role_live/index.ex +++ b/lib/mv_web/live/role_live/index.ex @@ -21,9 +21,10 @@ defmodule MvWeb.RoleLive.Index do require Ash.Query + on_mount {MvWeb.LiveHelpers, :ensure_user_role_loaded} + @impl true def mount(_params, _session, socket) do - socket = ensure_user_role_loaded(socket) actor = socket.assigns[:current_user] roles = load_roles(actor) user_counts = load_user_counts(roles) @@ -35,34 +36,9 @@ defmodule MvWeb.RoleLive.Index do |> assign(:user_counts, user_counts)} 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 - @impl true def handle_event("delete", %{"id" => id}, socket) do - case Authorization.get_role(id) do + case Authorization.get_role(id, actor: socket.assigns.current_user) do {:ok, role} -> handle_delete_role(role, id, socket) @@ -96,10 +72,11 @@ defmodule MvWeb.RoleLive.Index do gettext("System roles cannot be deleted.") )} - recalculate_user_count(role) > 0 -> + true -> user_count = recalculate_user_count(role) - {:noreply, + if user_count > 0 do + {:noreply, put_flash( socket, :error, @@ -108,9 +85,9 @@ defmodule MvWeb.RoleLive.Index do count: user_count ) )} - - true -> - perform_role_deletion(role, id, socket) + else + perform_role_deletion(role, id, socket) + end end end @@ -153,10 +130,15 @@ defmodule MvWeb.RoleLive.Index do # Load all users with role_id in a single query users = - Accounts.User - |> Ash.Query.filter(role_id in ^role_ids) - |> Ash.Query.select([:role_id]) - |> Ash.read!(domain: Mv.Accounts) + case Ash.read( + Accounts.User + |> Ash.Query.filter(role_id in ^role_ids) + |> Ash.Query.select([:role_id]), + domain: Mv.Accounts + ) do + {:ok, users_list} -> users_list + {:error, _} -> [] + end # Group by role_id and count users