perata-sdk 0.2.0 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e636bdc22e1cf5cb23c0d1b1f93f3154362b6ada48dcc56e780847de36f578f7
4
- data.tar.gz: a29323a115321b71d10b6031b7170c6fda3e7d23e192ba1463e29afcc519d51f
3
+ metadata.gz: 4ce69fcabc384e43ef9a829c444ced516fb44a64d82daf72fd4d8b7b9ad6dab9
4
+ data.tar.gz: 43e9821c4ad1cd264bfe59fb8b3fdafabf6d44d31755d067e1e626d21fba753a
5
5
  SHA512:
6
- metadata.gz: 5b88a3f310e277f889147d95801565704b294120a2d6dc0f9809ced9c214753c8638b3b50e5deeb94fb2c785d811fe1759de836246b41e7652352c7aa4b92532
7
- data.tar.gz: b3f215424482e048dc8c24ef20262938d3f1808795573f91c9c4684529f3bd17b6992625d484106c5ebc40f92c258cdfe1a6319839e244926e7f10842300dd08
6
+ metadata.gz: 74f8e47737ccb716ff1c9d18354c97eb7260f016ade4b5c4ee4d5b3caa4ba4b676f943c1cf60d089f33eb76f63b5f724983edacc1179021e4cc2b2031adea0c2
7
+ data.tar.gz: f3e2c307da8270f8db0c41d28b1d4b78bd283e65a83c63d6e6d789c466c65be78976f7c1ce080be492f01e9fd189c1cfefee3c08f3daae08d3caf2507f773f92
data/README.md CHANGED
@@ -22,20 +22,27 @@ end
22
22
 
23
23
  | Serviço | Métodos |
24
24
  |---|---|
25
- | `perata.checkouts` | `create` |
25
+ | `perata.benefits` | `create`, `delete`, `get`, `list`, `list_iter`, `list_grants`, `list_grants_iter`, `update` |
26
+ | `perata.checkout_links` | `create`, `delete`, `get`, `list`, `list_iter`, `update` |
27
+ | `perata.checkouts` | `create`, `get`, `update` |
26
28
  | `perata.customer_sessions` | `create` |
27
- | `perata.customers` | `create`, `get`, `list`, `list_iter` |
28
- | `perata.orders` | `list`, `list_iter` |
29
+ | `perata.customers` | `create`, `delete`, `get`, `get_external`, `get_state`, `list`, `list_iter`, `update`, `update_external` |
30
+ | `perata.discounts` | `create`, `delete`, `get`, `list`, `list_iter`, `update` |
31
+ | `perata.disputes` | `get`, `list`, `list_iter` |
32
+ | `perata.events` | `list`, `list_iter` |
33
+ | `perata.meters` | `get`, `list`, `list_iter` |
34
+ | `perata.orders` | `get`, `get_invoice`, `get_receipt`, `list`, `list_iter` |
29
35
  | `perata.payment_methods` | `detach`, `list`, `list_iter` |
30
36
  | `perata.payments` | `get`, `list`, `list_iter` |
31
37
  | `perata.prices` | `create`, `list`, `list_iter` |
32
- | `perata.products` | `create`, `get`, `list`, `list_iter` |
33
- | `perata.refunds` | `create` |
34
- | `perata.subscriptions` | `cancel`, `get`, `list`, `list_iter` |
38
+ | `perata.products` | `archive`, `create`, `get`, `list`, `list_iter`, `update` |
39
+ | `perata.refunds` | `create`, `list`, `list_iter` |
40
+ | `perata.subscriptions` | `cancel`, `get`, `list`, `list_iter`, `update` |
41
+ | `perata.webhooks` | `create_endpoint`, `delete_endpoint`, `get_endpoint`, `list_deliveries`, `list_deliveries_iter`, `list_endpoints`, `list_endpoints_iter`, `update_endpoint` |
35
42
 
36
43
  Os modelos são objetos imutáveis com leitores em snake_case (`payment.amount_cents`). O corpo de uma escrita é a classe de parâmetros do método (`Perata::ProductsCreateParams.new(name: "Curso")`) ou um `Hash` com os mesmos nomes; um campo opcional não informado fica fora do JSON. Os métodos `_iter` devolvem um `Enumerator` que percorre todas as páginas a partir de `page:` (ou recebem um bloco).
37
44
 
38
- As escritas aceitam `idempotency_key:`, e todas aceitam `api_key:` para usar a chave de outra organização numa chamada. `Perata::Client.new` aceita `base_url:`, `timeout:` (30 segundos) e `transport:`.
45
+ As escritas aceitam `idempotency_key:`, e todas aceitam `api_key:` para usar a chave de outra organização numa chamada. `Perata::Client.new` aceita `base_url:`, `timeout:` (30 segundos) e `transport:`. Um POST sem chave de idempotência é enviado com uma `Idempotency-Key` própria (UUID v4 aleatório, uma por chamada); passe a sua para poder repetir a mesma operação com segurança.
39
46
 
40
47
  ## Erros
41
48
 
