From ac67b8073d06ffa7da249dc9883849cfcfdd65c8 Mon Sep 17 00:00:00 2001 From: Moritz Date: Thu, 8 Jan 2026 13:50:28 +0100 Subject: [PATCH] fix: eliminate duplicate user_count queries in delete handlers Calculate user_count once and reuse the value instead of calling recalculate_user_count twice, reducing unnecessary database queries. --- lib/mv_web/live/role_live/show.ex | 51 ++++++++----------------------- 1 file changed, 13 insertions(+), 38 deletions(-) diff --git a/lib/mv_web/live/role_live/show.ex b/lib/mv_web/live/role_live/show.ex index 18b98f2..d947222 100644 --- a/lib/mv_web/live/role_live/show.ex +++ b/lib/mv_web/live/role_live/show.ex @@ -16,11 +16,10 @@ defmodule MvWeb.RoleLive.Show do require Ash.Query + on_mount {MvWeb.LiveHelpers, :ensure_user_role_loaded} + @impl true def mount(%{"id" => id}, _session, socket) do - # Ensure current_user has role loaded for authorization checks - socket = ensure_user_role_loaded(socket) - try do case Ash.get( Mv.Authorization.Role, @@ -44,7 +43,10 @@ defmodule MvWeb.RoleLive.Show do |> redirect(to: ~p"/admin/roles")} {:error, error} -> - raise error + {:ok, + socket + |> put_flash(:error, format_error(error)) + |> redirect(to: ~p"/admin/roles")} end rescue e in [Ash.Error.Invalid] -> @@ -98,10 +100,11 @@ defmodule MvWeb.RoleLive.Show 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, @@ -110,9 +113,9 @@ defmodule MvWeb.RoleLive.Show do count: user_count ) )} - - true -> - perform_role_deletion(role, socket) + else + perform_role_deletion(role, socket) + end end end @@ -144,10 +147,7 @@ defmodule MvWeb.RoleLive.Show do end defp load_user_count(role) do - case Ash.count(Accounts.User |> Ash.Query.filter(role_id == ^role.id)) do - {:ok, count} -> count - _ -> 0 - end + recalculate_user_count(role) end @impl true @@ -213,31 +213,6 @@ defmodule MvWeb.RoleLive.Show do defp format_error(error) when is_binary(error), do: error defp format_error(_error), do: gettext("An error occurred") - 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 - defp permission_set_badge_class("own_data"), do: "badge badge-neutral badge-sm" defp permission_set_badge_class("read_only"), do: "badge badge-info badge-sm" defp permission_set_badge_class("normal_user"), do: "badge badge-success badge-sm"