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 +7 -0
- data/.gitignore +2 -0
- data/lib/slimpay/error.rb +9 -0
- data/lib/slimpay_client.rb +205 -0
- data/slimpay_client.gemspec +19 -0
- metadata +75 -0
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,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: []
|