dinie-sdk-sandbox 1.1.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/CHANGELOG.md +40 -0
- data/LICENSE +21 -0
- data/README.md +280 -0
- data/lib/dinie/generated/api_version.rb +8 -0
- data/lib/dinie/generated/client.rb +96 -0
- data/lib/dinie/generated/errors/registry.rb +40 -0
- data/lib/dinie/generated/events/base.rb +11 -0
- data/lib/dinie/generated/events/credit_offer.rb +56 -0
- data/lib/dinie/generated/events/customer_created.rb +42 -0
- data/lib/dinie/generated/events/customer_denied.rb +39 -0
- data/lib/dinie/generated/events/customer_kyc_updated.rb +36 -0
- data/lib/dinie/generated/events/customer_status.rb +48 -0
- data/lib/dinie/generated/events/deserializers.rb +35 -0
- data/lib/dinie/generated/events/loan_active.rb +35 -0
- data/lib/dinie/generated/events/loan_created.rb +38 -0
- data/lib/dinie/generated/events/loan_payment_received.rb +46 -0
- data/lib/dinie/generated/events/loan_processing.rb +37 -0
- data/lib/dinie/generated/events/loan_signature_received.rb +48 -0
- data/lib/dinie/generated/events/loan_status.rb +73 -0
- data/lib/dinie/generated/events.rb +4 -0
- data/lib/dinie/generated/resources/banks.rb +25 -0
- data/lib/dinie/generated/resources/biometrics.rb +27 -0
- data/lib/dinie/generated/resources/credentials.rb +56 -0
- data/lib/dinie/generated/resources/credit_offers.rb +59 -0
- data/lib/dinie/generated/resources/customers.rb +200 -0
- data/lib/dinie/generated/resources/loans.rb +70 -0
- data/lib/dinie/generated/resources/webhook_endpoints.rb +97 -0
- data/lib/dinie/generated/resources.rb +9 -0
- data/lib/dinie/generated/types/bank.rb +17 -0
- data/lib/dinie/generated/types/biometrics_session.rb +16 -0
- data/lib/dinie/generated/types/biometrics_session_exchange_response.rb +23 -0
- data/lib/dinie/generated/types/credential.rb +52 -0
- data/lib/dinie/generated/types/credit_offer.rb +62 -0
- data/lib/dinie/generated/types/customer.rb +46 -0
- data/lib/dinie/generated/types/customer_bank_account.rb +33 -0
- data/lib/dinie/generated/types/ids.rb +18 -0
- data/lib/dinie/generated/types/kyc.rb +458 -0
- data/lib/dinie/generated/types/kyc_attachment_response.rb +16 -0
- data/lib/dinie/generated/types/loan.rb +51 -0
- data/lib/dinie/generated/types/money.rb +4 -0
- data/lib/dinie/generated/types/simulation.rb +35 -0
- data/lib/dinie/generated/types/transaction.rb +43 -0
- data/lib/dinie/generated/types/webhook_endpoint.rb +52 -0
- data/lib/dinie/generated/types/webhook_secret_rotation.rb +17 -0
- data/lib/dinie/generated/types.rb +18 -0
- data/lib/dinie/runtime/errors.rb +295 -0
- data/lib/dinie/runtime/http.rb +327 -0
- data/lib/dinie/runtime/idempotency.rb +34 -0
- data/lib/dinie/runtime/logger.rb +326 -0
- data/lib/dinie/runtime/model.rb +162 -0
- data/lib/dinie/runtime/multipart.rb +77 -0
- data/lib/dinie/runtime/paginator.rb +164 -0
- data/lib/dinie/runtime/rate_limit.rb +150 -0
- data/lib/dinie/runtime/request_options.rb +112 -0
- data/lib/dinie/runtime/retry.rb +74 -0
- data/lib/dinie/runtime/token_manager.rb +341 -0
- data/lib/dinie/runtime/webhooks.rb +194 -0
- data/lib/dinie/version.rb +7 -0
- data/lib/dinie.rb +37 -0
- data/sig/_external/faraday.rbs +44 -0
- data/sig/dinie/generated/client.rbs +45 -0
- data/sig/dinie/generated/errors/registry.rbs +40 -0
- data/sig/dinie/generated/events/base.rbs +17 -0
- data/sig/dinie/generated/events/credit_offer.rbs +33 -0
- data/sig/dinie/generated/events/customer_created.rbs +27 -0
- data/sig/dinie/generated/events/customer_denied.rbs +25 -0
- data/sig/dinie/generated/events/customer_kyc_updated.rbs +21 -0
- data/sig/dinie/generated/events/customer_status.rbs +26 -0
- data/sig/dinie/generated/events/deserializers.rbs +9 -0
- data/sig/dinie/generated/events/loan_active.rbs +20 -0
- data/sig/dinie/generated/events/loan_created.rbs +23 -0
- data/sig/dinie/generated/events/loan_payment_received.rbs +28 -0
- data/sig/dinie/generated/events/loan_processing.rbs +23 -0
- data/sig/dinie/generated/events/loan_signature_received.rbs +30 -0
- data/sig/dinie/generated/events/loan_status.rbs +40 -0
- data/sig/dinie/generated/resources/banks.rbs +15 -0
- data/sig/dinie/generated/resources/credentials.rbs +21 -0
- data/sig/dinie/generated/resources/credit_offers.rbs +19 -0
- data/sig/dinie/generated/resources/customers.rbs +58 -0
- data/sig/dinie/generated/resources/loans.rbs +26 -0
- data/sig/dinie/generated/resources/webhook_endpoints.rbs +35 -0
- data/sig/dinie/generated/types/bank.rbs +12 -0
- data/sig/dinie/generated/types/biometrics_session.rbs +11 -0
- data/sig/dinie/generated/types/credential.rbs +26 -0
- data/sig/dinie/generated/types/credit_offer.rbs +24 -0
- data/sig/dinie/generated/types/customer.rbs +25 -0
- data/sig/dinie/generated/types/customer_bank_account.rbs +26 -0
- data/sig/dinie/generated/types/enums.rbs +66 -0
- data/sig/dinie/generated/types/ids.rbs +21 -0
- data/sig/dinie/generated/types/kyc/attachment.rbs +14 -0
- data/sig/dinie/generated/types/kyc/common.rbs +42 -0
- data/sig/dinie/generated/types/kyc/requirements.rbs +117 -0
- data/sig/dinie/generated/types/kyc/submitted.rbs +21 -0
- data/sig/dinie/generated/types/kyc/uploads.rbs +24 -0
- data/sig/dinie/generated/types/loan.rbs +32 -0
- data/sig/dinie/generated/types/money.rbs +6 -0
- data/sig/dinie/generated/types/simulation.rbs +28 -0
- data/sig/dinie/generated/types/transaction.rbs +24 -0
- data/sig/dinie/generated/types/webhook_endpoint.rbs +38 -0
- data/sig/dinie/runtime/errors.rbs +106 -0
- data/sig/dinie/runtime/http.rbs +59 -0
- data/sig/dinie/runtime/idempotency.rbs +15 -0
- data/sig/dinie/runtime/logger.rbs +89 -0
- data/sig/dinie/runtime/model.rbs +51 -0
- data/sig/dinie/runtime/multipart.rbs +25 -0
- data/sig/dinie/runtime/paginator.rbs +50 -0
- data/sig/dinie/runtime/rate_limit.rbs +46 -0
- data/sig/dinie/runtime/request_options.rbs +35 -0
- data/sig/dinie/runtime/retry.rbs +29 -0
- data/sig/dinie/runtime/token_manager.rbs +51 -0
- data/sig/dinie/runtime/webhooks.rbs +31 -0
- data/sig/dinie/version.rbs +7 -0
- metadata +316 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../../runtime/multipart"
|
|
4
|
+
require_relative "../../runtime/paginator"
|
|
5
|
+
require_relative "../types/biometrics_session"
|
|
6
|
+
require_relative "../types/credit_offer"
|
|
7
|
+
require_relative "../types/customer"
|
|
8
|
+
require_relative "../types/customer_bank_account"
|
|
9
|
+
require_relative "../types/kyc"
|
|
10
|
+
require_relative "../types/kyc_attachment_response"
|
|
11
|
+
|
|
12
|
+
module Dinie
|
|
13
|
+
module Resources
|
|
14
|
+
# Operations on the customers resource.
|
|
15
|
+
class Customers
|
|
16
|
+
def initialize(http)
|
|
17
|
+
@http = http
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Register a new customer
|
|
21
|
+
#
|
|
22
|
+
# Register a new customer in `creating` status, idempotent on CPF
|
|
23
|
+
#
|
|
24
|
+
# @param fields [Hash] Request body fields.
|
|
25
|
+
# @param request_options [Hash] Request options.
|
|
26
|
+
# @return [Object]
|
|
27
|
+
def create(request_options: {}, **fields)
|
|
28
|
+
body = Customer.serialize_create(**fields)
|
|
29
|
+
raw = @http.request(method: :post, path: "/customers", body:, request_options:)
|
|
30
|
+
Customer.deserialize(raw)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Create a biometrics capture session
|
|
34
|
+
#
|
|
35
|
+
# Generate a single-use bootstrap code for the customer-facing biometrics flow. The response includes a `session_url` the partner can embed or redirect to — the kyc-app reads the code from the URL and exchanges it for a scoped session token via `POST /biometrics/session-exchange`.
|
|
36
|
+
#
|
|
37
|
+
# @param id [String] Identificador único do cliente
|
|
38
|
+
# @param fields [Hash] Request body fields.
|
|
39
|
+
# @param request_options [Hash] Request options.
|
|
40
|
+
# @return [Object]
|
|
41
|
+
def create_biometrics_session(id, request_options: {}, **fields)
|
|
42
|
+
body = fields
|
|
43
|
+
raw = @http.request(method: :post, path: "/customers/#{id}/biometrics", body:, request_options:)
|
|
44
|
+
BiometricsSession.deserialize(raw)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# List customers
|
|
48
|
+
#
|
|
49
|
+
# List and search customers with optional filters for `cpf`, `external_id`, and `status`
|
|
50
|
+
#
|
|
51
|
+
# @param fields [Hash] Request body fields.
|
|
52
|
+
# @param request_options [Hash] Request options.
|
|
53
|
+
# @return [Object]
|
|
54
|
+
def list(limit: Internal::OMIT, starting_after: Internal::OMIT, request_options: {}, **filters)
|
|
55
|
+
fetch_page = lambda do |cursor|
|
|
56
|
+
query = { limit:, starting_after: cursor || starting_after, **filters }
|
|
57
|
+
.reject { |_key, value| Internal.omitted?(value) }
|
|
58
|
+
body = @http.request(method: :get, path: "/customers", query:, request_options:)
|
|
59
|
+
{ data: body[:data].map { |raw| Customer.deserialize(raw) }, has_more: body[:has_more] }
|
|
60
|
+
end
|
|
61
|
+
Dinie::Page.from_fetch(fetch_page)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Retrieve a customer
|
|
65
|
+
#
|
|
66
|
+
# Return the full customer object including registration data, status, and KYC progress
|
|
67
|
+
#
|
|
68
|
+
# @param id [String] Identificador único do cliente
|
|
69
|
+
# @param request_options [Hash] Request options.
|
|
70
|
+
# @return [Object]
|
|
71
|
+
def retrieve(id, request_options: {})
|
|
72
|
+
raw = @http.request(method: :get, path: "/customers/#{id}", request_options:)
|
|
73
|
+
Customer.deserialize(raw)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Get customer bank account
|
|
77
|
+
#
|
|
78
|
+
# Return the bank account currently linked to this customer, if one exists.
|
|
79
|
+
#
|
|
80
|
+
# @param id [String] Identificador único do cliente
|
|
81
|
+
# @param request_options [Hash] Request options.
|
|
82
|
+
# @return [Object]
|
|
83
|
+
def retrieve_bank_account(id, request_options: {})
|
|
84
|
+
raw = @http.request(method: :get, path: "/customers/#{id}/bank-account", request_options:)
|
|
85
|
+
CustomerBankAccount.deserialize(raw)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Submit documents for KYC review
|
|
89
|
+
#
|
|
90
|
+
# Signal that all KYC documents have been uploaded and are ready for review. Submits documents to the verification pipeline. Also handles resubmission after document corrections.
|
|
91
|
+
#
|
|
92
|
+
# @param id [String] Identificador único do cliente
|
|
93
|
+
# @param request_options [Hash] Request options.
|
|
94
|
+
# @return [Object]
|
|
95
|
+
def start_kyc_review(id, request_options: {})
|
|
96
|
+
@http.request(method: :post, path: "/customers/#{id}/kyc-review", request_options:)
|
|
97
|
+
nil
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Update customer data
|
|
101
|
+
#
|
|
102
|
+
# Update customer fields such as email or phone; `cpf`, `cnpj`, `name`, `trading_name`, and `external_id` are read-only
|
|
103
|
+
#
|
|
104
|
+
# @param id [String] Identificador único do cliente
|
|
105
|
+
# @param fields [Hash] Request body fields.
|
|
106
|
+
# @param request_options [Hash] Request options.
|
|
107
|
+
# @return [Object]
|
|
108
|
+
def update(id, request_options: {}, **fields)
|
|
109
|
+
body = Customer.serialize_update(**fields)
|
|
110
|
+
raw = @http.request(method: :patch, path: "/customers/#{id}", body:, request_options:)
|
|
111
|
+
Customer.deserialize(raw)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Create or update customer bank account
|
|
115
|
+
#
|
|
116
|
+
# Create or update the bank account linked to this customer. This endpoint is available to biometrics session tokens so the kyc-app can collect disbursement bank data.
|
|
117
|
+
#
|
|
118
|
+
# @param id [String] Identificador único do cliente
|
|
119
|
+
# @param fields [Hash] Request body fields.
|
|
120
|
+
# @param request_options [Hash] Request options.
|
|
121
|
+
# @return [Object]
|
|
122
|
+
def upsert_bank_account(id, request_options: {}, **fields)
|
|
123
|
+
body = CustomerBankAccount.serialize_upsert_bank_account(**fields)
|
|
124
|
+
raw = @http.request(method: :post, path: "/customers/#{id}/bank-account", body:, request_options:)
|
|
125
|
+
CustomerBankAccount.deserialize(raw)
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def credit_offers
|
|
129
|
+
@credit_offers ||= CreditOffers.new(@http)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def kyc_attachments
|
|
133
|
+
@kyc_attachments ||= KycAttachments.new(@http)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
# Operations on the credit offers resource.
|
|
137
|
+
class CreditOffers
|
|
138
|
+
def initialize(http)
|
|
139
|
+
@http = http
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# List credit offers for a customer
|
|
143
|
+
#
|
|
144
|
+
# List credit offers for a specific customer, filterable by `status`
|
|
145
|
+
#
|
|
146
|
+
# @param customer_id [String] Identificador único do cliente
|
|
147
|
+
# @param fields [Hash] Request body fields.
|
|
148
|
+
# @param request_options [Hash] Request options.
|
|
149
|
+
# @return [Object]
|
|
150
|
+
def list(customer_id, limit: Internal::OMIT, starting_after: Internal::OMIT, request_options: {}, **filters)
|
|
151
|
+
path = "/customers/#{customer_id}/credit-offers"
|
|
152
|
+
fetch_page = lambda do |cursor|
|
|
153
|
+
query = { limit:, starting_after: cursor || starting_after, **filters }
|
|
154
|
+
.reject { |_key, value| Internal.omitted?(value) }
|
|
155
|
+
body = @http.request(method: :get, path:, query:, request_options:)
|
|
156
|
+
{ data: body[:data].map { |raw| CreditOffer.deserialize(raw) }, has_more: body[:has_more] }
|
|
157
|
+
end
|
|
158
|
+
Dinie::Page.from_fetch(fetch_page)
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# Operations on the kyc attachments resource.
|
|
163
|
+
class KycAttachments
|
|
164
|
+
def initialize(http)
|
|
165
|
+
@http = http
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
# Upload a KYC attachment
|
|
169
|
+
#
|
|
170
|
+
# Upload a KYC attachment for the customer via `multipart/form-data`. For document requirements, send a `file`. For data-type requirements (e.g. email), send a `value` instead.
|
|
171
|
+
#
|
|
172
|
+
# @param customer_id [String] Identificador único do cliente
|
|
173
|
+
# @param fields [Hash] Request body fields.
|
|
174
|
+
# @param request_options [Hash] Request options.
|
|
175
|
+
# @return [Object]
|
|
176
|
+
def create(customer_id, request_options: {}, **upload)
|
|
177
|
+
form = Dinie.serialize_kyc_upload(**upload)
|
|
178
|
+
body = Dinie::Internal::Multipart.new(fields: form.fields, file: form.file)
|
|
179
|
+
raw = @http.request(method: :post, path: "/customers/#{customer_id}/kyc-attachments", body:, request_options:)
|
|
180
|
+
KycAttachmentResponse.deserialize(raw)
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
# Upload a KYC selfie
|
|
184
|
+
#
|
|
185
|
+
# Session-only upload of a selfie for biometric validation. Counterpart of the polymorphic `/kyc-attachments` route, dedicated to selfies: `evidence_type` (`selfie`) and `attachment_type` (`photo`) are implicit, so the partner only supplies `requirement_id` (`selfie_{subject_id}`) and the `file`. Requires a session token bound to the customer — a partner bearer is denied (403), even with `kyc:upload`.
|
|
186
|
+
#
|
|
187
|
+
# @param customer_id [String] Identificador único do cliente
|
|
188
|
+
# @param fields [Hash] Request body fields.
|
|
189
|
+
# @param request_options [Hash] Request options.
|
|
190
|
+
# @return [Object]
|
|
191
|
+
def upload_selfie(customer_id, request_options: {}, **fields)
|
|
192
|
+
body = fields
|
|
193
|
+
raw = @http.request(method: :post, path: "/customers/#{customer_id}/kyc-attachments/selfie", body:,
|
|
194
|
+
request_options:)
|
|
195
|
+
KycAttachmentResponse.deserialize(raw)
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../../runtime/paginator"
|
|
4
|
+
require_relative "../types/loan"
|
|
5
|
+
require_relative "../types/transaction"
|
|
6
|
+
|
|
7
|
+
module Dinie
|
|
8
|
+
module Resources
|
|
9
|
+
# Operations on the loans resource.
|
|
10
|
+
class Loans
|
|
11
|
+
def initialize(http)
|
|
12
|
+
@http = http
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Create a loan
|
|
16
|
+
#
|
|
17
|
+
# Create a loan from a credit offer and accepted simulation; the CCB contract is generated synchronously and the loan starts in `awaiting_signatures` status
|
|
18
|
+
#
|
|
19
|
+
# @param fields [Hash] Request body fields.
|
|
20
|
+
# @param request_options [Hash] Request options.
|
|
21
|
+
# @return [Object]
|
|
22
|
+
def create(request_options: {}, **fields)
|
|
23
|
+
body = Loan.serialize_create(**fields)
|
|
24
|
+
raw = @http.request(method: :post, path: "/loans", body:, request_options:)
|
|
25
|
+
Loan.deserialize(raw)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Retrieve a loan
|
|
29
|
+
#
|
|
30
|
+
# Return the full loan object with lifecycle details
|
|
31
|
+
#
|
|
32
|
+
# @param id [String] Identificador único do empréstimo
|
|
33
|
+
# @param request_options [Hash] Request options.
|
|
34
|
+
# @return [Object]
|
|
35
|
+
def retrieve(id, request_options: {})
|
|
36
|
+
raw = @http.request(method: :get, path: "/loans/#{id}", request_options:)
|
|
37
|
+
Loan.deserialize(raw)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def transactions
|
|
41
|
+
@transactions ||= Transactions.new(@http)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Operations on the transactions resource.
|
|
45
|
+
class Transactions
|
|
46
|
+
def initialize(http)
|
|
47
|
+
@http = http
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# List loan transactions
|
|
51
|
+
#
|
|
52
|
+
# List installment transactions for a loan with due dates, amounts, and payment status
|
|
53
|
+
#
|
|
54
|
+
# @param loan_id [String] Identificador único do empréstimo
|
|
55
|
+
# @param request_options [Hash] Request options.
|
|
56
|
+
# @return [Object]
|
|
57
|
+
def list(loan_id, limit: Internal::OMIT, starting_after: Internal::OMIT, request_options: {})
|
|
58
|
+
path = "/loans/#{loan_id}/transactions"
|
|
59
|
+
fetch_page = lambda do |cursor|
|
|
60
|
+
query = { limit:, starting_after: cursor || starting_after }
|
|
61
|
+
.reject { |_key, value| Internal.omitted?(value) }
|
|
62
|
+
body = @http.request(method: :get, path:, query:, request_options:)
|
|
63
|
+
{ data: body[:data].map { |raw| Transaction.deserialize(raw) }, has_more: body[:has_more] }
|
|
64
|
+
end
|
|
65
|
+
Dinie::Page.from_fetch(fetch_page)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../../runtime/paginator"
|
|
4
|
+
require_relative "../types/webhook_endpoint"
|
|
5
|
+
require_relative "../types/webhook_secret_rotation"
|
|
6
|
+
|
|
7
|
+
module Dinie
|
|
8
|
+
module Resources
|
|
9
|
+
# Operations on the webhook endpoints resource.
|
|
10
|
+
class WebhookEndpoints
|
|
11
|
+
def initialize(http)
|
|
12
|
+
@http = http
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Create a webhook endpoint
|
|
16
|
+
#
|
|
17
|
+
# Create a webhook endpoint; the HMAC signing `secret` is returned only in this response
|
|
18
|
+
#
|
|
19
|
+
# @param fields [Hash] Request body fields.
|
|
20
|
+
# @param request_options [Hash] Request options.
|
|
21
|
+
# @return [Object]
|
|
22
|
+
def create(request_options: {}, **fields)
|
|
23
|
+
body = WebhookEndpoint.serialize_create(**fields)
|
|
24
|
+
raw = @http.request(method: :post, path: "/webhooks/endpoints", body:, request_options:)
|
|
25
|
+
WebhookEndpointWithSecret.deserialize(raw)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Delete a webhook endpoint
|
|
29
|
+
#
|
|
30
|
+
# Delete a webhook endpoint and stop all deliveries
|
|
31
|
+
#
|
|
32
|
+
# @param id [String] Identificador único do endpoint de webhook
|
|
33
|
+
# @param request_options [Hash] Request options.
|
|
34
|
+
# @return [Object]
|
|
35
|
+
def delete(id, request_options: {})
|
|
36
|
+
@http.request(method: :delete, path: "/webhooks/endpoints/#{id}", request_options:)
|
|
37
|
+
nil
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# List webhook endpoints
|
|
41
|
+
#
|
|
42
|
+
# List all configured webhook endpoints with URL, subscribed events, and status
|
|
43
|
+
#
|
|
44
|
+
# @param request_options [Hash] Request options.
|
|
45
|
+
# @return [Object]
|
|
46
|
+
def list(limit: Internal::OMIT, starting_after: Internal::OMIT, request_options: {})
|
|
47
|
+
fetch_page = lambda do |cursor|
|
|
48
|
+
query = { limit:, starting_after: cursor || starting_after }
|
|
49
|
+
.reject { |_key, value| Internal.omitted?(value) }
|
|
50
|
+
body = @http.request(method: :get, path: "/webhooks/endpoints", query:, request_options:)
|
|
51
|
+
{ data: body[:data].map { |raw| WebhookEndpoint.deserialize(raw) }, has_more: body[:has_more] }
|
|
52
|
+
end
|
|
53
|
+
Dinie::Page.from_fetch(fetch_page)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Retrieve a webhook endpoint
|
|
57
|
+
#
|
|
58
|
+
# Return details of a specific webhook endpoint including URL, events, and status
|
|
59
|
+
#
|
|
60
|
+
# @param id [String] Identificador único do endpoint de webhook
|
|
61
|
+
# @param request_options [Hash] Request options.
|
|
62
|
+
# @return [Object]
|
|
63
|
+
def retrieve(id, request_options: {})
|
|
64
|
+
raw = @http.request(method: :get, path: "/webhooks/endpoints/#{id}", request_options:)
|
|
65
|
+
WebhookEndpoint.deserialize(raw)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Rotate the signing secret
|
|
69
|
+
#
|
|
70
|
+
# Rotate the HMAC signing secret; the previous secret remains valid for the grace period
|
|
71
|
+
#
|
|
72
|
+
# @param id [String] Identificador único do endpoint de webhook
|
|
73
|
+
# @param fields [Hash] Request body fields.
|
|
74
|
+
# @param request_options [Hash] Request options.
|
|
75
|
+
# @return [Object]
|
|
76
|
+
def rotate_secret(id, request_options: {}, **fields)
|
|
77
|
+
body = fields
|
|
78
|
+
raw = @http.request(method: :post, path: "/webhooks/endpoints/#{id}/rotate-secret", body:, request_options:)
|
|
79
|
+
WebhookSecretRotation.deserialize(raw)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Update a webhook endpoint
|
|
83
|
+
#
|
|
84
|
+
# Update URL, events, description, or status of a webhook endpoint
|
|
85
|
+
#
|
|
86
|
+
# @param id [String] Identificador único do endpoint de webhook
|
|
87
|
+
# @param fields [Hash] Request body fields.
|
|
88
|
+
# @param request_options [Hash] Request options.
|
|
89
|
+
# @return [Object]
|
|
90
|
+
def update(id, request_options: {}, **fields)
|
|
91
|
+
body = WebhookEndpoint.serialize_update(**fields)
|
|
92
|
+
raw = @http.request(method: :patch, path: "/webhooks/endpoints/#{id}", body:, request_options:)
|
|
93
|
+
WebhookEndpoint.deserialize(raw)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "resources/banks"
|
|
4
|
+
require_relative "resources/biometrics"
|
|
5
|
+
require_relative "resources/credentials"
|
|
6
|
+
require_relative "resources/credit_offers"
|
|
7
|
+
require_relative "resources/customers"
|
|
8
|
+
require_relative "resources/loans"
|
|
9
|
+
require_relative "resources/webhook_endpoints"
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../../runtime/model"
|
|
4
|
+
|
|
5
|
+
module Dinie
|
|
6
|
+
class Bank < Internal::Model
|
|
7
|
+
attribute :display_name, :id, :name
|
|
8
|
+
|
|
9
|
+
def self.deserialize(raw)
|
|
10
|
+
new(
|
|
11
|
+
display_name: raw[:display_name],
|
|
12
|
+
id: raw[:id],
|
|
13
|
+
name: raw[:name]
|
|
14
|
+
)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../../runtime/model"
|
|
4
|
+
|
|
5
|
+
module Dinie
|
|
6
|
+
class BiometricsSession < Internal::Model
|
|
7
|
+
attribute :expires_at, :session_url
|
|
8
|
+
|
|
9
|
+
def self.deserialize(raw)
|
|
10
|
+
new(
|
|
11
|
+
expires_at: raw[:expires_at],
|
|
12
|
+
session_url: raw[:session_url]
|
|
13
|
+
)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../../runtime/model"
|
|
4
|
+
|
|
5
|
+
module Dinie
|
|
6
|
+
module BiometricsSessionExchangeResponseTokenType
|
|
7
|
+
BEARER = "bearer"
|
|
8
|
+
ALL = [BEARER].freeze
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
class BiometricsSessionExchangeResponse < Internal::Model
|
|
12
|
+
attribute :access_token, :customer_id, :expires_in, :token_type
|
|
13
|
+
|
|
14
|
+
def self.deserialize(raw)
|
|
15
|
+
new(
|
|
16
|
+
access_token: raw[:access_token],
|
|
17
|
+
customer_id: raw[:customer_id],
|
|
18
|
+
expires_in: raw[:expires_in],
|
|
19
|
+
token_type: raw[:token_type]
|
|
20
|
+
)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../../runtime/model"
|
|
4
|
+
|
|
5
|
+
module Dinie
|
|
6
|
+
module CredentialStatus
|
|
7
|
+
ACTIVE = "active"
|
|
8
|
+
REVOKED = "revoked"
|
|
9
|
+
ALL = [ACTIVE, REVOKED].freeze
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class Credential < Internal::Model
|
|
13
|
+
attribute :client_id, :created_at, :description, :expires_at, :id, :last_used_at, :name, :status, :updated_at
|
|
14
|
+
|
|
15
|
+
def self.deserialize(raw)
|
|
16
|
+
new(
|
|
17
|
+
client_id: raw[:client_id],
|
|
18
|
+
created_at: raw[:created_at],
|
|
19
|
+
description: raw[:description],
|
|
20
|
+
expires_at: raw[:expires_at],
|
|
21
|
+
id: raw[:id],
|
|
22
|
+
last_used_at: raw[:last_used_at],
|
|
23
|
+
name: raw[:name],
|
|
24
|
+
status: raw[:status],
|
|
25
|
+
updated_at: raw[:updated_at]
|
|
26
|
+
)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def self.serialize_create(name:, expires_at: Internal::OMIT)
|
|
30
|
+
{ expires_at:, name: }.reject { |_key, value| Internal.omitted?(value) }
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
class CredentialWithSecret < Credential
|
|
35
|
+
attribute :client_secret
|
|
36
|
+
|
|
37
|
+
def self.deserialize(raw)
|
|
38
|
+
new(
|
|
39
|
+
client_id: raw[:client_id],
|
|
40
|
+
client_secret: raw[:client_secret],
|
|
41
|
+
created_at: raw[:created_at],
|
|
42
|
+
description: raw[:description],
|
|
43
|
+
expires_at: raw[:expires_at],
|
|
44
|
+
id: raw[:id],
|
|
45
|
+
last_used_at: raw[:last_used_at],
|
|
46
|
+
name: raw[:name],
|
|
47
|
+
status: raw[:status],
|
|
48
|
+
updated_at: raw[:updated_at]
|
|
49
|
+
)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../../runtime/model"
|
|
4
|
+
|
|
5
|
+
module Dinie
|
|
6
|
+
class FixedInstallmentCreditOffer < Internal::Model
|
|
7
|
+
attribute :approved_amount, :created_at, :customer_id, :due_date_rule, :external_id, :id, :installments,
|
|
8
|
+
:min_amount, :monthly_interest_rate, :status, :updated_at, :valid_until
|
|
9
|
+
|
|
10
|
+
def self.deserialize(raw)
|
|
11
|
+
new(
|
|
12
|
+
approved_amount: raw[:approved_amount],
|
|
13
|
+
created_at: raw[:created_at],
|
|
14
|
+
customer_id: raw[:customer_id],
|
|
15
|
+
due_date_rule: raw[:due_date_rule],
|
|
16
|
+
external_id: raw[:external_id],
|
|
17
|
+
id: raw[:id],
|
|
18
|
+
installments: raw[:installments],
|
|
19
|
+
min_amount: raw[:min_amount],
|
|
20
|
+
monthly_interest_rate: raw[:monthly_interest_rate],
|
|
21
|
+
status: raw[:status],
|
|
22
|
+
updated_at: raw[:updated_at],
|
|
23
|
+
valid_until: raw[:valid_until]
|
|
24
|
+
)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
class RangeInstallmentCreditOffer < Internal::Model
|
|
29
|
+
attribute :approved_amount, :created_at, :customer_id, :due_date_rule, :external_id, :id, :max_installments,
|
|
30
|
+
:min_amount, :min_installments, :monthly_interest_rate, :status, :updated_at, :valid_until
|
|
31
|
+
|
|
32
|
+
def self.deserialize(raw)
|
|
33
|
+
new(
|
|
34
|
+
approved_amount: raw[:approved_amount],
|
|
35
|
+
created_at: raw[:created_at],
|
|
36
|
+
customer_id: raw[:customer_id],
|
|
37
|
+
due_date_rule: raw[:due_date_rule],
|
|
38
|
+
external_id: raw[:external_id],
|
|
39
|
+
id: raw[:id],
|
|
40
|
+
max_installments: raw[:max_installments],
|
|
41
|
+
min_amount: raw[:min_amount],
|
|
42
|
+
min_installments: raw[:min_installments],
|
|
43
|
+
monthly_interest_rate: raw[:monthly_interest_rate],
|
|
44
|
+
status: raw[:status],
|
|
45
|
+
updated_at: raw[:updated_at],
|
|
46
|
+
valid_until: raw[:valid_until]
|
|
47
|
+
)
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
module CreditOffer
|
|
52
|
+
def self.deserialize(raw)
|
|
53
|
+
if raw.key?(:installments)
|
|
54
|
+
FixedInstallmentCreditOffer.deserialize(raw)
|
|
55
|
+
elsif raw.key?(:max_installments)
|
|
56
|
+
RangeInstallmentCreditOffer.deserialize(raw)
|
|
57
|
+
else
|
|
58
|
+
RangeInstallmentCreditOffer.deserialize(raw)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../../runtime/model"
|
|
4
|
+
require_relative "kyc"
|
|
5
|
+
|
|
6
|
+
module Dinie
|
|
7
|
+
module CustomerStatus
|
|
8
|
+
CREATING = "creating"
|
|
9
|
+
PENDING_KYC = "pending_kyc"
|
|
10
|
+
UNDER_REVIEW = "under_review"
|
|
11
|
+
ACTIVE = "active"
|
|
12
|
+
DENIED = "denied"
|
|
13
|
+
ALL = [CREATING, PENDING_KYC, UNDER_REVIEW, ACTIVE, DENIED].freeze
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
class Customer < Internal::Model
|
|
17
|
+
attribute :cnpj, :cpf, :created_at, :email, :external_id, :id, :kyc, :metadata, :name, :phone, :status,
|
|
18
|
+
:trading_name, :updated_at
|
|
19
|
+
|
|
20
|
+
def self.deserialize(raw)
|
|
21
|
+
new(
|
|
22
|
+
cnpj: raw[:cnpj],
|
|
23
|
+
cpf: raw[:cpf],
|
|
24
|
+
created_at: raw[:created_at],
|
|
25
|
+
email: raw[:email],
|
|
26
|
+
external_id: raw[:external_id],
|
|
27
|
+
id: raw[:id],
|
|
28
|
+
kyc: raw[:kyc]&.map { |requirement| Dinie.deserialize_kyc_requirement(requirement) },
|
|
29
|
+
metadata: raw[:metadata],
|
|
30
|
+
name: raw[:name],
|
|
31
|
+
phone: raw[:phone],
|
|
32
|
+
status: raw[:status],
|
|
33
|
+
trading_name: raw[:trading_name],
|
|
34
|
+
updated_at: raw[:updated_at]
|
|
35
|
+
)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def self.serialize_create(cnpj:, cpf:, email:, phone:, external_id: Internal::OMIT, name: Internal::OMIT)
|
|
39
|
+
{ cnpj:, cpf:, email:, external_id:, name:, phone: }.reject { |_key, value| Internal.omitted?(value) }
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def self.serialize_update(email: Internal::OMIT, phone: Internal::OMIT)
|
|
43
|
+
{ email:, phone: }.reject { |_key, value| Internal.omitted?(value) }
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../../runtime/model"
|
|
4
|
+
|
|
5
|
+
module Dinie
|
|
6
|
+
module CustomerBankAccountKind
|
|
7
|
+
CHECKING = "checking"
|
|
8
|
+
SAVING = "saving"
|
|
9
|
+
PAYMENT = "payment"
|
|
10
|
+
ALL = [CHECKING, SAVING, PAYMENT].freeze
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
class CustomerBankAccount < Internal::Model
|
|
14
|
+
attribute :bank_id, :bank_name, :branch, :digit, :id, :kind, :number, :updated_at
|
|
15
|
+
|
|
16
|
+
def self.deserialize(raw)
|
|
17
|
+
new(
|
|
18
|
+
bank_id: raw[:bank_id],
|
|
19
|
+
bank_name: raw[:bank_name],
|
|
20
|
+
branch: raw[:branch],
|
|
21
|
+
digit: raw[:digit],
|
|
22
|
+
id: raw[:id],
|
|
23
|
+
kind: raw[:kind],
|
|
24
|
+
number: raw[:number],
|
|
25
|
+
updated_at: raw[:updated_at]
|
|
26
|
+
)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def self.serialize_upsert_bank_account(bank_id:, branch:, digit:, kind:, number:)
|
|
30
|
+
{ bank_account: { bank_id:, branch:, digit:, kind:, number: } }
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Dinie
|
|
4
|
+
module Internal
|
|
5
|
+
ID_PATTERNS = {
|
|
6
|
+
api_client: /\Adinie_ci_(live|test)_[A-Za-z0-9]+\z/,
|
|
7
|
+
bank_account: /\Aba_[0-9a-f]{32}\z/,
|
|
8
|
+
credit_offer: /\Aco_[0-9a-f]{32}\z/,
|
|
9
|
+
customer: /\Acust_[0-9a-f]{32}\z/,
|
|
10
|
+
event: /\Aevt_[0-9a-f]{32}\z/,
|
|
11
|
+
loan: /\Aln_[0-9a-f]{32}\z/,
|
|
12
|
+
simulation: /\Asim_[0-9a-f]{32}\z/,
|
|
13
|
+
transaction: /\Atx_[0-9a-f]{32}\z/,
|
|
14
|
+
webhook_delivery: /\Adlv_[0-9a-f]{32}\z/,
|
|
15
|
+
webhook_endpoint: /\Awe_[0-9a-f]{32}\z/
|
|
16
|
+
}.freeze
|
|
17
|
+
end
|
|
18
|
+
end
|