slimpay-client 1.0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: d9ab9a02425e00aaa4757dd33b2bf194a658f3e6a2ee9976a5a1346c52b869ef
4
+ data.tar.gz: be311216bb1bdebe9532e810e7328086d19b95edb6604e22235574d8e04568e6
5
+ SHA512:
6
+ metadata.gz: b061c1a2aa5dc924d920e5eeac0d69dece11497515976d53fc56de9f230094ab53ea2250ea024daca99db6d2abaabd7f4df34ece88b436ea85a24e9642a7a0f6
7
+ data.tar.gz: 93c3ca8a440c4555cdcad858300db32b2570b10395479b469c0e8535cee2005bf803c917158f5b653459e051ebe573f43d45c2310fa81508b68899bf473de73a
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ *.gem
2
+ .DS_Store
@@ -0,0 +1,9 @@
1
+ module Slimpay
2
+ class Error < StandardError
3
+ def initialize(error_data = {})
4
+ if error_data[:json] && error_data[:json]['message']
5
+ super(error_data[:json]['message'])
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,205 @@
1
+ require 'net/http'
2
+ require 'multi_json'
3
+ require 'oauth2'
4
+
5
+ require 'slimpay/error'
6
+
7
+ module Slimpay
8
+
9
+ LINK_NAMESPACE = 'https://api.slimpay.net/alps#'
10
+
11
+ class << self
12
+
13
+ attr_accessor :client_id, :client_secret, :creditor_reference, :logger
14
+
15
+ def initialize
16
+ sandbox = true
17
+ end
18
+
19
+ def configure
20
+ yield(self)
21
+ end
22
+
23
+ def sandbox
24
+ @sandbox != false
25
+ end
26
+
27
+ def sandbox=(value)
28
+ @sandbox = value
29
+ update_base_url
30
+ end
31
+
32
+ def base
33
+ return @base if @base
34
+
35
+ json = request(:get, '/')
36
+ klass = generate_resource(json)
37
+
38
+ @base = Slimpay.const_set('Base', klass).new(json)
39
+ @base
40
+ end
41
+
42
+ private
43
+
44
+ def update_base_url
45
+ @base_url = sandbox === false ? 'https://api.slimpay.net/' : 'https://api.preprod.slimpay.com/'
46
+ end
47
+
48
+ def generate_resource(json)
49
+ klass = Class.new do
50
+ attr_reader :data
51
+
52
+ def initialize(data)
53
+ @data = data
54
+ end
55
+ end
56
+
57
+ if json['_links'].present?
58
+ json['_links'].each do |key, _|
59
+ # Ignore `self` and `profile`
60
+ next if !key.start_with?(Slimpay::LINK_NAMESPACE)
61
+
62
+ path = json['_links'][key]['href'].dup
63
+ method_name = key.sub(Slimpay::LINK_NAMESPACE, '').underscore
64
+ http_method = :get
65
+
66
+ # HACK: don't have the information from the API
67
+ if method_name.start_with?('create', 'post', 'revoke', 'cancel')
68
+ http_method = :post
69
+ elsif method_name.start_with?('patch')
70
+ http_method = :patch
71
+ end
72
+
73
+ if path.end_with?('{id}')
74
+ klass.send(:define_method, method_name) do |id|
75
+ new_path = "#{path}#{id}"
76
+ Slimpay.send(:parse_response, Slimpay.send(:request, http_method, new_path))
77
+ end
78
+ else
79
+ params = []
80
+ if json['_links'][key]['templated'].present?
81
+ params = path.scan(/{\?(.*)}/)[0][0].split(',')
82
+ path.sub!(/{(.*)}/, '')
83
+ end
84
+
85
+ # Useful for finding params
86
+ # List only params for GET request
87
+ klass.send(:define_method, "#{method_name}_params") do
88
+ params
89
+ end
90
+
91
+ klass.send(:define_method, method_name) do |params = {}|
92
+ Slimpay.send(:parse_response, Slimpay.send(:request, http_method, path, params))
93
+ end
94
+ end
95
+ end
96
+ end
97
+
98
+ if json['_embedded'].present?
99
+ json['_embedded'].each do |key, values|
100
+ attr_values = []
101
+
102
+ values.each do |value|
103
+ attr_values << generate_resource(value).new(value)
104
+ end
105
+
106
+ klass.send(:define_method, key) do
107
+ attr_values
108
+ end
109
+ end
110
+ end
111
+
112
+ klass
113
+ end
114
+
115
+ def parse_response(json)
116
+ generate_resource(json).new(json)
117
+ end
118
+
119
+ def request(method, path, params = {}, no_retry = false)
120
+ refresh_token if @token.nil?
121
+
122
+ self.logger.debug "[Slimpay] request: method: #{method} - path: #{path} - params: #{params}" if self.logger
123
+
124
+ headers = {
125
+ 'Authorization' => "Bearer #{@token}",
126
+ 'Accept' => 'application/hal+json; profile="https://api.slimpay.net/alps/v1"',
127
+ 'Content-Type' => 'application/json',
128
+ }
129
+
130
+ url = URI.join(@base_url, path)
131
+ http = Net::HTTP.new(url.host, url.port)
132
+ http.use_ssl = url.scheme == 'https'
133
+
134
+ case method
135
+ when :get
136
+ url.query = URI.encode_www_form(params)
137
+ response = http.get(url, headers)
138
+ when :post
139
+ response = http.post(url, MultiJson.dump(params), headers)
140
+ when :put
141
+ response = http.put(url, MultiJson.dump(params), headers)
142
+ when :patch
143
+ headers['Content-Type'] = 'application/merge-patch+json'
144
+ response = http.patch(url, MultiJson.dump(params), headers)
145
+ when :delete
146
+ request = Net::HTTP::Delete.new(url, headers)
147
+ request.body = MultiJson.dump(params)
148
+
149
+ response = http.request(request)
150
+ else
151
+ raise "[Slimpay] request method invalid: #{method}"
152
+ end
153
+
154
+ if response.is_a?(Net::HTTPSuccess)
155
+ if response.body.blank?
156
+ return nil
157
+ else
158
+ return MultiJson.load(response.body)
159
+ end
160
+ end
161
+
162
+ # If get 401 Unauthorised try to have a new token and redo the request but only once
163
+ if response.code.to_s == '401' && no_retry === false
164
+ @token = nil
165
+ return request(method, path, params, true)
166
+ end
167
+
168
+ json = MultiJson.load(response.body) rescue {}
169
+
170
+ error_data = {
171
+ method: method,
172
+ path: path,
173
+ params: params,
174
+ status_code: response.code,
175
+ json: json
176
+ }
177
+
178
+ if json.empty?
179
+ error_data[:body] = response.body
180
+ end
181
+
182
+ self.logger.error "[Slimpay] request error: #{error_data.map {|k,v| "#{k}: #{v.inspect}" }.join(' - ')}" if self.logger
183
+
184
+ raise Slimpay::Error.new(error_data)
185
+ end
186
+
187
+ def refresh_token
188
+ self.logger.debug "[Slimpay] refresh token" if self.logger
189
+
190
+ client = OAuth2::Client.new(
191
+ @client_id,
192
+ @client_secret,
193
+ site: URI.join(@base_url, 'oauth/token'),
194
+ headers: {
195
+ 'grant_type' => 'client_credentials',
196
+ 'scope' => 'api_admin'
197
+ }
198
+ )
199
+ response = client.client_credentials.get_token
200
+ @token = response.token
201
+ end
202
+
203
+ end
204
+
205
+ end
@@ -0,0 +1,19 @@
1
+ $:.unshift File.expand_path('../lib', __FILE__)
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'slimpay-client'
5
+ s.summary = "Slimpay client"
6
+ s.description = s.summary
7
+ s.version = '1.0.0'
8
+ s.files = `git ls-files`.split("\n")
9
+ s.require_paths = ['lib']
10
+ s.authors = ['Jonathan VUKOVICH TRIBOUHARET']
11
+ s.email = 'jonathan.tribouharet@gmail.com'
12
+ s.license = 'MIT'
13
+ s.platform = Gem::Platform::RUBY
14
+
15
+ s.required_ruby_version = '>= 1.9.2'
16
+
17
+ s.add_dependency 'multi_json'
18
+ s.add_dependency 'oauth2'
19
+ end
metadata ADDED
@@ -0,0 +1,75 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: slimpay-client
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Jonathan VUKOVICH TRIBOUHARET
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-09-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: multi_json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: oauth2
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: Slimpay client
42
+ email: jonathan.tribouharet@gmail.com
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - ".gitignore"
48
+ - lib/slimpay/error.rb
49
+ - lib/slimpay_client.rb
50
+ - slimpay_client.gemspec
51
+ homepage:
52
+ licenses:
53
+ - MIT
54
+ metadata: {}
55
+ post_install_message:
56
+ rdoc_options: []
57
+ require_paths:
58
+ - lib
59
+ required_ruby_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: 1.9.2
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ requirements: []
70
+ rubyforge_project:
71
+ rubygems_version: 2.7.7
72
+ signing_key:
73
+ specification_version: 4
74
+ summary: Slimpay client
75
+ test_files: []