Class: Seam::Http::Request::ResponseMiddleware

Inherits:
Faraday::Response::RaiseError
  • Object
show all
Defined in:
lib/seam/request.rb

Instance Method Summary collapse

Instance Method Details

#on_complete(env) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/seam/request.rb', line 47

def on_complete(env)
  return if env.success?

  status_code = env.status
  request_id = env.response_headers["seam-request-id"]

  raise Http::UnauthorizedError.new(request_id) if status_code == 401

  if seam_api_error_response?(env)
    body = JSON.parse(env.body)
    error = body["error"]
    error_details = {
      type: error["type"] || "unknown_error",
      message: error["message"] || "Unknown error",
      data: error["data"]
    }

    if error["type"] == "invalid_input"
      error_details["validation_errors"] = error["validation_errors"]
      raise Http::InvalidInputError.new(error_details, status_code, request_id)
    end

    raise Http::ApiError.new(error_details, status_code, request_id)
  end

  super
end

#seam_api_error_response?(env) ⇒ Boolean

Returns:

  • (Boolean)


75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/seam/request.rb', line 75

def seam_api_error_response?(env)
  return false unless env.response_headers

  content_type = env.response_headers["Content-Type"]
  return false unless content_type&.start_with?("application/json")

  begin
    body = JSON.parse(env.body)
    return false unless body.is_a?(Hash) && body["error"].is_a?(Hash)

    error = body["error"]
    error["type"].is_a?(String) && error["message"].is_a?(String)
  rescue JSON::ParserError
    false
  end
end