Skip to content

Commit e300e68

Browse files
committed
Implement echo requests
1 parent 7819ee1 commit e300e68

File tree

3 files changed

+82
-2
lines changed

3 files changed

+82
-2
lines changed

lib/croatia/fiscalizer.rb

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,13 @@ def echo(message)
104104
request = Net::HTTP::Post.new(endpoint).tap do |req|
105105
req.body = soap_message.to_s
106106
req.content_type = "text/xml; charset=UTF-8"
107-
req["User-Agent"] = USER_AGENT
108107
end
109108

110-
response = with_http_client { |client| client.request(request) }
109+
response = execute_request(request)
110+
111+
unwrap_response(response) do |resp|
112+
Parser.parse_echo_response(resp.body)
113+
end
111114
end
112115

113116
def fiscalize(invoice:, message_id: SecureRandom.uuid)
@@ -199,4 +202,27 @@ def is_a_file_path?(path)
199202
def with_http_client(&block)
200203
self.class.with_http_client_for(host: host, port: port, credential: credential, &block)
201204
end
205+
206+
def execute_request(request)
207+
request["User-Agent"] ||= USER_AGENT
208+
with_http_client { |client| client.request(request) }
209+
end
210+
211+
def unwrap_response(response, expected: [ Net::HTTPSuccess ], &block)
212+
if expected.any? { |status| response.is_a?(status) || response.code.to_i == status }
213+
return block.call(response)
214+
end
215+
216+
Result.new.tap do |result|
217+
result.add_error(
218+
code: nil,
219+
message: "Server responded with unexpected status",
220+
description: :server_error,
221+
details: {
222+
statgus: response.code,
223+
body: response.body
224+
}
225+
)
226+
end
227+
end
202228
end

lib/croatia/fiscalizer/parser.rb

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# frozen_string_literal: true
2+
3+
module Croatia::Fiscalizer::Parser
4+
NAMESPACES = {
5+
"soap" => "http://schemas.xmlsoap.org/soap/envelope/"
6+
}.freeze
7+
8+
class << self
9+
def parse_echo_response(body)
10+
document = Nokogiri::XML(body)
11+
response = document.at_xpath("//soap:Envelope/soap:Body/echoResponse", NAMESPACES)
12+
result = Croatia::Fiscalizer::Result.new(data: response&.text)
13+
14+
if fault = document.at_xpath("//soap:Fault/detail", NAMESPACES)
15+
code = fault.at_xpath("errorCode")&.text
16+
message = fault.at_xpath("errorMessage")&.text
17+
result.add_error(code: code, message: message)
18+
end
19+
20+
result
21+
end
22+
end
23+
end

lib/croatia/fiscalizer/result.rb

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# frozen_string_literal: true
2+
3+
class Croatia::Fiscalizer::Result
4+
Error = Data.define(:code, :message, :description, :details)
5+
6+
attr_reader :message_id, :timestamp, :data, :errors
7+
8+
def initialize(message_id: nil, timestamp: nil, data: nil, errors: nil)
9+
@message_id = message_id
10+
@timestamp = timestamp
11+
@data = data
12+
@errors = errors || []
13+
end
14+
15+
def success?
16+
errors.empty?
17+
end
18+
19+
alias_method :ok?, :success?
20+
21+
def failure?
22+
!success?
23+
end
24+
25+
alias_method :error?, :failure?
26+
27+
def add_error(code:, message:, descriptions: nil)
28+
description = descriptions[code] if descriptions
29+
errors << Error.new(code: code, message: message, description: description)
30+
end
31+
end

0 commit comments

Comments
 (0)