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