Class: RubyIsds::Request

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby_isds/request.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(params = {}) ⇒ Request

Returns a new instance of Request.



3
4
5
6
7
# File 'lib/ruby_isds/request.rb', line 3

def initialize(params = {})
  params.each do |k, v|
    instance_variable_set("@#{k}", v)
  end if params.any?
end

Class Method Details

.call(params = {}) ⇒ Object



9
10
11
# File 'lib/ruby_isds/request.rb', line 9

def self.call(params = {})
  new(params).call
end

Instance Method Details

#api_urlObject

relative part of url because they differ…

domain such as https://ws1.czebox.cz is take from config as such:
  `RubyIsds.configuration.api_domain`
it includes `https://` so only ending is supposed to be here

Raises:

  • (NotImplementedError)


86
87
88
# File 'lib/ruby_isds/request.rb', line 86

def api_url
  raise NotImplementedError, "#{self.class} must implement #api_url!"
end

#bodyObject

Each subclass must implement

this is whole body of message which differs and also needs to be
accompanied with att_accessors

Raises:

  • (NotImplementedError)


76
77
78
# File 'lib/ruby_isds/request.rb', line 76

def body
  raise NotImplementedError, "#{self.class} must implement #body!"
end

#callObject

rubocop:disable Metrics/AbcSize



14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/ruby_isds/request.rb', line 14

def call
  uri = URI(full_url)
  request = Net::HTTP::Post.new(uri)
  default_headers.each { |k, v| request[k] = v }
  request.body = to_xml
  request.basic_auth RubyIsds.configuration.username, RubyIsds.configuration.password
  response = Net::HTTP.start(uri.hostname, uri.port,
                             use_ssl: uri.scheme == 'https') do |http|
    http.request(request)
  end
  call_reponse_wrapper(response)
end

#call_reponse_wrapper(response) ⇒ Object

rubocop:enable Metrics/AbcSize



28
29
30
# File 'lib/ruby_isds/request.rb', line 28

def call_reponse_wrapper(response)
  response_wrapper.new(response)
end

#default_headersObject



32
33
34
35
36
37
# File 'lib/ruby_isds/request.rb', line 32

def default_headers
  {
    'Content-Type' =>  'text/xml;charset=UTF-8',
    'Accept-Encoding' => 'gzip,deflate'
  }
end

#envelope_namespacesObject



50
51
52
53
54
55
# File 'lib/ruby_isds/request.rb', line 50

def envelope_namespaces
  {
    'xmlns:soapenv' => 'http://schemas.xmlsoap.org/soap/envelope/',
    'xmlns:v20' => xml_url
  }
end

#full_urlObject



57
58
59
# File 'lib/ruby_isds/request.rb', line 57

def full_url
  "#{RubyIsds.configuration.api_domain}#{api_url}"
end

#response_wrapperObject

Here you can change which response object will wrap the reponse

reponse object has to inherit from `::RubyIsds::Response`


101
102
103
# File 'lib/ruby_isds/request.rb', line 101

def response_wrapper
  ::RubyIsds::Response
end

#to_xmlObject



39
40
41
42
43
44
45
46
47
48
# File 'lib/ruby_isds/request.rb', line 39

def to_xml
  Nokogiri::XML::Builder.new(encoding: 'utf-8') do |xml|
    xml[:soapenv].Envelope(envelope_namespaces) do
      xml[:soapenv].Header
      xml[:soapenv].Body do
        body(xml)
      end
    end
  end.to_xml
end

#values(xml) ⇒ Object

each subclass needs to have availbale attrs put in constant ‘ATTRS`



64
65
66
67
68
69
# File 'lib/ruby_isds/request.rb', line 64

def values(xml)
  self.class::ATTRS.each do |attribute|
    value = instance_variable_get("@#{attribute}") || ''
    xml[:v20].public_send(attribute, value)
  end
end

#xml_urlObject

URL will differ based on endpoint that it accesses



93
94
95
# File 'lib/ruby_isds/request.rb', line 93

def xml_url
  "http://#{RubyIsds.configuration.xml_url}"
end