@@ -56,4 +63,4 @@ A assinatura é a do Standard Webhooks (`webhook-id`, `webhook-timestamp`, `webh
56
63
 
57
64
  O evento é tipado: um tipo para cada dado que o webhook carrega (`OrderWebhookEvent` traz um `Order`, `DisputeWebhookEvent` a disputa, `IdentifiersWebhookEvent` os identificadores…), e o `type` diz o que aconteceu; um tipo que esta versão do SDK ainda não conhece chega como `UnknownWebhookEvent`, com os dados como vieram. Durante a rotação do segredo o cabeçalho traz mais de uma assinatura, e basta uma conferir. `Perata.verify_webhook_signature` só confere a assinatura.
58
65
 
59
- Versão do SDK: 0.2.0 · contrato da API: 0.1.0
66
+ Versão do SDK: 0.3.0 · contrato da API: 0.1.0
data/lib/perata/client.rb CHANGED
@@ -2,8 +2,10 @@
2
2
 
3
3
  # Code generated by sdk/generator. DO NOT EDIT.
4
4
 
5
+ require "ipaddr"
5
6
  require "json"
6
7
  require "net/http"
8
+ require "securerandom"
7
9
  require "uri"
8
10
 
9
11
  module Perata
@@ -30,12 +32,24 @@ module Perata
30
32
  # product = perata.products.create({ name: "Curso" })
31
33
  # perata.products.list_iter { |product| puts product.name }
32
34
  class Client
35
+ # @return [BenefitsService]
36
+ attr_reader :benefits
37
+ # @return [CheckoutLinksService]
38
+ attr_reader :checkout_links
33
39
  # @return [CheckoutsService]
34
40
  attr_reader :checkouts
35
41
  # @return [CustomerSessionsService]
36
42
  attr_reader :customer_sessions
37
43
  # @return [CustomersService]
38
44
  attr_reader :customers
45
+ # @return [DiscountsService]
46
+ attr_reader :discounts
47
+ # @return [DisputesService]
48
+ attr_reader :disputes
49
+ # @return [EventsService]
50
+ attr_reader :events
51
+ # @return [MetersService]
52
+ attr_reader :meters
39
53
  # @return [OrdersService]
40
54
  attr_reader :orders
41
55
  # @return [PaymentMethodsService]
@@ -50,15 +64,26 @@ module Perata
50
64
  attr_reader :refunds
51
65
  # @return [SubscriptionsService]
52
66
  attr_reader :subscriptions
67
+ # @return [WebhooksService]
68
+ attr_reader :webhooks
53
69
 
70
+ # The base URL must be https; http is accepted only for localhost,
71
+ # 127.0.0.0/8 and ::1, and any other raises ArgumentError.
54
72
  def initialize(api_key, base_url: DEFAULT_BASE_URL, timeout: 30, transport: NetHTTPTransport.new)
55
73
  @api_key = api_key
56
74
  @base_url = base_url.chomp("/")
75
+ check_base_url!(@base_url)
57
76
  @timeout = timeout
58
77
  @transport = transport
78
+ @benefits = BenefitsService.new(self)
79
+ @checkout_links = CheckoutLinksService.new(self)
59
80
  @checkouts = CheckoutsService.new(self)
60
81
  @customer_sessions = CustomerSessionsService.new(self)
61
82
  @customers = CustomersService.new(self)
83
+ @discounts = DiscountsService.new(self)
84
+ @disputes = DisputesService.new(self)
85
+ @events = EventsService.new(self)
86
+ @meters = MetersService.new(self)
62
87
  @orders = OrdersService.new(self)
63
88
  @payment_methods = PaymentMethodsService.new(self)
64
89
  @payments = PaymentsService.new(self)
@@ -66,6 +91,7 @@ module Perata
66
91
  @products = ProductsService.new(self)
67
92
  @refunds = RefundsService.new(self)
68
93
  @subscriptions = SubscriptionsService.new(self)
94
+ @webhooks = WebhooksService.new(self)
69
95
  end
70
96
 
71
97
  # Calls the API and answers what it wrapped in +data+; a refusal raises
@@ -84,11 +110,35 @@ module Perata
84
110
  data = JSON.generate(body)
85
111
  headers["Content-Type"] = "application/json"
86
112
  end
113
+ # A POST is sent with a key of its own, one a call, unless the caller gave one.
114
+ idempotency_key = SecureRandom.uuid if (idempotency_key.nil? || idempotency_key.empty?) && method == "POST"
87
115
  headers["Idempotency-Key"] = idempotency_key if idempotency_key && !idempotency_key.empty?
88
116
  status, response_headers, raw = @transport.call(method, url, headers, data, @timeout)
89
117
  raise Error.from_response(status, response_headers, raw) if status >= 300
90
118
 
119
+ return nil if status == 204
120
+
91
121
  JSON.parse(raw).fetch("data")
92
122
  end
123
+
124
+ private
125
+
126
+ def check_base_url!(base_url)
127
+ uri = begin
128
+ URI.parse(base_url)
129
+ rescue URI::InvalidURIError
130
+ nil
131
+ end
132
+ scheme = uri&.scheme.to_s.downcase
133
+ host = uri&.hostname.to_s.downcase
134
+ loopback = host == "localhost" || begin
135
+ IPAddr.new(host).loopback?
136
+ rescue IPAddr::Error
137
+ false
138
+ end
139
+ return if scheme == "https" || (scheme == "http" && loopback)
140
+
141
+ raise ArgumentError, "perata: the base URL must be https (http is accepted only for localhost, 127.0.0.0/8 and ::1), so the API key is never sent in clear text"
142
+ end
93
143
  end
94
144
  end