Skip to content

Commit d4876a4

Browse files
committed
feat: Resolve using loader
1 parent e901c64 commit d4876a4

1 file changed

Lines changed: 42 additions & 0 deletions

File tree

lib/permit_ecto/resolver.ex

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,39 @@ defmodule Permit.Ecto.Resolver do
1717
import Permit.Helpers, only: [resource_module_from_resource: 1]
1818

1919
@impl Permit.ResolverBase
20+
def resolve(
21+
subject,
22+
authorization_module,
23+
resource_module,
24+
action,
25+
%{use_loader?: true} = meta,
26+
_
27+
) do
28+
params_for_loader = %{
29+
action: action,
30+
resource_module: resource_module,
31+
subject: subject,
32+
params: meta[:params]
33+
}
34+
35+
with {_, true} <-
36+
{:pre_auth, authorized?(subject, authorization_module, resource_module, action)},
37+
resource <- meta[:loader].(params_for_loader),
38+
{_, true} <-
39+
check_authorized(resource, subject, authorization_module, action) do
40+
{:authorized, resource}
41+
else
42+
{:pre_auth, false} ->
43+
:unauthorized
44+
45+
{:auth, false} ->
46+
:unauthorized
47+
48+
nil ->
49+
raise Ecto.NoResultsError
50+
end
51+
end
52+
2053
def resolve(subject, authorization_module, resource_module, action, %{} = meta, :one) do
2154
%{base_query: base_query} = meta = ensure_meta_defaults(meta)
2255

@@ -92,4 +125,13 @@ defmodule Permit.Ecto.Resolver do
92125
{authorization_module.repo.exists?(query), query}
93126
end
94127
end
128+
129+
defp check_authorized(resources, _subject, _authorization_module, _action)
130+
when is_list(resources) do
131+
{:auth, true}
132+
end
133+
134+
defp check_authorized(resource, subject, authorization_module, action) do
135+
{:auth, authorized?(subject, authorization_module, resource, action)}
136+
end
95137
end

0 commit comments

Comments
 (0)