zaala 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 23d2b71b2a1a767732f1e981ec456ee03d30dfa9aae6da0b331d7f19aee61050
4
- data.tar.gz: 060b17d5d44dda277f3c463358f94083dc03e8f55ae75715ea13322b37298208
3
+ metadata.gz: 3e7ce8d64c7b4f13fb5c03dfc38a431595842dd4d4d34d7c3444014ca458976a
4
+ data.tar.gz: 8d1bcb796c6b71649bfe92fb8a46fc8c42657ad24fbbe1ceea457301c6977dc9
5
5
  SHA512:
6
- metadata.gz: 91778343fc0ee1a12d34e217e72b6486330a4533d28fd0654a0a9ad900b12769731bcd88e453d49a48c17d7686201c148d1cb473abf46498ffb0d82186f1fa86
7
- data.tar.gz: '085382d92b9b1e165d10e071fa1fe0fa5486c3024b8a8848b6074507ee5b775ed95e88437fda5b07e8dd34cc89a90bf58ff7aaf5f80e0b4de6c6b35cf1d02a4c'
6
+ metadata.gz: df99053a8a416b55b7fb4967ae021ce1315257d7123b3a72b8547c1e4cfd72e668c40983701ed014c17d0377b7428ea5237e9d0eb71512d51a3088e21afdefe1
7
+ data.tar.gz: db5b6b6d59c76d4fdfcec8e0ecd995db275fa70c243e3424bb0c07eb9093c54699af2cf464643e3307d6a974b96f5fc21e6193a053ac220c35ad036c08315c43
@@ -13,8 +13,8 @@ module Zaala::API
13
13
  symbolize_keys = lambda { |key| key.to_sym }
