class SealineInsurance::Responses::Base
Attributes
body[R]
Public Class Methods
new(http_response)
click to toggle source
# File lib/sealine_insurance/responses/base.rb, line 8 def initialize(http_response) @body = parse_response_body(http_response.body) if @body.nil? # ошибка парсинга JSON @success = false @error_code = 'invalid_response' @error_message = 'Invalid JSON' @body = {} elsif http_response.status == 401 # ошибка авторизации @success = false @error_code = 'unauthorized' @error_message = body['detail'] elsif http_response.status == 400 # невалидные входные данные @success = false @error_code = 'invalid_params' @error_message = fetch_validation_error(body) elsif http_response.status == 409 # еще один вариант ошибки - 409 Conflict @success = false @error_code = 'conflict' @error_message = body['error'] else @success = true end end
Public Instance Methods
error?()
click to toggle source
# File lib/sealine_insurance/responses/base.rb, line 40 def error? !success? end
error_code()
click to toggle source
# File lib/sealine_insurance/responses/base.rb, line 44 def error_code @error_code ||= body['error_code'] end
error_message()
click to toggle source
# File lib/sealine_insurance/responses/base.rb, line 48 def error_message @error_message ||= body['error_message'] end
success?()
click to toggle source
# File lib/sealine_insurance/responses/base.rb, line 36 def success? @success end
Private Instance Methods
fetch_validation_error(data, key_path = [])
click to toggle source
Ошибки валидации возвращаются в виде хэша различной вложенности. Ключи хеша - поля, которые не прошли валидацию. Значение - текст ошибки. Метод рекурсивный, он находит первую ошибку и возвращает ее в виде строки. Пример возвращаемого значения:
"data.arrival: Не может быть меньше даты trip.departure.date"
# File lib/sealine_insurance/responses/base.rb, line 65 def fetch_validation_error(data, key_path = []) if data.is_a?(Hash) && !data.empty? key = data.keys.first fetch_validation_error(data[key], key_path + [key]) elsif data.is_a?(Array) && !data.empty? && data.all? { |item| item.is_a?(String) } fetch_validation_error(data.join(', '), key_path) elsif data.is_a?(String) "#{key_path.join('.')}: #{data}" end end
parse_response_body(body)
click to toggle source
# File lib/sealine_insurance/responses/base.rb, line 54 def parse_response_body(body) JSON.parse(body) rescue JSON::ParserError nil end
to_money(raw_value)
click to toggle source
# File lib/sealine_insurance/responses/base.rb, line 76 def to_money(raw_value) Money.from_amount(raw_value.to_f, DEFAULT_CURRENCY) if raw_value end