feat(user_live): handle system user in form and show

Early return / load_user_or_redirect, use system_user? to avoid editing system actor.
This commit is contained in:
Moritz 2026-01-27 17:37:40 +01:00 committed by moritz
parent a10c770ca7
commit cbcb93418e
2 changed files with 15 additions and 17 deletions

View file

@ -264,29 +264,27 @@ defmodule MvWeb.UserLive.Form do
def mount(params, _session, socket) do def mount(params, _session, socket) do
actor = current_actor(socket) actor = current_actor(socket)
user = case load_user_or_redirect(params["id"], actor, socket) do
case params["id"] do {:redirect, socket} ->
nil -> {:ok, socket}
nil
id -> {:ok, user} ->
loaded = mount_continue(user, params, socket)
Ash.get!(Mv.Accounts.User, id, domain: Mv.Accounts, load: [:member], actor: actor) end
end
if to_string(loaded.email) == Mv.Helpers.SystemActor.system_user_email() do defp load_user_or_redirect(nil, _actor, _socket), do: {:ok, nil}
{:redirect, loaded}
else
loaded
end
end
if match?({:redirect, _}, user) do defp load_user_or_redirect(id, actor, socket) do
{:ok, user = Ash.get!(Mv.Accounts.User, id, domain: Mv.Accounts, load: [:member], actor: actor)
if Mv.Helpers.SystemActor.system_user?(user) do
{:redirect,
socket socket
|> put_flash(:error, gettext("This user cannot be edited.")) |> put_flash(:error, gettext("This user cannot be edited."))
|> push_navigate(to: ~p"/users")} |> push_navigate(to: ~p"/users")}
else else
mount_continue(user, params, socket) {:ok, user}
end end
end end

View file

@ -75,7 +75,7 @@ defmodule MvWeb.UserLive.Show do
actor = current_actor(socket) actor = current_actor(socket)
user = Ash.get!(Mv.Accounts.User, id, domain: Mv.Accounts, load: [:member], actor: actor) user = Ash.get!(Mv.Accounts.User, id, domain: Mv.Accounts, load: [:member], actor: actor)
if to_string(user.email) == Mv.Helpers.SystemActor.system_user_email() do if Mv.Helpers.SystemActor.system_user?(user) do
{:ok, {:ok,
socket socket
|> put_flash(:error, gettext("This user cannot be viewed.")) |> put_flash(:error, gettext("This user cannot be viewed."))