covermymeds/cover_my_meds

View on GitHub
lib/cover_my_meds/api_request.rb

Summary

Maintainability
A
1 hr
Test Coverage
require 'faraday'
require 'faraday_middleware'
require 'typhoeus'
require 'typhoeus/adapters/faraday'
require 'json'
require 'hashie'
require 'active_support/core_ext/object/to_param'
require 'active_support/core_ext/object/to_query'
require 'cover_my_meds/error'
require 'mime-types'


module CoverMyMeds
  module ApiRequest
    DEFAULT_TIMEOUT = 60 #seconds, matches Net::Http's default which rest-client used

    def request(http_method, host, path, params={}, auth_type = :basic, &block)
      params  = params.symbolize_keys
      headers = params.delete(:headers) || {}
      timeout = params.delete(:timeout) || DEFAULT_TIMEOUT

      conn = Faraday.new host do |faraday|
        faraday.request  :multipart
        faraday.request  :url_encoded
        faraday.response :follow_redirects
        faraday.adapter  :typhoeus
      end
      case auth_type
      when :basic
        conn.request :basic_auth, @username, @password
      when :bearer
        conn.authorization :Bearer, "#{@username}+#{params.delete(:token_id)}"
      end

      response = conn.send http_method do |request|
        request.url path
        request.options.timeout = timeout
        request.params = params
        request.headers.merge! headers
        request.body = block_given? ? yield : {}
      end
      raise Error::HTTPError.new(response.status, response.body, http_method, url(host, path, params)) unless response.success?

      parse_response response
    end

    def parse_response response
      return nil if response.body.empty?
      JSON.parse(response.body)
    rescue JSON::ParserError
      response.body
    end

    def url(host, path, params)
      "#{host}#{path}".tap do |url|
        url << "?#{params.to_query}" if params.present?
      end
    end
  end
end