rents 1.0.0 → 1.0.1
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 +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
|
+

|
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
|