@@ -85,16 +85,49 @@ def authorize_show_relationship
8585 end
8686
8787 def authorize_show_related_resource
88+ # 1. Load the related resource like jsonapi-resources loads them.
89+ # This code is copy-pasted from jsonapi-resources `Processor#related_resource`
90+ # so that we get to loading the resources the same way as JR does.
91+ include_directives = params [ :include_directives ]
8892 source_klass = params [ :source_klass ]
8993 source_id = params [ :source_id ]
90- relationship_type = params [ :relationship_type ] . to_sym
94+ relationship_type = params [ :relationship_type ]
95+ serializer = params [ :serializer ]
96+ fields = params [ :fields ]
97+
98+ find_options = {
99+ context : context ,
100+ fields : fields ,
101+ filters : { } ,
102+ include_directives : include_directives
103+ }
104+
105+ source_resource = source_klass . find_by_key ( source_id , context : context , fields : fields )
106+
107+ resource_set = find_related_resource_set ( source_resource ,
108+ relationship_type ,
109+ include_directives ,
110+ find_options )
111+
112+ resource_set . populate! ( serializer , context , find_options )
91113
92- source_resource = source_klass . find_by_key ( source_id , context : context )
114+ # 2. Authorize the showing of related resources. This code is specific to jsonapi-authorization.
93115
94- related_resource = source_resource . public_send ( relationship_type )
116+ # TODO: Figure out better names for the variables used when looping.
117+ # The reason they have bad names is that we don't know what they are.
118+ related_resources = resource_set . resource_klasses . flat_map do |_resource_klass , inner_thing |
119+ inner_thing . map { |_resource_id , lower_level_thing | lower_level_thing [ :resource ] }
120+ end
121+
122+ if related_resources . size > 1
123+ raise "Unexpectedly more than one related resource in a show_related_resource operation!"
124+ end
125+
126+ related_resource = related_resources . first
95127
96128 source_record = source_resource . _model
97129 related_record = related_resource . _model unless related_resource . nil?
130+
98131 authorizer . show_related_resource (
99132 source_record : source_record , related_record : related_record
100133 )
0 commit comments