vindi 0.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 +7 -0
- data/README.md +75 -0
- data/Rakefile +22 -0
- data/lib/vindi.rb +4 -0
- data/lib/vindi/client.rb +15 -0
- data/lib/vindi/configuration.rb +36 -0
- data/lib/vindi/connection.rb +46 -0
- data/lib/vindi/default.rb +63 -0
- data/lib/vindi/error.rb +77 -0
- data/lib/vindi/request.rb +61 -0
- data/lib/vindi/response/raise_error.rb +19 -0
- data/lib/vindi/rest.rb +32 -0
- data/lib/vindi/rest/bill.rb +95 -0
- data/lib/vindi/rest/bill_item.rb +20 -0
- data/lib/vindi/rest/charge.rb +94 -0
- data/lib/vindi/rest/customer.rb +61 -0
- data/lib/vindi/rest/discount.rb +45 -0
- data/lib/vindi/rest/import_batch.rb +38 -0
- data/lib/vindi/rest/invoice.rb +50 -0
- data/lib/vindi/rest/issue.rb +40 -0
- data/lib/vindi/rest/merchant.rb +41 -0
- data/lib/vindi/rest/merchant_user.rb +71 -0
- data/lib/vindi/rest/message.rb +41 -0
- data/lib/vindi/rest/movement.rb +21 -0
- data/lib/vindi/rest/notification.rb +103 -0
- data/lib/vindi/rest/payment_method.rb +29 -0
- data/lib/vindi/rest/payment_profile.rb +54 -0
- data/lib/vindi/rest/period.rb +52 -0
- data/lib/vindi/rest/plan.rb +51 -0
- data/lib/vindi/rest/product.rb +51 -0
- data/lib/vindi/rest/product_item.rb +54 -0
- data/lib/vindi/rest/role.rb +18 -0
- data/lib/vindi/rest/subscription.rb +85 -0
- data/lib/vindi/rest/transaction.rb +53 -0
- data/lib/vindi/rest/usage.rb +32 -0
- data/lib/vindi/rest/user.rb +17 -0
- data/lib/vindi/version.rb +3 -0
- data/vindi.gemspec +21 -0
- metadata +121 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6b6a28994b0f5108cc5c11887854de4db578eddb
|
4
|
+
data.tar.gz: 9c77d88efb1d79de6abc352bc25a2a633a920a5d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 7b470b6602760c7787bcd5b53b77651cff3e0043f368a8a2d02cefa54d88fb967f67beeeb71f59fafca5c94553383b744fad104c78b6e67b9edf51b3d554baf4
|
7
|
+
data.tar.gz: c22faffb32cfe3dd9be3cf98916c6eb8c1495e64fad00faa46d41bcb2d19035f6a21dfc2d097ad2d3432ca7428d3df637d44eda12614673f64c80e2f27065963
|
data/README.md
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
# Vindi Ruby
|
2
|
+
|
3
|
+
Ruby toolkit para a [API de Recorrência][link-introducao-api] da [Vindi][link-vindi].
|
4
|
+
|
5
|
+
[](https://semaphoreci.com/vindi/vindi-ruby)
|
6
|
+
|
7
|
+
## Instalação
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'vindi-ruby'
|
11
|
+
```
|
12
|
+
|
13
|
+
And then execute:
|
14
|
+
|
15
|
+
$ bundle
|
16
|
+
|
17
|
+
Or install it yourself as:
|
18
|
+
|
19
|
+
$ gem install vindi-ruby
|
20
|
+
|
21
|
+
## Uso
|
22
|
+
Os métodos da API estão disponíveis atraves dos métodos da instancia de um cliente
|
23
|
+
|
24
|
+
```ruby
|
25
|
+
client = Vindi::Client.new(key: 'VINDI_KEY')
|
26
|
+
```
|
27
|
+
|
28
|
+
### Consumindo recursos
|
29
|
+
Os recursos são fornecidos através do objeto de retono e os campos retornados podem ser acessados pela notação de attributos de um Hash
|
30
|
+
|
31
|
+
```ruby
|
32
|
+
# Listando planos de um lojista
|
33
|
+
client.list_plans
|
34
|
+
# => [{:id=>15, :name=>"My awesome plan", :interval=>"months", :interval_count=>1, :billing_trigger_type=>"beginning_of_period" ...
|
35
|
+
|
36
|
+
# Consultando um plano
|
37
|
+
client.plan(15)
|
38
|
+
# => {:id=>15, :name=>"My awesome plan", :interval=>"months", :interval_count=>1, :billing_trigger_type=>"beginning_of_period" ...
|
39
|
+
|
40
|
+
# Atualizando um plano
|
41
|
+
client.update_plan(15, {name: 'My plan'})
|
42
|
+
# => {:id=>15, :name=>"My plan", :interval=>"months", :interval_count=>1, :billing_trigger_type=>"beginning_of_period" ...
|
43
|
+
|
44
|
+
# Criando um plano
|
45
|
+
client.create_plan({name: 'My new plan', interval: 'months', interval_count: 1, billing_trigger_type: 'beginning_of_period'})
|
46
|
+
```
|
47
|
+
|
48
|
+
### Acessando respostas HTTP
|
49
|
+
|
50
|
+
```ruby
|
51
|
+
client.list_plans
|
52
|
+
response = client.last_response
|
53
|
+
status = response.status
|
54
|
+
```
|
55
|
+
|
56
|
+
## Dúvidas
|
57
|
+
Caso necessite de informações sobre a plataforma ou API, por favor acesse o [Atendimento Vindi](http://atendimento.vindi.com.br/hc/pt-br).
|
58
|
+
|
59
|
+
## Segurança
|
60
|
+
Se você descobrir qualquer questão relacionada a segurança, por favor, envie um e-mail para seguranca@vindi.com.br ao invés de utilizar os issues.
|
61
|
+
|
62
|
+
## Changelog
|
63
|
+
Todas as informações sobre cada release podem ser consultadas em [CHANGELOG.md](CHANGELOG.md).
|
64
|
+
|
65
|
+
## Créditos
|
66
|
+
- [Vindi][link-author]
|
67
|
+
- [Todos os Contribuidores][link-contributors]
|
68
|
+
|
69
|
+
## Licença
|
70
|
+
GNU GPLv3. Por favor, veja o [Arquivo de Licença](license.txt) para mais informações.
|
71
|
+
|
72
|
+
[link-vindi]: https://www.vindi.com.br
|
73
|
+
[link-introducao-api]: http://atendimento.vindi.com.br/hc/pt-br/articles/203020644-Introdu%C3%A7%C3%A3o-%C3%A0-API-de-Recorr%C3%AAncia
|
74
|
+
[link-author]: https://github.com/vindi
|
75
|
+
[link-contributors]: https://github.com/vindi/vindi-ruby/graphs/contributors
|
data/Rakefile
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'bundler'
|
2
|
+
Bundler::GemHelper.install_tasks
|
3
|
+
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
RSpec::Core::RakeTask.new(:spec)
|
6
|
+
|
7
|
+
task test: :spec
|
8
|
+
task default: :spec
|
9
|
+
|
10
|
+
namespace :doc do
|
11
|
+
begin
|
12
|
+
require 'yard'
|
13
|
+
YARD::Rake::YardocTask.new do |task|
|
14
|
+
task.files = ['README.md', 'lib/**/*.rb']
|
15
|
+
task.options = [
|
16
|
+
'--output-dir', 'doc/yard',
|
17
|
+
'--markup', 'markdown',
|
18
|
+
]
|
19
|
+
end
|
20
|
+
rescue LoadError
|
21
|
+
end
|
22
|
+
end
|
data/lib/vindi.rb
ADDED
data/lib/vindi/client.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'vindi/configuration'
|
2
|
+
require 'vindi/request'
|
3
|
+
require 'vindi/rest'
|
4
|
+
|
5
|
+
module Vindi
|
6
|
+
class Client
|
7
|
+
include Vindi::Configuration
|
8
|
+
include Vindi::Request
|
9
|
+
include Vindi::Rest
|
10
|
+
|
11
|
+
def initialize(options = {}, &block)
|
12
|
+
setup && configure(options, &block)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'vindi/default'
|
2
|
+
|
3
|
+
module Vindi
|
4
|
+
|
5
|
+
# Configuration options for Client
|
6
|
+
module Configuration
|
7
|
+
attr_reader :user_agent, :middleware, :connection_options
|
8
|
+
attr_accessor :key, :default_media_type, :api_endpoint
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def keys
|
12
|
+
@keys ||= [:key, :default_media_type, :api_endpoint, :user_agent,
|
13
|
+
:middleware, :connection_options]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# Initializes a new Client object
|
18
|
+
#
|
19
|
+
# @param options [Hash]
|
20
|
+
# @return [Vindi::Client]
|
21
|
+
def configure(options = {})
|
22
|
+
options.each do |key, value|
|
23
|
+
instance_variable_set("@#{key}", value)
|
24
|
+
end
|
25
|
+
|
26
|
+
yield(self) if block_given?
|
27
|
+
end
|
28
|
+
|
29
|
+
def reset!
|
30
|
+
Vindi::Configuration.keys.each do |key|
|
31
|
+
instance_variable_set("@#{key}", Vindi::Default.options[key])
|
32
|
+
end
|
33
|
+
end
|
34
|
+
alias :setup :reset!
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module Vindi
|
5
|
+
module Connection
|
6
|
+
|
7
|
+
# HTTP client for the Vindi API
|
8
|
+
#
|
9
|
+
# @return Faraday::Connection
|
10
|
+
def http_client
|
11
|
+
@http_client = Faraday.new(api_endpoint, connection_options) do |http|
|
12
|
+
http.request(:multipart)
|
13
|
+
http.request(:url_encoded)
|
14
|
+
http.basic_auth(@key, '')
|
15
|
+
http.builder.use @middleware
|
16
|
+
http.adapter(Faraday.default_adapter)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def last_response
|
21
|
+
@last_response if defined?(@last_response)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def request(method, path, data, options = {})
|
27
|
+
@last_response = response = http_client
|
28
|
+
.public_send(method, URI::Parser.new.escape(path.to_s), data, options)
|
29
|
+
|
30
|
+
response.body.empty? ? '' : symbolize_keys!(JSON.parse(response.body))
|
31
|
+
end
|
32
|
+
|
33
|
+
def symbolize_keys!(object)
|
34
|
+
if object.is_a?(Array)
|
35
|
+
object.each_with_index do |val, index|
|
36
|
+
object[index] = symbolize_keys!(val)
|
37
|
+
end
|
38
|
+
elsif object.is_a?(Hash)
|
39
|
+
object.keys.each do |key|
|
40
|
+
object[key.to_sym] = symbolize_keys!(object.delete(key))
|
41
|
+
end
|
42
|
+
end
|
43
|
+
object
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'vindi/response/raise_error'
|
2
|
+
require 'vindi/version'
|
3
|
+
|
4
|
+
module Vindi
|
5
|
+
module Default
|
6
|
+
# Default API endpoint
|
7
|
+
API_ENDPOINT = 'https://app.vindi.com.br/api/v1/'.freeze
|
8
|
+
|
9
|
+
# Default media type
|
10
|
+
MEDIA_TYPE = 'application/vnd.api+json'.freeze
|
11
|
+
|
12
|
+
# Default User Agent header string
|
13
|
+
USER_AGENT = "Vindi-Ruby/#{Vindi::VERSION}".freeze
|
14
|
+
|
15
|
+
MIDDLEWARE = Vindi::Response::RaiseError
|
16
|
+
|
17
|
+
class << self
|
18
|
+
|
19
|
+
# Default api endpoint string from ENV or API_ENDPOINT
|
20
|
+
# @return [String]
|
21
|
+
def api_endpoint
|
22
|
+
ENV['VINDI_API_ENDPOINT'] || API_ENDPOINT
|
23
|
+
end
|
24
|
+
|
25
|
+
# Default media type header string from ENV or MEDIA_TYPE
|
26
|
+
# @return [String]
|
27
|
+
def default_media_type
|
28
|
+
ENV['VINDI_MEDIA_TYPE'] || MEDIA_TYPE
|
29
|
+
end
|
30
|
+
|
31
|
+
# Default user KEY string from ENV
|
32
|
+
# @return [String]
|
33
|
+
def key
|
34
|
+
ENV['VINDI_KEY']
|
35
|
+
end
|
36
|
+
|
37
|
+
# Default User-Agent header string from ENV or USER_AGENT
|
38
|
+
# @return [String]
|
39
|
+
def user_agent
|
40
|
+
ENV['VINDI_USER_AGENT'] || USER_AGENT
|
41
|
+
end
|
42
|
+
|
43
|
+
def middleware
|
44
|
+
MIDDLEWARE
|
45
|
+
end
|
46
|
+
|
47
|
+
def connection_options
|
48
|
+
{
|
49
|
+
headers: {
|
50
|
+
'User-Agent': user_agent
|
51
|
+
}
|
52
|
+
}
|
53
|
+
end
|
54
|
+
|
55
|
+
# Default Settings for Vindi Ruby Gem
|
56
|
+
# @return [Hash]
|
57
|
+
def options
|
58
|
+
Hash[Vindi::Configuration.keys
|
59
|
+
.map{ |key| [key, send(key)] }]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
data/lib/vindi/error.rb
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
module Vindi
|
2
|
+
# Custom error class for rescuing from all Vindi errors
|
3
|
+
class Error < StandardError
|
4
|
+
|
5
|
+
# Raised when Vindi returns a 4xx HTTP status code
|
6
|
+
ClientError = Class.new(self)
|
7
|
+
|
8
|
+
# Raised when Vindi returns the HTTP status code 400
|
9
|
+
BadRequest = Class.new(ClientError)
|
10
|
+
|
11
|
+
# Raised when Vindi returns the HTTP status code 401
|
12
|
+
Unauthorized = Class.new(ClientError)
|
13
|
+
|
14
|
+
# Raised when Vindi returns the HTTP status code 403
|
15
|
+
Forbidden = Class.new(ClientError)
|
16
|
+
|
17
|
+
# Raised when Vindi returns the HTTP status code 404
|
18
|
+
NotFound = Class.new(ClientError)
|
19
|
+
|
20
|
+
# Raised when Vindi returns the HTTP status code 406
|
21
|
+
NotAcceptable = Class.new(ClientError)
|
22
|
+
|
23
|
+
# Raised when Vindi returns the HTTP status code 422
|
24
|
+
UnprocessableEntity = Class.new(ClientError)
|
25
|
+
|
26
|
+
# Raised when Vindi returns the HTTP status code 429
|
27
|
+
TooManyRequests = Class.new(ClientError)
|
28
|
+
|
29
|
+
# Raised when Vindi returns a 5xx HTTP status code
|
30
|
+
ServerError = Class.new(self)
|
31
|
+
|
32
|
+
# Raised when Vindi returns the HTTP status code 502
|
33
|
+
BadGateway = Class.new(ServerError)
|
34
|
+
|
35
|
+
# Raised when Vindi returns the HTTP status code 503
|
36
|
+
ServiceUnavailable = Class.new(ServerError)
|
37
|
+
|
38
|
+
# Raised when Vindi returns the HTTP status code 504
|
39
|
+
GatewayTimeout = Class.new(ServerError)
|
40
|
+
|
41
|
+
class << self
|
42
|
+
def from_response(response)
|
43
|
+
status = response.status.to_i
|
44
|
+
|
45
|
+
if klass = case status
|
46
|
+
when 400 then Vindi::Error::BadRequest
|
47
|
+
when 401 then Vindi::Error::Unauthorized
|
48
|
+
when 403 then Vindi::Error::Forbidden
|
49
|
+
when 404 then Vindi::Error::NotFound
|
50
|
+
when 406 then Vindi::Error::NotAcceptable
|
51
|
+
when 415 then Vindi::Error::UnsupportedMediaType
|
52
|
+
when 422 then Vindi::Error::UnprocessableEntity
|
53
|
+
when 429 then Vindi::Error::TooManyRequests
|
54
|
+
when 400..499 then Vindi::Error::ClientError
|
55
|
+
when 500 then Vindi::Error::InternalServerError
|
56
|
+
when 502 then Vindi::Error::BadGateway
|
57
|
+
when 503 then Vindi::Error::ServiceUnavailable
|
58
|
+
when 504 then Vindi::Error::GatewayTimeout
|
59
|
+
when 500..599 then Vindi::Error::ServerError
|
60
|
+
end
|
61
|
+
klass.new(response) if klass
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def initialize(response)
|
67
|
+
super(build_error_message(response))
|
68
|
+
end
|
69
|
+
|
70
|
+
def build_error_message(response)
|
71
|
+
return if response.nil?
|
72
|
+
|
73
|
+
message = "#{response[:method].to_s.upcase} "
|
74
|
+
message
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'vindi/connection'
|
2
|
+
|
3
|
+
module Vindi
|
4
|
+
module Request
|
5
|
+
include Vindi::Connection
|
6
|
+
|
7
|
+
# Make a HTTP GET request
|
8
|
+
#
|
9
|
+
# @param url [String] The path, relative to {#api_endpoint}
|
10
|
+
# @param options [Hash] Query and header params for request
|
11
|
+
# @return [Hash]
|
12
|
+
def get(url, options = {})
|
13
|
+
request :get, url, options
|
14
|
+
end
|
15
|
+
|
16
|
+
# Make a HTTP POST request
|
17
|
+
#
|
18
|
+
# @param url [String] The path, relative to {#api_endpoint}
|
19
|
+
# @param options [Hash] Query and header params for request
|
20
|
+
# @return Hash
|
21
|
+
def post(url, options = {})
|
22
|
+
request :post, url, options
|
23
|
+
end
|
24
|
+
|
25
|
+
# Make a HTTP PUT request
|
26
|
+
#
|
27
|
+
# @param url [String] The path, relative to {#api_endpoint}
|
28
|
+
# @param options [Hash] Query and header params for request
|
29
|
+
# @return Hash
|
30
|
+
def put(url, options = {})
|
31
|
+
request :put, url, options
|
32
|
+
end
|
33
|
+
|
34
|
+
# Make a HTTP PATCH request
|
35
|
+
#
|
36
|
+
# @param url [String] The path, relative to {#api_endpoint}
|
37
|
+
# @param options [Hash] Body and header params for request
|
38
|
+
# @return Hash
|
39
|
+
def patch(url, options = {})
|
40
|
+
request :patch, url, options
|
41
|
+
end
|
42
|
+
|
43
|
+
# Make a HTTP DELETE request
|
44
|
+
#
|
45
|
+
# @param url [String] The path, relative to {#api_endpoint}
|
46
|
+
# @param options [Hash] Body and header params for request
|
47
|
+
# @return Hash
|
48
|
+
def delete(url, options = {})
|
49
|
+
request :delete, url, options
|
50
|
+
end
|
51
|
+
|
52
|
+
# Make a HTTP HEAD request
|
53
|
+
#
|
54
|
+
# @param url [String] The path, relative to {#api_endpoint}
|
55
|
+
# @param options [Hash] Body and header params for request
|
56
|
+
# @return Hash
|
57
|
+
def head(url, options = {})
|
58
|
+
request :head, url, options
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'vindi/error'
|
3
|
+
|
4
|
+
module Vindi
|
5
|
+
module Response
|
6
|
+
|
7
|
+
# This class raises exceptions based HTTP status codes retuned by the API
|
8
|
+
class RaiseError < Faraday::Response::Middleware
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def on_complete(response)
|
13
|
+
if error = Vindi::Error.from_response(response)
|
14
|
+
raise error
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/vindi/rest.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
Dir[File.expand_path("../rest/**/*.rb", __FILE__)].each do |file|
|
2
|
+
require file
|
3
|
+
end
|
4
|
+
|
5
|
+
module Vindi
|
6
|
+
module Rest
|
7
|
+
include Vindi::Rest::Plan
|
8
|
+
include Vindi::Rest::Product
|
9
|
+
include Vindi::Rest::Customer
|
10
|
+
include Vindi::Rest::PaymentMethod
|
11
|
+
include Vindi::Rest::Discount
|
12
|
+
include Vindi::Rest::Subscription
|
13
|
+
include Vindi::Rest::ProductItem
|
14
|
+
include Vindi::Rest::Period
|
15
|
+
include Vindi::Rest::Bill
|
16
|
+
include Vindi::Rest::BillItem
|
17
|
+
include Vindi::Rest::Charge
|
18
|
+
include Vindi::Rest::Transaction
|
19
|
+
include Vindi::Rest::PaymentProfile
|
20
|
+
include Vindi::Rest::Usage
|
21
|
+
include Vindi::Rest::Movement
|
22
|
+
include Vindi::Rest::Invoice
|
23
|
+
include Vindi::Rest::Message
|
24
|
+
include Vindi::Rest::ImportBatch
|
25
|
+
include Vindi::Rest::Notification
|
26
|
+
include Vindi::Rest::Issue
|
27
|
+
include Vindi::Rest::Merchant
|
28
|
+
include Vindi::Rest::Role
|
29
|
+
include Vindi::Rest::User
|
30
|
+
include Vindi::Rest::MerchantUser
|
31
|
+
end
|
32
|
+
end
|