fix: small refactor in actor plug (#99)

This commit is contained in:
Dmitry Maganov 2024-04-04 01:53:08 +03:00 committed by GitHub
parent 3662b15ffd
commit 9ea30756a8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -8,24 +8,15 @@ defmodule AshAdmin.ActorPlug.Plug do
def actor_assigns(socket, session) do def actor_assigns(socket, session) do
otp_app = socket.endpoint.config(:otp_app) otp_app = socket.endpoint.config(:otp_app)
domains = domains(otp_app) domains = domains(otp_app)
session = Phoenix.LiveView.get_connect_params(socket) || session
session =
Phoenix.LiveView.get_connect_params(socket) || session
actor_paused =
if is_nil(session["actor_paused"]) do
true
else
session_bool(session["actor_paused"])
end
[ [
actor: actor_from_session(socket.endpoint, session), actor: actor_from_session(socket.endpoint, session),
actor_domain: actor_domain_from_session(socket.endpoint, session), actor_domain: actor_domain_from_session(socket.endpoint, session),
actor_resources: actor_resources(domains), actor_resources: actor_resources(domains),
authorizing: session_bool(session["actor_authorizing"]), actor_paused: session_bool(session["actor_paused"], true),
tenant: session["tenant"], authorizing: session_bool(session["actor_authorizing"], false),
actor_paused: actor_paused tenant: session["tenant"]
] ]
end end
@ -43,30 +34,16 @@ defmodule AshAdmin.ActorPlug.Plug do
end end
case conn.cookies do case conn.cookies do
%{"actor_resource" => "undefined"} -> session = %{
conn
session ->
case session do
%{
"actor_resource" => resource, "actor_resource" => resource,
"actor_domain" => domain, "actor_domain" => domain,
"actor_action" => action, "actor_action" => action,
"actor_primary_key" => primary_key "actor_primary_key" => primary_key
} -> }
authorizing = session["actor_authorizing"] || false when resource != "undefined" ->
actor_paused =
if is_nil(session["actor_paused"]) do
true
else
session["actor_paused"]
end
actor = actor_from_session(conn.private.phoenix_endpoint, session) actor = actor_from_session(conn.private.phoenix_endpoint, session)
authorizing = session_bool(session["actor_authorizing"], false)
authorizing = session_bool(authorizing) actor_paused = session_bool(session["actor_paused"], true)
actor_paused = session_bool(actor_paused)
conn conn
|> Plug.Conn.put_session(:actor_resource, resource) |> Plug.Conn.put_session(:actor_resource, resource)
@ -76,7 +53,6 @@ defmodule AshAdmin.ActorPlug.Plug do
|> Plug.Conn.put_session(:actor_authorizing, authorizing) |> Plug.Conn.put_session(:actor_authorizing, authorizing)
|> Plug.Conn.put_session(:actor_paused, actor_paused) |> Plug.Conn.put_session(:actor_paused, actor_paused)
|> Plug.Conn.assign(:actor, actor) |> Plug.Conn.assign(:actor, actor)
|> Plug.Conn.assign(:authorizing, authorizing || false)
|> Plug.Conn.assign(:actor_paused, actor_paused) |> Plug.Conn.assign(:actor_paused, actor_paused)
|> Plug.Conn.assign(:authorizing, authorizing) |> Plug.Conn.assign(:authorizing, authorizing)
@ -84,9 +60,8 @@ defmodule AshAdmin.ActorPlug.Plug do
conn conn
end end
end end
end
defp session_bool(value) do defp session_bool(value, default) do
case value do case value do
"true" -> "true" ->
true true
@ -101,20 +76,15 @@ defmodule AshAdmin.ActorPlug.Plug do
boolean boolean
nil -> nil ->
false default
end end
end end
defp actor_resources(domains) do defp actor_resources(domains) do
domains for domain <- domains,
|> Enum.flat_map(fn domain -> resource <- Ash.Domain.Info.resources(domain),
domain AshAdmin.Helpers.primary_action(resource, :read) && AshAdmin.Resource.actor?(resource),
|> Ash.Domain.Info.resources() do: {domain, resource}
|> Enum.filter(fn resource ->
AshAdmin.Helpers.primary_action(resource, :read) && AshAdmin.Resource.actor?(resource)
end)
|> Enum.map(fn resource -> {domain, resource} end)
end)
end end
defp domains(otp_app) do defp domains(otp_app) do
@ -124,55 +94,45 @@ defmodule AshAdmin.ActorPlug.Plug do
end end
defp actor_domain_from_session(endpoint, %{"actor_domain" => domain}) do defp actor_domain_from_session(endpoint, %{"actor_domain" => domain}) do
otp_app = endpoint.config(:otp_app) endpoint.config(:otp_app)
domains = Application.get_env(otp_app, :ash_domains) |> Application.get_env(:ash_domains)
|> Enum.find(&(AshAdmin.Domain.show?(&1) && AshAdmin.Domain.name(&1) == domain))
Enum.find(domains, fn allowed_domain ->
AshAdmin.Domain.show?(allowed_domain) && AshAdmin.Domain.name(allowed_domain) == domain
end)
end end
defp actor_domain_from_session(_, _), do: nil defp actor_domain_from_session(_, _), do: nil
defp actor_from_session(endpoint, %{ defp actor_from_session(
endpoint,
session = %{
"actor_resource" => resource, "actor_resource" => resource,
"actor_domain" => domain, "actor_domain" => domain,
"actor_primary_key" => primary_key, "actor_primary_key" => primary_key,
"actor_action" => action "actor_action" => action
}) }
)
when not is_nil(resource) and not is_nil(domain) do when not is_nil(resource) and not is_nil(domain) do
otp_app = endpoint.config(:otp_app) domain = actor_domain_from_session(endpoint, session)
domains = Application.get_env(otp_app, :ash_domains)
domain =
Enum.find(domains, fn allowed_domain ->
AshAdmin.Domain.show?(allowed_domain) && AshAdmin.Domain.name(allowed_domain) == domain
end)
resource = resource =
if domain do if domain do
domain domain
|> Ash.Domain.Info.resources() |> Ash.Domain.Info.resources()
|> Enum.find(fn domain_resource -> |> Enum.find(&(AshAdmin.Resource.name(&1) == resource))
AshAdmin.Resource.name(domain_resource) == resource
end)
end end
if domain && resource do case resource && decode_primary_key(resource, primary_key) do
{:ok, filter} ->
action = action =
if action do if action do
Ash.Resource.Info.action(resource, String.to_existing_atom(action), :read) Ash.Resource.Info.action(resource, String.to_existing_atom(action), :read)
end end
case decode_primary_key(resource, primary_key) do
:error ->
nil
{:ok, filter} ->
resource resource
|> Ash.Query.filter(^filter) |> Ash.Query.filter(^filter)
|> Ash.read_one!(action: action, authorize?: false, domain: domain) |> Ash.read_one!(action: action, authorize?: false, domain: domain)
end
_ ->
nil
end end
end end