Completed
Push — master ( 330dad...b4ceb2 )
by
unknown
12s queued 10s
created

XmlResponse.reference_id()   A

Complexity

Conditions 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
dl 0
loc 3
rs 10
c 0
b 0
f 0
1 1
module AuthorizeNet
2
  # The core, xml response class. You shouldn't instantiate this one.
3
  # Instead you should use AuthorizeNet::ARB::Response.
4 1
  class XmlResponse < AuthorizeNet::Response
5
    # DO NOT USE. Instantiate AuthorizeNet::ARB::Response or AuthorizeNet::CIM::Response instead.
6 1
    def initialize(raw_response, transaction)
7 11
      @raw_response = raw_response
8 11
      @transaction = transaction
9 11
      unless connection_failure?
10 11
        begin
11 11
          xml = Nokogiri::XML(@raw_response.body) do |config|
12
            # confirm noent is the right flag
13 11
            config.recover.noent.nonet
14
          end
15 11
          @root = xml.children[0]
16 11
          @result_code = node_content_unless_nil(@root.at_css('messages resultCode'))
17 11
          @message_code = node_content_unless_nil(@root.at_css('messages message code'))
18 11
          @message_text = node_content_unless_nil(@root.at_css('messages message text'))
19 11
          @reference_id = node_content_unless_nil(@root.at_css('refId'))
20
        rescue StandardError
21
          @raw_response = $ERROR_INFO
22
        end
23
      end
24
    end
25
26
    # Check to see if the response indicated success. Success is defined as a 200 OK response with a resultCode
27
    # of 'Ok'.
28 1
    def success?
29 12
      !connection_failure? && @result_code == 'Ok'
30
    end
31
32
    # Returns true if we failed to open a connection to the gateway or got back a non-200 OK HTTP response.
33 1
    def connection_failure?
34 34
      !@raw_response.is_a?(Net::HTTPOK)
35
    end
36
37
    # Returns the underlying Net::HTTPResponse object. This has the original response body along with
38
    # headers and such. Note that if an exception is generated while making the request (which happens
39
    # if there is no internet connection for example), you will get the exception object here instead of
40
    # a Net::HTTPResponse object.
41 1
    def raw
42
      @raw_response
43
    end
44
45
    # Returns a deep-copy of the XML object received from the payment gateway. Or nil if there was no XML payload.
46 1
    def xml
47
      @root.dup unless @root.nil?
48
    end
49
50
    # Returns the resultCode from the XML response. resultCode will be either 'Ok' or 'Error'.
51 1
    attr_reader :result_code
52
53
    # Returns the messageCode from the XML response. This is a code indicating the details of an error
54
    # or success.
55 1
    attr_reader :message_code
56
57
    # Returns the messageText from the XML response. This is a text description of the message_code.
58 1
    attr_reader :message_text
59
60
    # Alias for result_code.
61 1
    def response_code
62
      result_code
63
    end
64
65
    # Alias for message_code.
66 1
    def response_reason_code
67
      message_code
68
    end
69
70
    # Alias for message_text.
71 1
    def response_reason_text
72
      message_text
73
    end
74
75
    # Returns the refId from the response if there is one. Otherwise returns nil.
76 1
    attr_reader :reference_id
77
78
    #:enddoc:
79 1
    protected
80
81 1
    def node_content_unless_nil(node)
82 77
      if node.nil?
83
        nil
84
      else
85 53
        node.content
86
      end
87
    end
88
89 1
    def node_child_content_unless_nil(node)
90
      if node.nil?
91
        nil
92
      else
93
        node.children.collect(&:content) unless node.children.empty?
94
      end
95
    end
96
97
    # Transforms a block of XML into a model Object defined by entity_desc.
98 1
    def build_entity(xml, entity_desc)
99 65
      args = {}
100 65
      entity_desc.node_structure.each do |node_desc|
101 1456
        node_name = (node_desc.keys.reject { |k| k.to_s[0..0] == '_' }).first
102 613
        args.merge!(handle_node_type(xml, node_desc, node_name, args, ''))
103
      end
104
105 65
      return nil if args.empty?
106
107 33
      if entity_desc.arg_mapping.nil?
108 30
        return entity_desc.entity_class.new(args)
109
      else
110 3
        args_list = []
111 3
        entity_desc.arg_mapping.each do |arg|
112 8
          args_list <<= args[arg]
113 8
          args.delete(arg)
114
        end
115 3
        args_list <<= args
116 3
        return entity_desc.entity_class.new(*args_list)
117
      end
118
    end
119
120
    # Parses an XML fragment into an internal representation.
121 1
    def handle_node_type(xml, node_desc, node_name, args, base_name)
122 643
      case node_desc[node_name]
123
      when Symbol
124 559
        node = xml.at_css(base_name + node_name.to_s)
125 559
        unless node.nil?
126 181
          content = node.content
127 181
          case node_desc[:_converter]
128
          when Method, Proc
129
            content = node_desc[:_converter].call(content)
130
          when Symbol
131 73
            content = send(node_desc[:_converter], content)
132
          end
133 181
          args[node_desc[node_name]] = content unless content.nil?
134
        end
135
      when AuthorizeNet::EntityDescription
136 60
        if node_desc[:_multivalue].nil?
137 42
          entity = build_entity(xml.css(base_name + node_name.to_s), node_desc[node_name])
138 42
          args[node_desc[:_value]] = entity unless entity.nil?
139
        else
140 18
          xml.css(base_name + node_name.to_s).each do |node|
0 ignored issues
show
Bug introduced by
node is shadowing an outer variable; are you sure this is intended?
Loading history...
141 7
            entity = build_entity(node, node_desc[node_name])
142 7
            args[node_desc[:_multivalue]] = args[node_desc[:_multivalue]].to_a + entity.to_a unless entity.nil?
143
          end
144
        end
145
      when Array
146 24
        node_desc[node_name].each do |inner_node|
147 90
          inner_node_name = (inner_node.keys.reject { |k| k.to_s[0..0] == '_' }).first
148 30
          args.merge!(handle_node_type(xml, inner_node, inner_node_name, args, node_name.to_s + ' '))
149
        end
150
      end
151 643
      args
152
    end
153
  end
154
end
155