@@ -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
95137end
0 commit comments