rents 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Contributing.md +203 -0
- data/Gemfile +3 -2
- data/README.md +1 -0
- data/lib/generators/templates/rents.rb +3 -3
- data/lib/rents/array.rb +6 -0
- data/lib/rents/config/enums/brands.yml +45 -0
- data/lib/rents/config/enums/currencies.yml +35 -0
- data/lib/rents/config/enums/payment_methods.yml +20 -0
- data/lib/rents/config/enums/recurrence_periods.yml +18 -0
- data/lib/rents/config/enums/transaction_codes.yml +31 -0
- data/lib/rents/config/proxy.example.yml +4 -0
- data/lib/rents/connection.rb +87 -12
- data/lib/rents/transaction.rb +61 -5
- data/lib/rents/version.rb +1 -1
- data/lib/rents.rb +43 -5
- data/modeling/API Routes.png +0 -0
- data/rents.gemspec +1 -1
- data/spec/file_helper.rb +42 -0
- data/spec/helpers.rb +12 -0
- data/spec/rents/status_spec.rb +3 -0
- data/spec/rents/transaction_spec.rb +662 -247
- metadata +22 -11
- /data/{modelagem → modeling}/Sequence - APIClient.asta +0 -0
- /data/{modelagem → modeling}/Structure - ClassDiagram.asta +0 -0
- /data/{modelagem → modeling}/WorkFlow - LocalGEM.asta +0 -0
- /data/{modelagem → modeling}/WorkFlow - LocalGEM.png +0 -0
- /data/{modelagem → modeling}/useful_files/card_operators/cielo/test_cards.txt +0 -0
- /data/{modelagem → modeling}/useful_files/card_operators/cielo/test_keys.txt +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f0fc5c6931a5592f03ae84ebffe92209de8ac213
|
4
|
+
data.tar.gz: 0c00189dfb43eaa7af06a0e7c77d6d840fd470ab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dd42c1000b76dca1cea172603c83e3a4a1c3032e8e847368a4f97f272309e7a666cc99f77bca3d81dc34cdee18b7d7dc2ddd97ff100ef40ab8f09f3b28e896e9
|
7
|
+
data.tar.gz: b6e7b104b9420228868fd1d231aec649dba7d44258899415e632b6958d4e2e8c85262be595716e7d2ee66b0dc753eef7349529a484d0a5bbb8c85918ca4a5c80
|
data/.gitignore
CHANGED
data/Contributing.md
ADDED
@@ -0,0 +1,203 @@
|
|
1
|
+
# API Routes
|
2
|
+
![API Routes](https://raw.githubusercontent.com/PageRentS/rents-sdk-ruby/master/modeling/API%20Routes.png)
|
3
|
+
|
4
|
+
# Simple workflow overview
|
5
|
+
|
6
|
+
1. Every class which consumes API must have the `Connection` class as parent
|
7
|
+
2. `Connection` implement the HTTP RestClient methods
|
8
|
+
3. Every message between the Developer app & the RentS framework must be a HashMap/Dictionary
|
9
|
+
4. The object attrs are dynamic, based on the Hash received as constructor param
|
10
|
+
5. Instantiation example
|
11
|
+
```ruby
|
12
|
+
@transaction = Rents::Transaction.new({
|
13
|
+
card:{
|
14
|
+
brand: 'visa',
|
15
|
+
cvv: '123',
|
16
|
+
expiration_month: '05',
|
17
|
+
expiration_year: '2018',
|
18
|
+
number: '4012001037141112',
|
19
|
+
holder: Faker::Name.name,
|
20
|
+
},
|
21
|
+
recurrence_period_id: Rents.enum[:recurrence_periods][:daily],
|
22
|
+
amount: amount
|
23
|
+
})
|
24
|
+
|
25
|
+
# Charge
|
26
|
+
@resp = @transaction.charge_store
|
27
|
+
|
28
|
+
# same as
|
29
|
+
@transaction.charge_store
|
30
|
+
@transaction.resp
|
31
|
+
```
|
32
|
+
6. The `charge_store` implementation:
|
33
|
+
```ruby
|
34
|
+
def charge_store full_resp=false
|
35
|
+
# method which setup this attrs to HTTP param, like sold_items array to GET params
|
36
|
+
custom_http_params
|
37
|
+
|
38
|
+
# dynamic path (the conection just read it path to send the HTTP request, so it is a config before perform)
|
39
|
+
self.path = 'transactions/store'
|
40
|
+
|
41
|
+
# full_resp = need the full HTTP Response (with code, headers...)
|
42
|
+
# if not full_resp return just Hash/Dictionary resp
|
43
|
+
full_resp ? self.resp = self.post_request : self.resp = self.post_json_request
|
44
|
+
|
45
|
+
# return it received resp
|
46
|
+
self.resp
|
47
|
+
end
|
48
|
+
```
|
49
|
+
7. It `Connection.new.post_request` implementation:
|
50
|
+
|
51
|
+
```ruby
|
52
|
+
def post_request
|
53
|
+
# URL configured on the Connection child class method & the params received from the constructor
|
54
|
+
RestClient.post self.url_requested, self.request_params
|
55
|
+
end
|
56
|
+
```
|
57
|
+
8. It `Connection.new.post_json` implementation
|
58
|
+
```ruby
|
59
|
+
resp = RestClient.post(self.url_requested, self.request_params)
|
60
|
+
to_hash_with_symbols(resp)
|
61
|
+
|
62
|
+
# Used on all the _json requests
|
63
|
+
def to_hash_with_symbols json
|
64
|
+
JSON.parse(json).it_keys_to_sym
|
65
|
+
end
|
66
|
+
```
|
67
|
+
|
68
|
+
|
69
|
+
# What the user (developer) see
|
70
|
+
|
71
|
+
1. A file which the developer config his environment:
|
72
|
+
|
73
|
+
```ruby
|
74
|
+
# The RentS give to you 2 diferent apps, the production & the ratification (homolog) app
|
75
|
+
if developement_env || test_env
|
76
|
+
# Example using direct declaration (bad way, but must be possible)
|
77
|
+
Rents.app_id = 'YOUR_APP_ID'
|
78
|
+
Rents.secret_key = 'YOUR_APP_SECRET_KEY'
|
79
|
+
|
80
|
+
# TODO: Uncomment test_env if you want to test using RentS default_global app
|
81
|
+
# Rents.test_env = true
|
82
|
+
|
83
|
+
# TODO: Uncomment debugger if you have an RentS instance on your machine
|
84
|
+
# Rents.debug = true
|
85
|
+
else
|
86
|
+
# Production app
|
87
|
+
# Example using the secret config file
|
88
|
+
# REMEMBER to tell the client to not versioned those config files, like the SECRETs on the RAILS
|
89
|
+
# Extensions config files:
|
90
|
+
# (Ruby => .YML, PHP => .INI, JavaScript => JSON, ObjectiveC => .PLIST, C# => .DLL, Java => .XML)
|
91
|
+
Rents.app_id = Rails.application.secrets.rents['app_id']
|
92
|
+
Rents.secret_key = Rails.application.secrets.rents['app_id']
|
93
|
+
```
|
94
|
+
|
95
|
+
2. The Secret YML example
|
96
|
+
|
97
|
+
```yml
|
98
|
+
production:
|
99
|
+
rents:
|
100
|
+
app_id: # TODO copy it from your PRODUCTION APP RentS page
|
101
|
+
app_secret_key: # TODO copy it from your PRODUCTION APP RentS page
|
102
|
+
```
|
103
|
+
|
104
|
+
3. ENUMs You can add ENUMs file or just get it from the API, but to improve the performance, create those files:
|
105
|
+
* Those [__files__](https://github.com/PageRentS/rents-sdk-ruby/tree/master/lib/rents/config/enums) are not visible to the Developer, but he can check if & easy access through a `Rents.enums`
|
106
|
+
* __`brands.yml`__
|
107
|
+
```yml
|
108
|
+
brands:
|
109
|
+
# SampleObj
|
110
|
+
- id: 0
|
111
|
+
name: Nil
|
112
|
+
username: nil
|
113
|
+
|
114
|
+
# VISA
|
115
|
+
- id: 1
|
116
|
+
name: VISA
|
117
|
+
username: visa
|
118
|
+
```
|
119
|
+
* __`currencies.yml`__
|
120
|
+
```yml
|
121
|
+
currencies:
|
122
|
+
- id: 0
|
123
|
+
name: Nil
|
124
|
+
acronym: nil$
|
125
|
+
iso_code: NIL
|
126
|
+
iso_number: 000
|
127
|
+
|
128
|
+
# Real
|
129
|
+
- id: 1
|
130
|
+
name: Real
|
131
|
+
acronym: R$
|
132
|
+
iso_code: BRL
|
133
|
+
iso_number: 986
|
134
|
+
```
|
135
|
+
* __`proxy.yml`__
|
136
|
+
|
137
|
+
```yml
|
138
|
+
login: c1280361
|
139
|
+
password: 12345678
|
140
|
+
host: proxy.oranization.com
|
141
|
+
port: 80
|
142
|
+
```
|
143
|
+
|
144
|
+
# How this work in the core
|
145
|
+
1. The Rents is a Module/Namespace which have static methods (config), like:
|
146
|
+
* `bolean test_env`
|
147
|
+
* `bolean debug`
|
148
|
+
* `enum` (return a HashMap based on the config files: .ini, .yml, .xml, .plist...)
|
149
|
+
* `load_config_file` (return it file to the enum method: `load_yml`, `load_xml`, `load_ini`....)
|
150
|
+
* `proxy` (setup the proxy to the requests, useful for intranets & server apps in shared servers)
|
151
|
+
|
152
|
+
2. `Connection.rb`, parent class for all API consumer classes, RestClient (GET, POST, PUT, DELETE)
|
153
|
+
* It must have both methods: `http_method_json` & `http_method`, `setup_default_app`
|
154
|
+
* `setup_default_app`: setup a `Rents.app_id` & `Rents.secret_key` & `this.recurrent_rid`
|
155
|
+
* `setup_default_app` also setup the auth: `this.auth = {app_id:Rents.app_id, secret_key:Rents.secret_key}`
|
156
|
+
* using actions: `this.path = 'global_app'` & `this.path = 'global_subscription'`
|
157
|
+
```ruby
|
158
|
+
# SetUp a default app if Rents.test_env == true
|
159
|
+
def setup_default_app
|
160
|
+
# setup test_app path
|
161
|
+
self.path = 'global_app'
|
162
|
+
|
163
|
+
# Get the App & setup config
|
164
|
+
app = get_json_request[:app]
|
165
|
+
Rents.app_id = app[:id]
|
166
|
+
Rents.secret_key = app[:secret]
|
167
|
+
|
168
|
+
# Get the GlobalRecurrent & setup/config
|
169
|
+
self.path = 'global_subscription'
|
170
|
+
recurrence = get_json_request
|
171
|
+
self.recurrent_rid = recurrence[:rid]
|
172
|
+
|
173
|
+
return puts 'Please run: rails g rents:install' if Rents.app_id.nil? || Rents.secret_key.nil?
|
174
|
+
self.auth = {app_id:Rents.app_id, secret_key:Rents.secret_key}
|
175
|
+
self.request_params.merge!(auth:self.auth)
|
176
|
+
end
|
177
|
+
```
|
178
|
+
* `http_method_json`: return a simple HashMap
|
179
|
+
* `http_method`: return the complet request resp, with code (200, 404, 403...)
|
180
|
+
* `setup_attrs(params)` params = constructor_params, it method iterate the hash attrs & set it as obj attr
|
181
|
+
```ruby
|
182
|
+
# Dynamic attributtes
|
183
|
+
params.each do |key, value|
|
184
|
+
next unless key.to_s.index('[]').nil?
|
185
|
+
self.class.__send__(:attr_accessor, :"#{key}")
|
186
|
+
self.__send__("#{key}=", value)
|
187
|
+
end
|
188
|
+
```
|
189
|
+
* Methods: `this.get_json`, `this.post_json`, `this.get`, `this.post`
|
190
|
+
* Attributtes (the first option is __`test_env`__ the second is production):
|
191
|
+
```ruby
|
192
|
+
attr_accessor :auth = {app_id: '', app_secret: ''}
|
193
|
+
attr_accessor :path = ''
|
194
|
+
attr_accessor :domain = 'localhost:7000' || 'apprents.herokuapp.com'
|
195
|
+
attr_accessor :protocol = 'http' || 'https'
|
196
|
+
attr_accessor :end_point = this.protocol + "://" + this.domain + "api"
|
197
|
+
attr_accessor :api_version = 'v1'
|
198
|
+
attr_accessor :recurrent_rid = Rents.global_recurrence || rents_id,remote_id (rid)
|
199
|
+
attr_accessor :request_params = hash_received_on_constructor
|
200
|
+
attr_accessor :end_point_versioned = this.protocol + "://" + this.domain + "api" + this.api_version
|
201
|
+
```
|
202
|
+
|
203
|
+
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -22,6 +22,7 @@ TODO: Write usage instructions here
|
|
22
22
|
|
23
23
|
## Contributing
|
24
24
|
|
25
|
+
0. Check our [__Contributing MarkDown explanation__](https://github.com/PageRentS/rents-sdk-ruby/blob/master/Contributing.md)
|
25
26
|
1. Fork it ( https://github.com/[my-github-username]/rents/fork )
|
26
27
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
27
28
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
@@ -15,7 +15,7 @@ if Rails.env.development? || Rails.env.test?
|
|
15
15
|
# TODO: Uncomment test_env if you want to test using RentS default & global app
|
16
16
|
# Rents.test_env = true
|
17
17
|
# TODO: Uncomment debugger if you have an RentS instance on your machine
|
18
|
-
# Rents.
|
18
|
+
# Rents.debug = true
|
19
19
|
elsif Rails.env.production?
|
20
20
|
# TODO if using Rails 3 or older, put here your PRODUCTION app_id & your secret_key
|
21
21
|
Rents.app_id = ''
|
@@ -23,11 +23,11 @@ elsif Rails.env.production?
|
|
23
23
|
|
24
24
|
# For production remember to keep it false or just remove it
|
25
25
|
Rents.test_env = false
|
26
|
-
Rents.
|
26
|
+
Rents.debug = false
|
27
27
|
end
|
28
28
|
|
29
29
|
# Get your App config if your not using TEST_ENV nor DEBUGGER
|
30
|
-
if (Rents.test_env.nil? && Rents.
|
30
|
+
if (Rents.test_env.nil? && Rents.debug.nil?) || (Rents.test_env == false && Rents.debug == false)
|
31
31
|
if Rails.version[0].to_i >= 4
|
32
32
|
Rents.app_id = Rails.application.secrets.rents['app_id']
|
33
33
|
Rents.secret_key = Rails.application.secrets.rents['app_secret_key']
|
data/lib/rents/array.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
brands:
|
2
|
+
# SampleObj
|
3
|
+
- id: 0
|
4
|
+
name: Nil
|
5
|
+
username: nil
|
6
|
+
|
7
|
+
# VISA
|
8
|
+
- id: 1
|
9
|
+
name: VISA
|
10
|
+
username: visa
|
11
|
+
|
12
|
+
# MasterCard
|
13
|
+
- id: 2
|
14
|
+
name: MasterCard
|
15
|
+
username: mastercard
|
16
|
+
|
17
|
+
# Diners Club
|
18
|
+
- id: 3
|
19
|
+
name: Diners Club
|
20
|
+
username: diners
|
21
|
+
|
22
|
+
# Discover
|
23
|
+
- id: 4
|
24
|
+
name: Discover
|
25
|
+
username: discover
|
26
|
+
|
27
|
+
# Elo
|
28
|
+
- id: 5
|
29
|
+
name: Elo
|
30
|
+
username: elo
|
31
|
+
|
32
|
+
# American Express
|
33
|
+
- id: 6
|
34
|
+
name: American Express
|
35
|
+
username: amex
|
36
|
+
|
37
|
+
# JCB
|
38
|
+
- id: 7
|
39
|
+
name: JCB
|
40
|
+
username: jcb
|
41
|
+
|
42
|
+
# Aura
|
43
|
+
- id: 8
|
44
|
+
name: Aura
|
45
|
+
username: aura
|
@@ -0,0 +1,35 @@
|
|
1
|
+
currencies:
|
2
|
+
# SampleObj
|
3
|
+
- id: 0
|
4
|
+
name: Nil
|
5
|
+
acronym: nil$
|
6
|
+
iso_code: NIL
|
7
|
+
iso_number: 000
|
8
|
+
|
9
|
+
# Real
|
10
|
+
- id: 1
|
11
|
+
name: Real
|
12
|
+
acronym: R$
|
13
|
+
iso_code: BRL
|
14
|
+
iso_number: 986
|
15
|
+
|
16
|
+
# Euro
|
17
|
+
- id: 2
|
18
|
+
name: Euro
|
19
|
+
acronym: €
|
20
|
+
iso_code: EUR
|
21
|
+
iso_number: 978
|
22
|
+
|
23
|
+
# US Dollar
|
24
|
+
- id: 3
|
25
|
+
name: US Dollar
|
26
|
+
acronym: US$
|
27
|
+
iso_code: USD
|
28
|
+
iso_number: 840
|
29
|
+
|
30
|
+
# CAD Dollar
|
31
|
+
- id: 4
|
32
|
+
name: CAD Dollar
|
33
|
+
acronym: CAD$
|
34
|
+
iso_code: CAD
|
35
|
+
iso_number: 124
|
@@ -0,0 +1,20 @@
|
|
1
|
+
payment_methods:
|
2
|
+
# SampleObj
|
3
|
+
- id: 0
|
4
|
+
name: Nil
|
5
|
+
|
6
|
+
# Credit
|
7
|
+
- id: 1
|
8
|
+
name: Credit
|
9
|
+
|
10
|
+
# Debit
|
11
|
+
- id: 2
|
12
|
+
name: Debit
|
13
|
+
|
14
|
+
# Installments shop
|
15
|
+
- id: 3
|
16
|
+
name: Installments shop
|
17
|
+
|
18
|
+
# Installments administrator
|
19
|
+
- id: 4
|
20
|
+
name: Installments administrator
|
@@ -0,0 +1,31 @@
|
|
1
|
+
transaction_code:
|
2
|
+
0:
|
3
|
+
status: pending
|
4
|
+
msg: Transação Criada
|
5
|
+
1:
|
6
|
+
status: pending
|
7
|
+
msg: Transação em Andamento
|
8
|
+
2:
|
9
|
+
status: pending
|
10
|
+
msg: Transação Autenticada
|
11
|
+
3:
|
12
|
+
status: error
|
13
|
+
msg: Transação não Autenticada
|
14
|
+
4:
|
15
|
+
status: pending
|
16
|
+
msg: Transação Autorizada
|
17
|
+
5:
|
18
|
+
status: error
|
19
|
+
msg: Transação não Autorizada
|
20
|
+
6:
|
21
|
+
status: charged
|
22
|
+
msg: Transação Capturada
|
23
|
+
9:
|
24
|
+
status: error
|
25
|
+
msg: Transação Cancelada
|
26
|
+
10:
|
27
|
+
status: pending
|
28
|
+
msg: Transação em Autenticação
|
29
|
+
12:
|
30
|
+
status: pending
|
31
|
+
msg: Transação em Cancelamento
|
data/lib/rents/connection.rb
CHANGED
@@ -4,8 +4,10 @@ module Rents
|
|
4
4
|
attr_accessor :auth
|
5
5
|
attr_accessor :path
|
6
6
|
attr_accessor :domain
|
7
|
+
attr_accessor :protocol
|
7
8
|
attr_accessor :end_point
|
8
9
|
attr_accessor :api_version
|
10
|
+
attr_accessor :recurrent_rid
|
9
11
|
attr_accessor :request_params
|
10
12
|
attr_accessor :end_point_versioned
|
11
13
|
|
@@ -13,20 +15,30 @@ module Rents
|
|
13
15
|
def initialize(params = {})
|
14
16
|
# An work around added to prevent a lot of changes
|
15
17
|
params = params.merge({test_env:true}) if Rents.test_env
|
16
|
-
params = params.merge({
|
18
|
+
params = params.merge({debug:true}) if Rents.debug
|
17
19
|
|
18
20
|
# Static part
|
19
21
|
self.request_params = {transaction:params}
|
20
|
-
setup_attrs(params)
|
21
22
|
setup_config
|
22
23
|
self.domain = 'apprents.herokuapp.com' # 'rents.pagerenter.com.br'
|
23
|
-
|
24
|
+
|
25
|
+
# If using test or Debug it is not production
|
26
|
+
if params[:debug] || params[:test]
|
27
|
+
self.protocol = 'http'
|
28
|
+
self.domain = 'localhost:7000'
|
29
|
+
else
|
30
|
+
self.protocol = 'https'
|
31
|
+
self.domain = 'apprents.herokuapp.com'
|
32
|
+
end
|
33
|
+
|
24
34
|
self.api_version = 'v1'
|
25
|
-
self.end_point = "
|
26
|
-
self.end_point_versioned = "
|
35
|
+
self.end_point = "#{self.protocol}://#{self.domain}/api"
|
36
|
+
self.end_point_versioned = "#{self.protocol}://#{self.domain}/api/#{self.api_version}"
|
27
37
|
|
28
38
|
# Dynamic env
|
29
39
|
setup_default_app if params[:test_env]
|
40
|
+
setup_attrs(params)
|
41
|
+
self.recurrent_rid = params[:rid] unless params[:rid].nil?
|
30
42
|
end
|
31
43
|
|
32
44
|
# Full URL for the last request
|
@@ -34,27 +46,54 @@ module Rents
|
|
34
46
|
"#{self.end_point}/#{self.api_version}/#{self.path}"
|
35
47
|
end
|
36
48
|
|
37
|
-
#
|
38
|
-
# GET
|
49
|
+
# GET http
|
39
50
|
def get_request
|
40
51
|
RestClient.get self.url_requested
|
41
52
|
end
|
42
53
|
|
54
|
+
# GET json
|
43
55
|
def get_json_request
|
44
|
-
|
56
|
+
resp = RestClient.get(self.url_requested)
|
57
|
+
to_hash_with_symbols(resp).it_keys_to_sym
|
45
58
|
end
|
46
59
|
|
47
|
-
# POST
|
60
|
+
# POST http
|
48
61
|
def post_request
|
49
62
|
RestClient.post self.url_requested, self.request_params
|
50
63
|
end
|
51
64
|
|
65
|
+
# POST json
|
52
66
|
def post_json_request
|
53
|
-
|
67
|
+
resp = RestClient.post(self.url_requested, self.request_params)
|
68
|
+
to_hash_with_symbols(resp)
|
69
|
+
end
|
70
|
+
|
71
|
+
# PUT http
|
72
|
+
def put_request
|
73
|
+
RestClient.put self.url_requested, self.request_params
|
74
|
+
end
|
75
|
+
|
76
|
+
# PUT json
|
77
|
+
def put_json_request
|
78
|
+
resp = RestClient.put(self.url_requested, self.request_params)
|
79
|
+
to_hash_with_symbols(resp)
|
80
|
+
end
|
81
|
+
|
82
|
+
# DELETE http
|
83
|
+
def delete_request
|
84
|
+
auth = self.request_params[:auth]
|
85
|
+
RestClient.delete self.url_requested, app_id:auth[:app_id], secret_key:auth[:secret_key]
|
86
|
+
end
|
87
|
+
|
88
|
+
# DELETE json
|
89
|
+
def delete_json_request
|
90
|
+
auth = self.request_params[:auth]
|
91
|
+
resp = RestClient.delete self.url_requested, auth_app_id:auth[:app_id], auth_secret_key:auth[:secret_key]
|
92
|
+
to_hash_with_symbols(resp)
|
54
93
|
end
|
55
94
|
|
56
95
|
# CALLBACKs
|
57
|
-
|
96
|
+
protected
|
58
97
|
# Config Attrs
|
59
98
|
def setup_config
|
60
99
|
self.auth = {app_id:Rents.app_id, secret_key:Rents.secret_key}
|
@@ -71,6 +110,11 @@ module Rents
|
|
71
110
|
Rents.app_id = app[:id]
|
72
111
|
Rents.secret_key = app[:secret]
|
73
112
|
|
113
|
+
# Get the GlobalRecurrent & setup/config
|
114
|
+
self.path = 'global_subscription'
|
115
|
+
recurrence = get_json_request
|
116
|
+
self.recurrent_rid = recurrence[:rid]
|
117
|
+
|
74
118
|
return puts 'Please run: rails g rents:install' if Rents.app_id.nil? || Rents.secret_key.nil?
|
75
119
|
self.auth = {app_id:Rents.app_id, secret_key:Rents.secret_key}
|
76
120
|
self.request_params.merge!(auth:self.auth)
|
@@ -86,12 +130,43 @@ module Rents
|
|
86
130
|
end
|
87
131
|
end
|
88
132
|
|
89
|
-
#
|
133
|
+
# HTTP requests must have '[]' on it key name to send Array
|
90
134
|
def custom_http_params
|
135
|
+
setup_format_and_validators
|
136
|
+
|
91
137
|
return if self.sold_items.nil?
|
92
138
|
self.sold_items.each_with_index do |sold_item, i|
|
93
139
|
self.request_params[:transaction]["sold_items[#{i}]"] = sold_item
|
94
140
|
end
|
95
141
|
end
|
142
|
+
|
143
|
+
# Validate params to prevent errors like BAD Request & format values like value to Operator format
|
144
|
+
def setup_format_and_validators
|
145
|
+
validate_operator_format
|
146
|
+
end
|
147
|
+
|
148
|
+
# if necessary convert amount to operator value
|
149
|
+
def validate_operator_format
|
150
|
+
# prevent fatal error
|
151
|
+
return if self.amount.nil?
|
152
|
+
|
153
|
+
# aux vars
|
154
|
+
amount_str = self.amount.to_s
|
155
|
+
format_regex = /[.,]/
|
156
|
+
|
157
|
+
# if nil (it is not formatted, so it is not necessary to convert it format)
|
158
|
+
unless amount_str.match(format_regex).nil?
|
159
|
+
return if self.request_params.nil? || self.request_params[:transaction].nil?
|
160
|
+
self.amount = Rents::Currency.to_operator_str(self.amount)
|
161
|
+
self.request_params[:transaction][:amount] = self.amount
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
# Return the JSON in a Hash with it keys in symbols
|
166
|
+
def to_hash_with_symbols json
|
167
|
+
hashed = JSON.parse(json)
|
168
|
+
hashed.is_a?(Array) ? hashed.each_with_index { |hash, i| hashed[i] = hash.it_keys_to_sym } : hashed.it_keys_to_sym
|
169
|
+
hashed
|
170
|
+
end
|
96
171
|
end
|
97
172
|
end
|
data/lib/rents/transaction.rb
CHANGED
@@ -45,21 +45,77 @@ module Rents
|
|
45
45
|
self.resp
|
46
46
|
end
|
47
47
|
|
48
|
-
# TODO create charge works like a buy_store
|
49
48
|
# POST /api/transactions
|
50
49
|
def charge_store full_resp=false
|
51
50
|
custom_http_params
|
52
51
|
|
53
52
|
# dynamic path (it is written when a specific method use it)
|
54
|
-
self.path =
|
53
|
+
self.path = 'transactions/store'
|
55
54
|
|
56
55
|
# using json_request because need only the answer (do not use something like it HTTP Code)
|
57
|
-
self.resp = self.
|
58
|
-
|
56
|
+
full_resp ? self.resp = self.post_request : self.resp = self.post_json_request
|
57
|
+
|
58
|
+
# return it received resp
|
59
|
+
self.resp
|
60
|
+
end
|
61
|
+
|
62
|
+
# Update the recurrence amount
|
63
|
+
def update_subscription rid=nil, full_resp=false
|
64
|
+
# SetUp
|
65
|
+
self.recurrent_rid = rid if rid
|
66
|
+
self.path = "transactions/#{self.recurrent_rid}/subscription"
|
67
|
+
|
68
|
+
# Perform the request
|
69
|
+
full_resp ? self.resp = self.put_request : self.resp = self.put_json_request
|
70
|
+
|
71
|
+
# return it received resp
|
72
|
+
self.resp
|
73
|
+
end
|
74
|
+
|
75
|
+
# Stop a recurrence based on it transaction rid
|
76
|
+
def unsubscribe rid=nil, full_resp=false
|
77
|
+
# SetUp
|
78
|
+
self.recurrent_rid = rid if rid
|
79
|
+
self.path = "transactions/#{self.recurrent_rid}/subscription/unsubscribe"
|
80
|
+
|
81
|
+
# Perform the request
|
82
|
+
full_resp ? self.resp = self.delete_request : self.resp = self.delete_json_request
|
83
|
+
|
84
|
+
# return it received resp
|
85
|
+
self.resp
|
86
|
+
end
|
87
|
+
|
88
|
+
# Return the payments executed for the purchase passed
|
89
|
+
def payment_history rid=nil, full_resp=false
|
90
|
+
# SetUp
|
91
|
+
self.recurrent_rid = rid if rid
|
92
|
+
self.path = "transactions/#{self.recurrent_rid}/subscription/payment_history"
|
93
|
+
self.path = "#{self.path}#{self.request_params.it_keys_to_get_param}"
|
94
|
+
|
95
|
+
# Perform the request
|
96
|
+
full_resp ? self.resp = self.get_request : self.resp = self.get_json_request
|
97
|
+
|
98
|
+
# return it received resp
|
99
|
+
self.resp
|
100
|
+
end
|
101
|
+
|
102
|
+
# Check if a subscription is up-to-date or have any pending
|
103
|
+
def up_to_date rid=nil, full_resp=false
|
104
|
+
# SetUp
|
105
|
+
self.recurrent_rid = rid if rid
|
106
|
+
|
107
|
+
# Create/customize the path & add the auth as param
|
108
|
+
self.path = "transactions/#{self.recurrent_rid}/subscription/up-to-date"
|
109
|
+
self.path = "#{self.path}#{self.request_params.it_keys_to_get_param}"
|
110
|
+
|
111
|
+
# Perform the request
|
112
|
+
full_resp ? self.resp = self.get_request : self.resp = self.get_json_request
|
113
|
+
|
114
|
+
# return it received resp
|
59
115
|
self.resp
|
60
116
|
end
|
61
117
|
|
62
|
-
# ================
|
118
|
+
# ================ STATIC methods ================
|
63
119
|
# GET /api/transactions/:rid by the rid passed
|
64
120
|
def self.find rid
|
65
121
|
end
|