@@ -13,7 +13,7 @@ def self.included(base)
1313 :transaction
1414 end
1515
16- attr_reader :response_document
16+ attr_reader :response_document , :jsonapi_request
1717
1818 def index
1919 process_request
@@ -76,48 +76,54 @@ def get_related_resources
7676 end
7777
7878 def process_request
79- @response_document = create_response_document
80-
81- unless verify_content_type_header && verify_accept_header
82- render_response_document
83- return
79+ begin
80+ setup_response_document
81+ verify_content_type_header
82+ verify_accept_header
83+ parse_request
84+ execute_request
85+ rescue => e
86+ handle_exceptions ( e )
8487 end
88+ render_response_document
89+ end
8590
86- request_parser = JSONAPI ::RequestParser . new (
87- params ,
88- context : context ,
89- key_formatter : key_formatter ,
90- server_error_callbacks : ( self . class . server_error_callbacks || [ ] ) )
91-
92- transactional = request_parser . transactional?
91+ def setup_response_document
92+ @response_document = create_response_document
93+ end
9394
94- begin
95- process_operations ( transactional ) do
96- run_callbacks :process_operations do
97- request_parser . each ( response_document ) do |op |
98- op . options [ :serializer ] = resource_serializer_klass . new (
99- op . resource_klass ,
100- include_directives : op . options [ :include_directives ] ,
101- fields : op . options [ :fields ] ,
102- base_url : base_url ,
103- key_formatter : key_formatter ,
104- route_formatter : route_formatter ,
105- serialization_options : serialization_options ,
106- controller : self
107- )
108- op . options [ :cache_serializer_output ] = !JSONAPI . configuration . resource_cache . nil?
109-
110- process_operation ( op )
111- end
112- end
113- if response_document . has_errors?
114- raise ActiveRecord ::Rollback
95+ def parse_request
96+ @jsonapi_request = JSONAPI ::Request . new (
97+ params ,
98+ context : context ,
99+ key_formatter : key_formatter ,
100+ server_error_callbacks : ( self . class . server_error_callbacks || [ ] ) )
101+ fail JSONAPI ::Exceptions ::Errors . new ( @jsonapi_request . errors ) if @jsonapi_request . errors . any?
102+ end
103+
104+ def execute_request
105+ process_operations ( jsonapi_request . transactional? ) do
106+ run_callbacks :process_operations do
107+ jsonapi_request . operations . each do |op |
108+ op . options [ :serializer ] = resource_serializer_klass . new (
109+ op . resource_klass ,
110+ include_directives : op . options [ :include_directives ] ,
111+ fields : op . options [ :fields ] ,
112+ base_url : base_url ,
113+ key_formatter : key_formatter ,
114+ route_formatter : route_formatter ,
115+ serialization_options : serialization_options ,
116+ controller : self
117+ )
118+ op . options [ :cache_serializer_output ] = !JSONAPI . configuration . resource_cache . nil?
119+
120+ process_operation ( op )
115121 end
116122 end
117- rescue => e
118- handle_exceptions ( e )
123+ if response_document . has_errors?
124+ raise ActiveRecord ::Rollback
125+ end
119126 end
120- render_response_document
121127 end
122128
123129 def process_operations ( transactional )
@@ -165,20 +171,12 @@ def verify_content_type_header
165171 fail JSONAPI ::Exceptions ::UnsupportedMediaTypeError . new ( request . content_type )
166172 end
167173 end
168- true
169- rescue => e
170- handle_exceptions ( e )
171- false
172174 end
173175
174176 def verify_accept_header
175177 unless valid_accept_media_type?
176178 fail JSONAPI ::Exceptions ::NotAcceptableError . new ( request . accept )
177179 end
178- true
179- rescue => e
180- handle_exceptions ( e )
181- false
182180 end
183181
184182 def valid_accept_media_type?
0 commit comments