14
14
  params = {
15
15
  wsdl: wsdl,
16
- open_timeout: 30, # in seconds
17
- read_timeout: 30, # in seconds
16
+ open_timeout: 30, # seconds
17
+ read_timeout: 30, # seconds
18
18
  convert_response_tags_to: symbolize_keys,
19
19
  log: log,
20
20
  proxy: proxy
@@ -43,14 +43,15 @@ module Zaala::API
43
43
  ensure_operation_exists(:pre_authorize)
44
44
  raise BadRequestError.new("pre_authorize operation requires an AuthorizationRequest parameter") unless req.is_a?(AuthorizationRequest)
45
45
 
46
- @kar.call(:pre_authorize) do
46
+ res = @kar.call(:pre_authorize) do
47
47
  message(authorizationRequest: req.to_message)
48
48
  end
49
+ AuthorizationResponse.from_message(res.body[:preAuthorizeResponse][:return])
49
50
  rescue Savon::SOAPFault => e
50
- # IS0003
51
- # TODO: Extract error code from response body
52
- # e.g. (The content of at least one field is invalid and did not pass the validation)
53
- raise BadRequestError.new(e)
51
+ # Extract bad request errors
52
+ maybe_raise_invalid_fields(e.to_hash[:Fault])
53
+ # Fallback to standard errro
54
+ raise StandardError, e.to_hash.dig(:Fault, :faultstring)
54
55
  end
55
56
 
56
57
  # Authorizes a purchase transaction.
@@ -63,8 +64,10 @@ module Zaala::API
63
64
  end
64
65
  AuthorizationResponse.from_message(res.body[:authorizeResponse][:return])
65
66
  rescue Savon::SOAPFault => e
66
- # e.g. (The content of at least one field is invalid and did not pass the validation)
67
- raise BadRequestError.new(e)
67
+ # Extract bad request errors
68
+ maybe_raise_invalid_fields(e.to_hash[:Fault])
69
+ # Fallback to standard errro
70
+ raise StandardError, e.to_hash.dig(:Fault, :faultstring)
68
71
  end
69
72
 
70
73
  # Cancel a previous reservation of funds.
@@ -72,12 +75,15 @@ module Zaala::API
72
75
  ensure_operation_exists(:cancel_authorization)
73
76
  raise BadRequestError.new("cancel_authorization operation requires a CancellationRequest parameter") unless req.is_a?(CancellationRequest)
74
77
 
75
- @kar.call(:cancel_authorization) do
78
+ res = @kar.call(:cancel_authorization) do
76
79
  message(cancellationRequest: req.to_message)
77
80
  end
81
+ CancellationResponse.from_message(res.body[:cancelAuthorizationResponse][:return])
78
82
  rescue Savon::SOAPFault => e
79
- # e.g. (The content of at least one field is invalid and did not pass the validation)
80
- raise BadRequestError.new(e)
83
+ # Extract bad request errors
84
+ maybe_raise_invalid_fields(e.to_hash[:Fault])
85
+ # Fallback to standard errro
86
+ raise StandardError, e.to_hash.dig(:Fault, :faultstring)
81
87
  end
82
88
 
83
89
  # Perform a solvency check.
@@ -85,12 +91,15 @@ module Zaala::API
85
91
  ensure_operation_exists(:check)
86
92
  raise BadRequestError.new("check operation requires a CheckRequest parameter") unless req.is_a?(CheckRequest)
87
93
 
88
- @kar.call(:check) do
94
+ res = @kar.call(:check) do
89
95
  message(checkRequest: req.to_message)
90
96
  end
97
+ CheckResponse.from_message(res.body[:checkResponse][:return])
91
98
  rescue Savon::SOAPFault => e
92
- # e.g. (The content of at least one field is invalid and did not pass the validation)
93
- raise BadRequestError.new(e)
99
+ # Extract bad request errors
100
+ maybe_raise_invalid_fields(e.to_hash[:Fault])
101
+ # Fallback to standard errro
102
+ raise StandardError, e.to_hash.dig(:Fault, :faultstring)
94
103
  end
95
104
 
96
105
  # Returns available information about an authorization-ID.
@@ -98,13 +107,15 @@ module Zaala::API
98
107
  ensure_operation_exists(:info)
99
108
  raise BadRequestError.new("info operation requires an InfoRequest parameter") unless req.is_a?(InfoRequest)
100
109
 
101
- @kar.call(:info) do
110
+ res = @kar.call(:info) do
102
111
  message(infoRequest: req.to_message)
103
112
  end
113
+ InfoResponse.from_message(res.body[:infoResponse][:return])
104
114
  rescue Savon::SOAPFault => e
105
- # TODO: Extract error code from response body
106
- # e.g. (The content of at least one field is invalid and did not pass the validation)
107
- raise BadRequestError.new(e)
115
+ # Extract bad request errors
116
+ maybe_raise_invalid_fields(e.to_hash[:Fault])
117
+ # Fallback to standard errro
118
+ raise StandardError, e.to_hash.dig(:Fault, :faultstring)
108
119
  end
109
120
 
110
121
  # Verifies the given MTAN.
@@ -112,13 +123,15 @@ module Zaala::API
112
123
  ensure_operation_exists(:verify)
113
124
  raise BadRequestError.new("info operation requires a VerifyRequest parameter") unless req.is_a?(VerifyRequest)
114
125
 
115
- @kar.call(:verify) do
126
+ res = @kar.call(:verify) do
116
127
  message(verifyRequest: req.to_message)
117
128
  end
129
+ VerifyResponse.from_message(res.body[:verifyResponse][:return])
118
130
  rescue Savon::SOAPFault => e
119
- # TODO: Extract error code from response body
120
- # e.g. (The content of at least one field is invalid and did not pass the validation)
121
- raise BadRequestError.new(e)
131
+ # Extract bad request errors
132
+ maybe_raise_invalid_fields(e.to_hash[:Fault])
133
+ # Fallback to standard errro
134
+ raise StandardError, e.to_hash.dig(:Fault, :faultstring)
122
135
  end
123
136
 
124
137
  # Submits a purchase transaction with a previous authorization of funds.
@@ -131,9 +144,10 @@ module Zaala::API
131
144
  end
132
145
  SubmissionResponse.from_message(res.body[:submitAuthorizationResponse][:return])
133
146
  rescue Savon::SOAPFault => e
134
- # TODO: Extract error code from response body
135
- # e.g. (The content of at least one field is invalid and did not pass the validation)
136
- raise BadRequestError.new(e)
147
+ # Extract bad request errors
148
+ maybe_raise_invalid_fields(e.to_hash[:Fault])
149
+ # Fallback to standard errro
150
+ raise StandardError, e.to_hash.dig(:Fault, :faultstring)
137
151
  end
138
152
 
139
153
  # Authorizes a credit transaction.
@@ -144,6 +158,15 @@ module Zaala::API
144
158
 
145
159
  private
146
160
 
161
+ def maybe_raise_invalid_fields(fault)
162
+ fields = fault.dig(:detail, :invalidFieldsFaultMessage, :invalidFields)
163
+ fields = [fields] if fields.kind_of?(Hash)
164
+ return [] unless fields.kind_of?(Array)
165
+
166
+ fields = fields.map { |f| FieldViolation.new(f[:code], f[:message]) }
167
+ raise BadRequestError.new(fault[:faultstring], fields) unless fields.empty?
168
+ end
169
+
147
170
  def ensure_operation_exists(op)
148
171
  raise(UnsupportedServiceEndpoint, op) unless @kar.operations.include?(op)
149
172
  end
@@ -1,7 +1,21 @@
1
1
  module Zaala::API
2
2
  class MissingError < StandardError
3
3
  end
4
+ class FieldViolation
5
+ attr_reader :field, :description
6
+
7
+ def initialize(field, description)
8
+ @field = field
9
+ @description = description
10
+ end
11
+ end
4
12
  class BadRequestError < StandardError
13
+ attr_reader :fields
14
+
15
+ def initialize(msg, fields = [])
16
+ super(msg)
17
+ @fields = fields
18
+ end
5
19
  end
6
20
  class PermissionError < StandardError
7
21
  end
@@ -804,7 +804,7 @@ module Zaala::API
804
804
  {
805
805
  identifier: identifier.to_message,
806
806
  additionalData: additional_data.to_message,
807
- verificationCode: verification_code,
807
+ verificationCode: verification_code
808
808
  }
809
809
  end
810
810
  end
@@ -830,4 +830,51 @@ module Zaala::API
830
830
  })
