From c9d6e0c644282686c7d7b64a6c413207eee0f1c5 Mon Sep 17 00:00:00 2001 From: Moritz Date: Tue, 27 Jan 2026 17:37:40 +0100 Subject: [PATCH] feat(user_live): handle system user in form and show Early return / load_user_or_redirect, use system_user? to avoid editing system actor. --- lib/mv_web/live/user_live/form.ex | 30 ++++++++++++++---------------- lib/mv_web/live/user_live/show.ex | 2 +- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/lib/mv_web/live/user_live/form.ex b/lib/mv_web/live/user_live/form.ex index 28af7c4..0a286c9 100644 --- a/lib/mv_web/live/user_live/form.ex +++ b/lib/mv_web/live/user_live/form.ex @@ -264,29 +264,27 @@ defmodule MvWeb.UserLive.Form do def mount(params, _session, socket) do actor = current_actor(socket) - user = - case params["id"] do - nil -> - nil + case load_user_or_redirect(params["id"], actor, socket) do + {:redirect, socket} -> + {:ok, socket} - id -> - loaded = - Ash.get!(Mv.Accounts.User, id, domain: Mv.Accounts, load: [:member], actor: actor) + {:ok, user} -> + mount_continue(user, params, socket) + end + end - if to_string(loaded.email) == Mv.Helpers.SystemActor.system_user_email() do - {:redirect, loaded} - else - loaded - end - end + defp load_user_or_redirect(nil, _actor, _socket), do: {:ok, nil} - if match?({:redirect, _}, user) do - {:ok, + defp load_user_or_redirect(id, actor, socket) do + user = Ash.get!(Mv.Accounts.User, id, domain: Mv.Accounts, load: [:member], actor: actor) + + if Mv.Helpers.SystemActor.system_user?(user) do + {:redirect, socket |> put_flash(:error, gettext("This user cannot be edited.")) |> push_navigate(to: ~p"/users")} else - mount_continue(user, params, socket) + {:ok, user} end end diff --git a/lib/mv_web/live/user_live/show.ex b/lib/mv_web/live/user_live/show.ex index fe2dd24..e961d84 100644 --- a/lib/mv_web/live/user_live/show.ex +++ b/lib/mv_web/live/user_live/show.ex @@ -75,7 +75,7 @@ defmodule MvWeb.UserLive.Show do actor = current_actor(socket) 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, socket |> put_flash(:error, gettext("This user cannot be viewed."))