Class: CoreLibrary::ResponseHandler

Inherits:
Object
  • Object
show all
Defined in:
lib/apimatic-core/response_handler.rb

Overview

Creates an instance of ResponseHandler.

Instance Method Summary collapse

Constructor Details

#initializeResponseHandler

Creates an instance of ResponseHandler.



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/apimatic-core/response_handler.rb', line 5

def initialize
  @deserializer = nil
  @convertor = nil
  @deserialize_into = nil
  @is_api_response = false
  @is_nullify404 = false
  @local_errors = {}
  @datetime_format = nil
  @is_xml_response = false
  @xml_attribute = nil
  @is_primitive_response = false
  @is_date_response = false
  @is_response_array = false
  @is_response_void = false
  @is_nullable_response = false
end

Instance Method Details

#apply_api_response(response, deserialized_value) ⇒ Object

Applies API response.



222
223
224
225
226
227
228
229
# File 'lib/apimatic-core/response_handler.rb', line 222

def apply_api_response(response, deserialized_value)
  if @is_api_response
    errors = ApiHelper.map_response(deserialized_value, ['errors'])
    return ApiResponse.new(response, data: deserialized_value, errors: errors)
  end

  deserialized_value
end

#apply_convertor(deserialized_value) ⇒ Object

Applies converter to the response.



233
234
235
236
237
# File 'lib/apimatic-core/response_handler.rb', line 233

def apply_convertor(deserialized_value)
  return @convertor.call(deserialized_value) unless @convertor.nil?

  deserialized_value
end

#apply_deserializer(response, should_symbolize_hash) ⇒ Object

Applies deserializer to the response.



202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
# File 'lib/apimatic-core/response_handler.rb', line 202

def apply_deserializer(response, should_symbolize_hash)
  return if @is_nullable_response && (response.raw_body.nil? || response.raw_body.to_s.strip.empty?)

  return apply_xml_deserializer(response) if @is_xml_response
  return response.raw_body if @deserializer.nil?

  if @datetime_format
    @deserializer.call(response.raw_body, @datetime_format, @is_response_array, should_symbolize_hash)
  elsif @is_date_response
    @deserializer.call(response.raw_body, @is_response_array, should_symbolize_hash)
  elsif !@deserialize_into.nil? || @is_primitive_response
    @deserializer.call(response.raw_body, @deserialize_into, @is_response_array, should_symbolize_hash)
  else
    @deserializer.call(response.raw_body, should_symbolize_hash)
  end
end

#apply_xml_deserializer(response) ⇒ Object

Applies xml deserializer to the response.



191
192
193
194
195
196
197
198
# File 'lib/apimatic-core/response_handler.rb', line 191

def apply_xml_deserializer(response)
  unless @xml_attribute.get_array_item_name.nil?
    return @deserializer.call(response.raw_body, @xml_attribute.get_root_element_name,
                              @xml_attribute.get_array_item_name, @deserialize_into, @datetime_format)
  end

  @deserializer.call(response.raw_body, @xml_attribute.get_root_element_name, @deserialize_into, @datetime_format)
end

#convertor(convertor) ⇒ ResponseHandler

Sets converter for the response.



33
34
35
36
# File 'lib/apimatic-core/response_handler.rb', line 33

def convertor(convertor)
  @convertor = convertor
  self
end

#datetime_format(datetime_format) ⇒ ResponseHandler

Sets the datetime format.



73
74
75
76
# File 'lib/apimatic-core/response_handler.rb', line 73

def datetime_format(datetime_format)
  @datetime_format = datetime_format
  self
end

#deserialize_into(deserialize_into) ⇒ ResponseHandler

Sets the model to deserialize into.



41
42
43
44
# File 'lib/apimatic-core/response_handler.rb', line 41

def deserialize_into(deserialize_into)
  @deserialize_into = deserialize_into
  self
end

#deserializer(deserializer) ⇒ ResponseHandler

Sets deserializer for the response.



25
26
27
28
# File 'lib/apimatic-core/response_handler.rb', line 25

def deserializer(deserializer)
  @deserializer = deserializer
  self
end

#handle(response, global_errors, should_symbolize_hash = false) ⇒ Object

Main method to handle the response with all the set properties.



157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
# File 'lib/apimatic-core/response_handler.rb', line 157

def handle(response, global_errors, should_symbolize_hash = false)
  # checking Nullify 404
  return nil if response.status_code == 404 && @is_nullify404

  # validating response if configured
  validate(response, global_errors)

  return if @is_response_void && !@is_api_response

  # applying deserializer if configured
  deserialized_value = apply_deserializer(response, should_symbolize_hash)

  # applying api_response if configured
  deserialized_value = apply_api_response(response, deserialized_value)

  # applying convertor if configured
  deserialized_value = apply_convertor(deserialized_value)

  deserialized_value
end

#is_api_response(is_api_response) ⇒ ResponseHandler