831
831
  end
832
832
  end
833
+
834
+ class CheckRequest < Dry::Struct
835
+ # Environment parameters and information to identify the caller.
836
+ attribute :identifier, Zaala::API::RequestIdentifier
837
+ # Personal data of the customer.
838
+ attribute :personal_data, Zaala::API::PersonalData
839
+ # Invoice address of the purchase.
840
+ attribute :invoice_address, Zaala::API::InvoiceAddress
841
+ # Key-value pairs holding information of the service's client (e.g. IPv4 address).
842
+ # attribute :client_info, Zaala::API::ClientInfo
843
+ # Requested amount of the preauthorization/authorization.
844
+ # It corresponds to the total amount, which has to be authorized.
845
+ # Mandatory if no Basket is provided in the request.
846
+ # (IF0001) If a Basket is provided in the request, this value is ignored.
847
+ attribute :requested_amount, Types::Strict::Float
848
+ # Additional purchase related information.
849
+ attribute :additional_data, Zaala::API::AdditionalData
850
+
851
+ def to_message
852
+ {
853
+ identifier: identifier.to_message,
854
+ personal_data: personal_data.to_message,
855
+ invoice_address: invoice_address.to_message,
856
+ client_info: client_info.to_message,
857
+ requested_amount: requested_amount,
858
+ additional_data: additional_data.to_message
859
+ }
860
+ end
861
+ end
862
+
863
+ class CheckResponse < Dry::Struct
864
+ # Contains information to identify the authorization in a future request.
865
+ attribute :identifier, Zaala::API::ResponseIdentifier
866
+ # Contains additional information concerning the authorization.
867
+ attribute :decision, Zaala::API::Decision
868
+
869
+ # Contains additional information concerning the authorization.
870
+ attribute :info, Zaala::API::Info.optional.default(nil)
871
+
872
+ def self.from_message(h)
873
+ VerifyResponse.new({
874
+ identifier: Zaala::API::ResponseIdentifier.from_message(h[:identifier]),
875
+ decision: Zaala::API::Decision.from_message(h[:decision]),
876
+ info: h[:info] ? Zaala::API::Info.from_message(h[:info]) : nil,
877
+ })
878
+ end
879
+ end
833
880
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zaala
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Denteo AG
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-08 00:00:00.000000000 Z
11
+ date: 2021-10-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-types