class SoapyCake::Request

Constants

DATE_CLASSES

Attributes

api_key[RW]
method[R]
opts[R]
role[R]
service[R]
time_converter[RW]

Public Class Methods

new(role, service, method, opts = {}) click to toggle source
# File lib/soapy_cake/request.rb, line 10
def initialize(role, service, method, opts = {})
  @role = role.to_s
  @service = service.to_s
  @method = method.to_s
  @opts = opts
end

Public Instance Methods

path() click to toggle source
# File lib/soapy_cake/request.rb, line 17
def path
  "#{api_path}/#{service}.asmx"
end
read_only?() click to toggle source
# File lib/soapy_cake/request.rb, line 42
def read_only?
  (API_CONFIG.dig('read_only', role, service) || []).include?(method)
end
short_response?() click to toggle source
# File lib/soapy_cake/request.rb, line 34
def short_response?
  %w[addedit track signup].include?(service)
end
to_s() click to toggle source
# File lib/soapy_cake/request.rb, line 38
def to_s
  "#{role}:#{service}:#{method}:#{version} #{opts.to_json}"
end
xml() click to toggle source
# File lib/soapy_cake/request.rb, line 21
def xml
  Nokogiri::XML::Builder.new do |xml|
    xml['env'].Envelope(xml_namespaces) do
      xml.Header
      xml.Body do
        xml['cake'].public_send(method.camelize.to_sym) do
          xml_params(xml)
        end
      end
    end
  end.to_xml
end

Private Instance Methods

api_path() click to toggle source
# File lib/soapy_cake/request.rb, line 48
def api_path
  "#{role == 'admin' ? '' : "/#{role.pluralize}"}/api/#{version}"
end
format_param(key, value) click to toggle source
# File lib/soapy_cake/request.rb, line 66
def format_param(key, value)
  return time_converter.to_cake(value) if DATE_CLASSES.include?(value.class)

  if key.to_s.end_with?('_date')
    raise Error, "You need to use a Time/DateTime/Date object for '#{key}'"
  end

  value
end
version() click to toggle source
# File lib/soapy_cake/request.rb, line 76
def version
  API_CONFIG.dig('versions', role, service, method) ||
    raise(Error, "Unknown API call #{role}::#{service}::#{method}")
end
xml_namespaces() click to toggle source
# File lib/soapy_cake/request.rb, line 59
def xml_namespaces
  {
    'xmlns:env' => 'http://www.w3.org/2003/05/soap-envelope',
    'xmlns:cake' => "http://cakemarketing.com#{api_path}/"
  }
end
xml_params(xml) click to toggle source
# File lib/soapy_cake/request.rb, line 52
def xml_params(xml)
  xml.api_key(api_key)
  opts.each do |k, v|
    xml.public_send(k, format_param(k, v))
  end
end