require 'faraday_middleware' module SendGridWebApi class Base attr_accessor :api_key def initialize api_key @api_key = api_key end def make_request_url url, options "#{url}?#{builder_options(options)}" end def builder_options options to_query(options) end def query_api url, options headers = options.delete(:headers) (session.get(make_request_url(url, options)) do |req| req.headers.merge!(headers) unless headers.nil? end).body end def query_post_api url, options headers = options.delete(:headers) (session.post(url, builder_options(options)) do |req| req.headers.merge!(headers) unless headers.nil? end).body end def query_post_json_api url, options headers = options.delete(:headers) (session.post(url) do |req| req.headers[:content_type] = 'application/json' req.headers.merge!(headers) unless headers.nil? req.body = options.to_json end).body end def query_patch_api url, options headers = options.delete(:headers) (session.patch(url) do |req| req.headers[:content_type] = 'application/json' req.headers.merge!(headers) unless headers.nil? req.body = options.to_json end).body end def query_delete_api url, options headers = options.delete(:headers) (session.delete(make_request_url(url, options)) do |req| req.headers.merge!(headers) unless headers.nil? end).body end def to_query(options) Faraday::Utils.build_nested_query(options) end def session @connection ||= ::Faraday.new( url: base_url, headers: {"Authorization" => "Bearer #{@api_key}"} ) do |conn| # Forces the connection request and response to be JSON even though # Sendgrids API headers do not specify the content type is JSON conn.request :url_encoded conn.response :json #, :content_type => /\bjson$/ conn.adapter Faraday.default_adapter end end private def process_header_options options on_behalf_of = options.delete(:on_behalf_of) options.merge!({ headers: { "on-behalf-of" => on_behalf_of } }) unless on_behalf_of.nil? options end end end