Sets the is_api_response property.



98
99
100
101
# File 'lib/apimatic-core/response_handler.rb', line 98

def is_api_response(is_api_response)
  @is_api_response = is_api_response
  self
end

#is_date_response(is_date_response) ⇒ ResponseHandler

Sets the is_date_response property.



122
123
124
125
# File 'lib/apimatic-core/response_handler.rb', line 122

def is_date_response(is_date_response)
  @is_date_response = is_date_response
  self
end

#is_nullable_response(is_nullable_response) ⇒ ResponseHandler

Sets the is_nullable_response property.



146
147
148
149
# File 'lib/apimatic-core/response_handler.rb', line 146

def is_nullable_response(is_nullable_response)
  @is_nullable_response = is_nullable_response
  self
end

#is_nullify404(is_nullify404) ⇒ ResponseHandler

Sets the is_nullify404 property.



106
107
108
109
# File 'lib/apimatic-core/response_handler.rb', line 106

def is_nullify404(is_nullify404)
  @is_nullify404 = is_nullify404
  self
end

#is_primitive_response(is_primitive_response) ⇒ ResponseHandler

Sets the is_primitive_response property. rubocop:disable Naming/PredicateName, Naming/PredicatePrefix



90
91
92
93
# File 'lib/apimatic-core/response_handler.rb', line 90

def is_primitive_response(is_primitive_response)
  @is_primitive_response = is_primitive_response
  self
end

#is_response_array(is_response_array) ⇒ ResponseHandler

Sets the is_response_array property.



130
131
132
133
# File 'lib/apimatic-core/response_handler.rb', line 130

def is_response_array(is_response_array)
  @is_response_array = is_response_array
  self
end

#is_response_void(is_response_void) ⇒ ResponseHandler

Sets the is_response_void property.



138
139
140
141
# File 'lib/apimatic-core/response_handler.rb', line 138

def is_response_void(is_response_void)
  @is_response_void = is_response_void
  self
end

#is_xml_response(is_xml_response) ⇒ ResponseHandler

Set the is_xml_response property.



114
115
116
117
# File 'lib/apimatic-core/response_handler.rb', line 114

def is_xml_response(is_xml_response)
  @is_xml_response = is_xml_response
  self
end

#local_error(error_code, error_message, exception_type) ⇒ ResponseHandler

Registers an entry with error message in the local errors hash.



51
52
53
54
55
56
# File 'lib/apimatic-core/response_handler.rb', line 51

def local_error(error_code, error_message, exception_type)
  @local_errors[error_code.to_s] = ErrorCase.new
                                            .error_message(error_message)
                                            .exception_type(exception_type)
  self
end

#local_error_template(error_code, error_message_template, exception_type) ⇒ ResponseHandler

Registers an entry with error template in the local errors hash.



63
64
65
66
67
68
# File 'lib/apimatic-core/response_handler.rb', line 63

def local_error_template(error_code, error_message_template, exception_type)
  @local_errors[error_code.to_s] = ErrorCase.new
                                            .error_message_template(error_message_template)
                                            .exception_type(exception_type)
  self
end

#validate(response, global_errors) ⇒ Object

Validates the response provided and throws an error against the configured status code.

Raises:

  • (ApiException)

    Throws the exception when the response contains errors.



182
183
184
185
186
187
188
# File 'lib/apimatic-core/response_handler.rb', line 182

def validate(response, global_errors)
  return unless response.status_code < 200 || response.status_code > 299

  validate_against_error_cases(response, @local_errors)

  validate_against_error_cases(response, global_errors)
end

#validate_against_error_cases(response, error_cases) ⇒ Object

Validates the response against the provided error cases hash, if matches, it raises the exception.

Raises:

  • (ApiException)

    Raises the APIException when configured error code matches.



243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
# File 'lib/apimatic-core/response_handler.rb', line 243

def validate_against_error_cases(response, error_cases)
  actual_status_code = response.status_code.to_s

  # Handling error case when configured as explicit error code
  error_case = error_cases[actual_status_code]
  error_case&.raise_exception(response)

  # Handling error case when configured as explicit error codes range
  default_range_entry = error_cases&.filter do |error_code, _|
    error_code.match?("^#{actual_status_code[0]}XX$")
  end

  default_range_error_case = default_range_entry&.map { |_, error_case_instance| error_case_instance }

  default_range_error_case[0].raise_exception(response) unless
    default_range_error_case.nil? || default_range_error_case.empty?

  # Handling default error case if configured
  default_error_case = error_cases['default']
  default_error_case&.raise_exception(response)
end

#xml_attribute(xml_attribute) ⇒ ResponseHandler

Set the xml_attribute property.



81
82
83
84
# File 'lib/apimatic-core/response_handler.rb', line 81

def xml_attribute(xml_attribute)
  @xml_attribute = xml_attribute
  self
end