Skip to content

Commit 344fcb0

Browse files
committed
Rework RequestParser to Request, provide access as jsonapi_request for operations callbacks
1 parent b8a1f40 commit 344fcb0

File tree

4 files changed

+219
-230
lines changed

4 files changed

+219
-230
lines changed

lib/jsonapi-resources.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
require 'jsonapi/exceptions'
2626
require 'jsonapi/error'
2727
require 'jsonapi/error_codes'
28-
require 'jsonapi/request_parser'
28+
require 'jsonapi/request'
2929
require 'jsonapi/processor'
3030
require 'jsonapi/relationship'
3131
require 'jsonapi/include_directives'

lib/jsonapi/acts_as_resource_controller.rb

Lines changed: 43 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)