Merge remote-tracking branch 'origin/main' into feature/372-groups-management
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Simon 2026-01-27 23:48:31 +01:00
commit 3eb4cde0b7
Signed by: simon
GPG key ID: 40E7A58C4AA1EDB2
17 changed files with 330 additions and 38 deletions

View file

@ -264,12 +264,31 @@ defmodule MvWeb.UserLive.Form do
def mount(params, _session, socket) do
actor = current_actor(socket)
user =
case params["id"] do
nil -> nil
id -> Ash.get!(Mv.Accounts.User, id, domain: Mv.Accounts, load: [:member], actor: actor)
end
case load_user_or_redirect(params["id"], actor, socket) do
{:redirect, socket} ->
{:ok, socket}
{:ok, user} ->
mount_continue(user, params, socket)
end
end
defp load_user_or_redirect(nil, _actor, _socket), do: {:ok, nil}
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
{:ok, user}
end
end
defp mount_continue(user, params, socket) do
action = if is_nil(user), do: gettext("New"), else: gettext("Edit")
page_title = action <> " " <> gettext("User")

View file

@ -25,10 +25,18 @@ defmodule MvWeb.UserLive.Index do
import MvWeb.LiveHelpers, only: [current_actor: 1]
require Ash.Query
import MvWeb.ErrorHelpers, only: [format_ash_error: 1]
@impl true
def mount(_params, _session, socket) do
actor = current_actor(socket)
users = Ash.read!(Mv.Accounts.User, domain: Mv.Accounts, load: [:member], actor: actor)
users =
Mv.Accounts.User
|> Ash.Query.filter(email != ^Mv.Helpers.SystemActor.system_user_email())
|> Ash.read!(domain: Mv.Accounts, load: [:member], actor: actor)
sorted = Enum.sort_by(users, & &1.email)
{:ok,
@ -64,7 +72,7 @@ defmodule MvWeb.UserLive.Index do
)}
{:error, error} ->
{:noreply, put_flash(socket, :error, format_error(error))}
{:noreply, put_flash(socket, :error, format_ash_error(error))}
end
{:error, %Ash.Error.Query.NotFound{}} ->
@ -75,7 +83,7 @@ defmodule MvWeb.UserLive.Index do
put_flash(socket, :error, gettext("You do not have permission to access this user"))}
{:error, error} ->
{:noreply, put_flash(socket, :error, format_error(error))}
{:noreply, put_flash(socket, :error, format_ash_error(error))}
end
end
@ -137,12 +145,4 @@ defmodule MvWeb.UserLive.Index do
defp toggle_order(:desc), do: :asc
defp sort_fun(:asc), do: &<=/2
defp sort_fun(:desc), do: &>=/2
defp format_error(%Ash.Error.Invalid{errors: errors}) do
Enum.map_join(errors, ", ", fn %{message: message} -> message end)
end
defp format_error(error) do
inspect(error)
end
end

View file

@ -75,9 +75,16 @@ defmodule MvWeb.UserLive.Show do
actor = current_actor(socket)
user = Ash.get!(Mv.Accounts.User, id, domain: Mv.Accounts, load: [:member], actor: actor)
{:ok,
socket
|> assign(:page_title, gettext("Show User"))
|> assign(:user, user)}
if Mv.Helpers.SystemActor.system_user?(user) do
{:ok,
socket
|> put_flash(:error, gettext("This user cannot be viewed."))
|> push_navigate(to: ~p"/users")}
else
{:ok,
socket
|> assign(:page_title, gettext("Show User"))
|> assign(:user, user)}
end
end
end