Class: FlexmlsApi::FaradayExt::FlexmlsMiddleware

Inherits:
Faraday::Response::ParseJson
  • Object
show all
Includes:
PaginateHelper
Defined in:
lib/flexmls_api/faraday.rb

Overview

Flexmls API Faraday middleware

HTTP Response after filter to package api responses and bubble up basic api errors.

Instance Method Summary collapse

Methods included from PaginateHelper

#paginate_response

Constructor Details

#initialize(app) ⇒ FlexmlsMiddleware

Returns a new instance of FlexmlsMiddleware.



58
59
60
# File 'lib/flexmls_api/faraday.rb', line 58

def initialize(app)
  super(app)
end

Instance Method Details

#on_complete(finished_env) ⇒ Object

Handles pretty much all the api response parsing and error handling. All responses that indicate a failure will raise a FlexmlsApi::ClientError exception



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/flexmls_api/faraday.rb', line 9

def on_complete(finished_env)
  body = parse(finished_env[:body])
  FlexmlsApi.logger.debug("Response Body: #{body.inspect}")
  unless body.is_a?(Hash) && body.key?("D")
    raise InvalidResponse, "The server response could not be understood"
  end
  response = ApiResponse.new body
  paging = response.pagination
  if paging.nil?
    results = response
  else
    if finished_env[:url].query_values["_pagination"] == "count"
      results = paging['TotalRows']
    else
      results = paginate_response(response, paging)
    end
  end
  case finished_env[:status]
  when 400
    hash = {:message => response.message, :code => response.code, :status => finished_env[:status]}

    # constraint violation
    if response.code == 1053
      details = body['D']['Details']
      hash[:details] = details
    end
    raise BadResourceRequest,hash
  when 401
    # Handle the WWW-Authenticate Response Header Field if present. This can be returned by 
    # OAuth2 implementations and wouldn't hurt to log.
    auth_header_error = finished_env[:request_headers]["WWW-Authenticate"]
    FlexmlsApi.logger.warn("Authentication error #{auth_header_error}") unless auth_header_error.nil?
    raise PermissionDenied, {:message => response.message, :code => response.code, :status => finished_env[:status]}
  when 404
    raise NotFound, {:message => response.message, :code => response.code, :status => finished_env[:status]}
  when 405
    raise NotAllowed, {:message => response.message, :code => response.code, :status => finished_env[:status]}
  when 409
    raise BadResourceRequest, {:message => response.message, :code => response.code, :status => finished_env[:status]}
  when 500
    raise ClientError, {:message => response.message, :code => response.code, :status => finished_env[:status]}
  when 200..299
    FlexmlsApi.logger.debug("Success!")
  else 
    raise ClientError, {:message => response.message, :code => response.code, :status => finished_env[:status]}
  end
  finished_env[:body] = results
end