Document System Actor pattern in code guidelines

Add section explaining when and how to use system actor for systemic operations.
Include examples and distinction between user mode and system mode.
This commit is contained in:
Moritz 2026-01-20 22:09:22 +01:00 committed by Simon
parent 481e82d541
commit 8eb05c8a6a
Signed by: simon
GPG key ID: 40E7A58C4AA1EDB2
3 changed files with 73 additions and 8 deletions

View file

@ -124,7 +124,9 @@ defmodule Mv.Helpers.SystemActor do
{:ok, nil} ->
# System user doesn't exist - fall back to admin user
case load_admin_user_fallback() do
{:ok, admin_user} -> admin_user
{:ok, admin_user} ->
admin_user
{:error, _} ->
# In test environment, create a temporary admin user if none exists
if Mix.env() == :test do
@ -137,7 +139,9 @@ defmodule Mv.Helpers.SystemActor do
{:error, _reason} = error ->
# Database error - try fallback
case load_admin_user_fallback() do
{:ok, admin_user} -> admin_user
{:ok, admin_user} ->
admin_user
{:error, _} ->
# In test environment, create a temporary admin user if none exists
if Mix.env() == :test do
@ -166,16 +170,21 @@ defmodule Mv.Helpers.SystemActor do
description: "Administrator with full access",
permission_set_name: "admin"
}) do
{:ok, role} -> role
{:error, %Ash.Error.Invalid{errors: [%{field: :name, message: "has already been taken"}]}} ->
{:ok, role} ->
role
{:error,
%Ash.Error.Invalid{errors: [%{field: :name, message: "has already been taken"}]}} ->
# Role was created by another process - find it
case Authorization.list_roles() do
{:ok, updated_roles} ->
Enum.find(updated_roles, &(&1.permission_set_name == "admin")) ||
raise "Admin role should exist but was not found"
_ ->
raise "Failed to find admin role after creation attempt"
end
{:error, error} ->
raise "Failed to create admin role: #{inspect(error)}"
end
@ -191,16 +200,21 @@ defmodule Mv.Helpers.SystemActor do
description: "Administrator with full access",
permission_set_name: "admin"
}) do
{:ok, role} -> role
{:error, %Ash.Error.Invalid{errors: [%{field: :name, message: "has already been taken"}]}} ->
{:ok, role} ->
role
{:error,
%Ash.Error.Invalid{errors: [%{field: :name, message: "has already been taken"}]}} ->
# Role exists - try to find it
case Authorization.list_roles() do
{:ok, roles} ->
Enum.find(roles, &(&1.permission_set_name == "admin")) ||
raise "Admin role should exist but was not found"
_ ->
raise "Failed to find admin role"
end
{:error, error} ->
raise "Failed to create admin role: #{inspect(error)}"
end