refactor: extract shared helpers for RoleLive modules

Extract format_error and permission_set_badge_class functions into
MvWeb.RoleLive.Helpers module to eliminate code duplication between
Index and Show LiveViews.
This commit is contained in:
Moritz 2026-01-08 14:25:28 +01:00
parent e3cd400899
commit 32296625fe
Signed by: moritz
GPG key ID: 1020A035E5DD0824
4 changed files with 44 additions and 34 deletions

View file

@ -21,6 +21,8 @@ defmodule MvWeb.RoleLive.Index do
require Ash.Query
import MvWeb.RoleLive.Helpers
on_mount {MvWeb.LiveHelpers, :ensure_user_role_loaded}
@impl true
@ -113,6 +115,7 @@ defmodule MvWeb.RoleLive.Index do
end
end
@spec load_roles(map() | nil) :: [Mv.Authorization.Role.t()]
defp load_roles(actor) do
opts = if actor, do: [actor: actor], else: []
@ -123,6 +126,7 @@ defmodule MvWeb.RoleLive.Index do
end
# Loads all user counts for roles in a single query to avoid N+1 queries
@spec load_user_counts([Mv.Authorization.Role.t()], map() | nil) :: %{Ecto.UUID.t() => non_neg_integer()}
defp load_user_counts(roles, actor) do
role_ids = Enum.map(roles, & &1.id)
@ -149,11 +153,13 @@ defmodule MvWeb.RoleLive.Index do
end
# Gets user count from preloaded assigns map
@spec get_user_count(Mv.Authorization.Role.t(), %{Ecto.UUID.t() => non_neg_integer()}) :: non_neg_integer()
defp get_user_count(role, user_counts) do
Map.get(user_counts, role.id, 0)
end
# Recalculates user count for a specific role (used before deletion)
@spec recalculate_user_count(Mv.Authorization.Role.t(), map() | nil) :: non_neg_integer()
defp recalculate_user_count(role, actor) do
opts = [domain: Mv.Accounts]
opts = if actor, do: Keyword.put(opts, :actor, actor), else: opts
@ -164,16 +170,4 @@ defmodule MvWeb.RoleLive.Index do
end
end
defp format_error(%Ash.Error.Invalid{} = error) do
Enum.map_join(error.errors, ", ", fn e -> e.message end)
end
defp format_error(error) when is_binary(error), do: error
defp format_error(_error), do: gettext("An error occurred")
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"
defp permission_set_badge_class("admin"), do: "badge badge-error badge-sm"
defp permission_set_badge_class(_), do: "badge badge-ghost badge-sm"
end