uphold 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +19 -0
  3. data/.rubocop.yml +32 -0
  4. data/.travis.yml +13 -0
  5. data/Gemfile +10 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +335 -0
  8. data/Rakefile +14 -0
  9. data/lib/uphold/api/auth_token.rb +17 -0
  10. data/lib/uphold/api/card.rb +36 -0
  11. data/lib/uphold/api/contact.rb +34 -0
  12. data/lib/uphold/api/endpoints.rb +26 -0
  13. data/lib/uphold/api/private_transaction.rb +58 -0
  14. data/lib/uphold/api/public_transaction.rb +23 -0
  15. data/lib/uphold/api/ticker.rb +23 -0
  16. data/lib/uphold/api/transparency.rb +15 -0
  17. data/lib/uphold/api/user.rb +23 -0
  18. data/lib/uphold/api.rb +22 -0
  19. data/lib/uphold/client.rb +14 -0
  20. data/lib/uphold/entities/asset.rb +9 -0
  21. data/lib/uphold/entities/auth_token.rb +9 -0
  22. data/lib/uphold/entities/base_entity.rb +27 -0
  23. data/lib/uphold/entities/card.rb +15 -0
  24. data/lib/uphold/entities/contact.rb +13 -0
  25. data/lib/uphold/entities/error.rb +8 -0
  26. data/lib/uphold/entities/ledger_entry.rb +10 -0
  27. data/lib/uphold/entities/oauth_error.rb +9 -0
  28. data/lib/uphold/entities/phone.rb +12 -0
  29. data/lib/uphold/entities/ticker.rb +10 -0
  30. data/lib/uphold/entities/transaction.rb +17 -0
  31. data/lib/uphold/entities/user.rb +18 -0
  32. data/lib/uphold/helpers.rb +23 -0
  33. data/lib/uphold/options.rb +39 -0
  34. data/lib/uphold/pagination.rb +9 -0
  35. data/lib/uphold/request.rb +70 -0
  36. data/lib/uphold/request_data.rb +7 -0
  37. data/lib/uphold/version.rb +3 -0
  38. data/lib/uphold.rb +46 -0
  39. data/spec/fixtures/vcr_cassettes/ledger.yml +56 -0
  40. data/spec/fixtures/vcr_cassettes/me/card.yml +61 -0
  41. data/spec/fixtures/vcr_cassettes/me/cards.yml +67 -0
  42. data/spec/fixtures/vcr_cassettes/me/contact.yml +61 -0
  43. data/spec/fixtures/vcr_cassettes/me/contacts.yml +61 -0
  44. data/spec/fixtures/vcr_cassettes/me/created_card.yml +61 -0
  45. data/spec/fixtures/vcr_cassettes/me/created_contact.yml +61 -0
  46. data/spec/fixtures/vcr_cassettes/me/phones.yml +61 -0
  47. data/spec/fixtures/vcr_cassettes/me/transactions/cancel.yml +61 -0
  48. data/spec/fixtures/vcr_cassettes/me/transactions/commit.yml +62 -0
  49. data/spec/fixtures/vcr_cassettes/me/transactions/create.yml +61 -0
  50. data/spec/fixtures/vcr_cassettes/me/transactions/create_waiting_cancel.yml +118 -0
  51. data/spec/fixtures/vcr_cassettes/me/transactions/create_waiting_resend.yml +118 -0
  52. data/spec/fixtures/vcr_cassettes/me/transactions/resend.yml +61 -0
  53. data/spec/fixtures/vcr_cassettes/me.yml +185 -0
  54. data/spec/fixtures/vcr_cassettes/pats.yml +61 -0
  55. data/spec/fixtures/vcr_cassettes/reserve/transaction.yml +60 -0
  56. data/spec/fixtures/vcr_cassettes/reserve/transactions.yml +60 -0
  57. data/spec/fixtures/vcr_cassettes/tickers.yml +60 -0
  58. data/spec/fixtures/vcr_cassettes/transparency.yml +60 -0
  59. data/spec/integration/api/auth_token_spec.rb +20 -0
  60. data/spec/integration/api/card_spec.rb +47 -0
  61. data/spec/integration/api/contact_spec.rb +53 -0
  62. data/spec/integration/api/private_transactions_spec.rb +74 -0
  63. data/spec/integration/api/public_transaction_spec.rb +35 -0
  64. data/spec/integration/api/ticker_spec.rb +21 -0
  65. data/spec/integration/api/transparency_spec.rb +33 -0
  66. data/spec/integration/api/user_spec.rb +32 -0
  67. data/spec/spec_helper.rb +26 -0
  68. data/spec/support/vcr.rb +8 -0
  69. data/spec/support/webmock.rb +11 -0
  70. data/spec/unit/api/auth_spec.rb +21 -0
  71. data/spec/unit/api/card_spec.rb +47 -0
  72. data/spec/unit/api/contact_spec.rb +53 -0
  73. data/spec/unit/api/private_transaction_spec.rb +114 -0
  74. data/spec/unit/api/public_transaction_spec.rb +34 -0
  75. data/spec/unit/api/ticker_spec.rb +34 -0
  76. data/spec/unit/api/transparency_spec.rb +33 -0
  77. data/spec/unit/api/user_spec.rb +33 -0
  78. data/spec/unit/client_spec.rb +33 -0
  79. data/spec/unit/entities/base_entity_spec.rb +36 -0
  80. data/spec/unit/helper_spec.rb +37 -0
  81. data/spec/unit/request_spec.rb +94 -0
  82. data/uphold.gemspec +30 -0
  83. metadata +296 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fcbac48fdf6ca84355f80032f2405c44635195a0
4
+ data.tar.gz: bec84be91e397bee706526eb50fdc3282e45ba68
5
+ SHA512:
6
+ metadata.gz: 2afa7286c1b900357966625ed1f273344d616f9374bba8b8909e4936ec7ece0527a3d129963ef2bc5a802290f272458075c1e870c231a1576f026d1617a0c3f5
7
+ data.tar.gz: 4451d2528a39b13e61ac18704afecd1e7ad8730efb3ed508fa62f7e0db246b9acfc2f35be19a6bf9c91cc9db9e37c56a2a7594d7092df3c6035d14f7590b1b6f
data/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
15
+ .env
16
+ tags
17
+ .tags
18
+ path
19
+ .ruby-version
data/.rubocop.yml ADDED
@@ -0,0 +1,32 @@
1
+ AllCops:
2
+ Include:
3
+ - '**/Rakefile'
4
+ - '**/config.ru'
5
+ Exclude:
6
+ - 'path/**/*'
7
+ - 'bin/**/*'
8
+ - 'vendor/**/*'
9
+
10
+ Metrics/LineLength:
11
+ Enabled: false
12
+
13
+ Style/AlignParameters:
14
+ EnforcedStyle: with_fixed_indentation
15
+
16
+ Style/ClassAndModuleChildren:
17
+ Enabled: false
18
+
19
+ Style/Documentation:
20
+ Enabled: false
21
+
22
+ Style/DotPosition:
23
+ EnforcedStyle: trailing
24
+
25
+ Style/IfUnlessModifier:
26
+ Enabled: false
27
+
28
+ Style/MultilineOperationIndentation:
29
+ EnforcedStyle: indented
30
+
31
+ Style/RegexpLiteral:
32
+ MaxSlashes: 0
data/.travis.yml ADDED
@@ -0,0 +1,13 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.0
4
+ - 2.1.5
5
+ - 2.0.0
6
+ - ruby-head
7
+ - jruby-1.6.8
8
+ - rbx-2.2.10
9
+ matrix:
10
+ allow_failures:
11
+ - rvm: ruby-head
12
+ - rvm: jruby-1.6.8
13
+ - rvm: rbx-2.2.10
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ gem 'pry'
6
+
7
+ group :test do
8
+ gem 'codeclimate-test-reporter', require: false
9
+ gem 'vcr'
10
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 Group Buddies
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,335 @@
1
+ # Uphold
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/uphold-ruby.svg)](http://badge.fury.io/rb/uphold)
4
+ [![Build Status](https://travis-ci.org/subvisual/uphold-ruby.svg?branch=master)](https://travis-ci.org/subvisual/uphold-ruby)
5
+ [![Code Climate](https://codeclimate.com/github/subvisual/uphold-ruby/badges/gpa.svg)](https://codeclimate.com/github/subvisual/uphold-ruby)
6
+ [![Test Coverage](https://codeclimate.com/github/subvisual/uphold-ruby/badges/coverage.svg)](https://codeclimate.com/github/subvisual/uphold-ruby)
7
+
8
+ A ruby client for the [Uphold](https://uphold.com/) API.
9
+
10
+ # Installation
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ ```ruby
15
+ gem 'uphold'
16
+ ```
17
+
18
+ And then execute:
19
+
20
+ $ bundle
21
+
22
+ Or install it yourself as:
23
+
24
+ $ gem install uphold
25
+
26
+ # Contents
27
+
28
+ * [Usage](#usage)
29
+ * [Options](#options)
30
+ * [Creating an authenticated client](#creating-an-authenticated-client)
31
+ * [Personal Access Token](#personal-access-token)
32
+ * [Via argument](#via-argument)
33
+ * [Via environment variable](#via-environment-variable)
34
+ * [Endpoints](#endpoints)
35
+ * [Authentication](#authentication)
36
+ * [OAuth2](#oauth2)
37
+ * [Basic Authentication](#basic-authentication)
38
+ * [Tickers](#tickers)
39
+ * [Entities](#entities)
40
+ * [Cards](#cards)
41
+ * [Transactions](#transactions)
42
+ * [Public Transactions](#public-transactions)
43
+ * [Private Transactions](#private-transactions)
44
+ * [Contacts](#contacts)
45
+ * [Users](#users)
46
+ * [Transparency](#transparency)
47
+ * [Pagination](#pagination)
48
+ * [Contributing](#contributing)
49
+
50
+ # Usage
51
+
52
+ To use the gem, you have to instantiate a client. All API calls are made from there. Here's a minimal working example:
53
+
54
+ ```ruby
55
+ require 'uphold'
56
+
57
+ client = Uphold::Client.new
58
+ puts client.all_tickers
59
+ ```
60
+
61
+ ## Sandbox mode
62
+
63
+ Uphold has a sandbox version for testing purposes:
64
+
65
+ * Sandbox site: https://sandbox.uphold.com
66
+ * Sandbox API: https://api-sandbox.uphold.com
67
+
68
+ You can set `Uphold.sandbox = true` to enable sandboxing mode to set the global base URL to point to the sandbox API instead of the production one.
69
+
70
+ # Options
71
+
72
+ This is a summary of the supported options when instantiating a new client, and their default values:
73
+
74
+ ```ruby
75
+ Uphold::Client.new(
76
+ # bearer_token for OAuth authentication
77
+ token: ENV['UPHOLD_AUTH_TOKEN']
78
+ )
79
+ ```
80
+
81
+ # Creating an authenticated client
82
+
83
+ In order to make most of the API calls, you will need to authenticate your
84
+ client. Here's how you can do that.
85
+
86
+ ## Personal Access Token
87
+
88
+ If you don't have a PAT, learn how to generate one
89
+ [here](#basic-authentication).
90
+
91
+ If you already have a token, you can use it by setting an environment variable,
92
+ or by passing it when instantiating the client.
93
+
94
+ ### Via argument
95
+
96
+ Pass the token to the constructor:
97
+
98
+ ```ruby
99
+ Uphold::Client.new(token: 'your-access-token')
100
+ ```
101
+
102
+ ### Via environment variable
103
+
104
+ Set the environment variable using [dotenv](https://github.com/bkeepers/dotenv), or by exporting it in your shell:
105
+
106
+ ```bash
107
+ $ export UPHOLD_AUTH_TOKEN="your-access-token"
108
+ ```
109
+
110
+ Then instantiate the client:
111
+
112
+ ```ruby
113
+ Uphold::Client.new
114
+ ```
115
+
116
+ # Endpoints
117
+
118
+ This is a comprehensive list of all the mappings between this wrapper and the
119
+ Uphold's API.
120
+
121
+ ## Authentication
122
+
123
+ [*Uphold documentation on authentication*](https://developer.uphold.com/api/v0/#authentication)
124
+
125
+ ### OAuth2
126
+
127
+ **NOT SUPPORTED BY UPHOLD YET**
128
+
129
+ ### Basic Authentication
130
+
131
+ [*Bireserve documentation on basic authentication*](https://developer.uphold.com/api/v0/#basic-authentication)
132
+
133
+ The only thing you need, in order to use basic authentication is a Personal
134
+ Access Token, everything else is transparent to you. If you already have a
135
+ token, see how to use it [here](#personal-access-token).
136
+
137
+ ```ruby
138
+ client.generate_access_token(username: 'your-uphold-username', password:
139
+ 'your-uphold-password', otp: 'a-valid-uphold-otp')
140
+ ```
141
+
142
+ To generate a valid OTP you can install [Authy](https://www.authy.com/), follow
143
+ it's set up process and choose uphold. You should be prompted with a set of
144
+ numbers, which is your OTP (it only lasts 30 seconds, so you have to be quick).
145
+
146
+ ## Tickers
147
+
148
+ [*Uphold documentation on tickers*](https://developer.uphold.com/api/v0/#tickers)
149
+
150
+ **Return the current rates on Uphold for all currency pairs:**
151
+
152
+ ```ruby
153
+ client.all_tickers
154
+ ```
155
+
156
+ **Return the current rates on Uphold for a specific currency:**
157
+
158
+ ```ruby
159
+ client.find_ticker(currency: 'EUR')
160
+ ```
161
+
162
+ ## Cards
163
+
164
+ [*Uphold documentation on cards*](https://developer.uphold.com/api/v0/#cards)
165
+
166
+ **Return all the user's cards:**
167
+
168
+ ```ruby
169
+ client.all_cards
170
+ ```
171
+
172
+ **Return the details for a specific card associated with the user:**
173
+
174
+ ```ruby
175
+ client.find_card(id: '37e002a7-8508-4268-a18c-7335a6ddf24b')
176
+ ```
177
+
178
+ **Create a card for the user:**
179
+
180
+ ```ruby
181
+ client.create_card(label: 'My label', currency: 'BTC')
182
+ ```
183
+
184
+ ## Transactions
185
+
186
+ [*Uphold documentation on transactions*](https://developer.uphold.com/api/v0/#transactions)
187
+
188
+ You can interact with both the authenticated user's and public transactions.
189
+
190
+ ### Public Transactions
191
+
192
+ **Return the public view of all transactions in the reserve (supports
193
+ [Pagination](#pagination)):**
194
+
195
+ ```ruby
196
+ client.all_public_transactions
197
+ ```
198
+
199
+ **Return the public view of a specific transaction (supports
200
+ [Pagination](#pagination)):**
201
+
202
+ ```ruby
203
+ client.find_public_transactions(id: 'a97bb994-6e24-4a89-b653-e0a6d0bcf634')
204
+ ```
205
+
206
+ ### Private Transactions
207
+
208
+ **Create a transaction:**
209
+
210
+ ```ruby
211
+ client.create_transaction(card_id: 'a6d35fcd-xxxx-9c9d1dda6d57', currency:
212
+ 'BTC', amount: 0.1, destination: 'foo@bar.com')
213
+ ```
214
+
215
+ **Commit a transaction:**
216
+
217
+ ```ruby
218
+ client.commit_transaction(card_id: 'a6d35fcd-xxxx-9c9d1dda6d57', transaction_id:
219
+ 'd51b4e4e-9827-40fb-8763-e0ea2880085b')
220
+ ```
221
+
222
+ **Cancel a transaction:**
223
+
224
+ ```ruby
225
+ client.cancel_transaction(card_id: 'a6d35fcd-xxxx-9c9d1dda6d57', transaction_id:
226
+ 'd51b4e4e-9827-40fb-8763-e0ea2880085b')
227
+ ```
228
+
229
+ **Resend a transaction:**
230
+
231
+ ```ruby
232
+ client.resend_transaction(card_id: 'a6d35fcd-xxxx-9c9d1dda6d57', transaction_id:
233
+ 'd51b4e4e-9827-40fb-8763-e0ea2880085b')
234
+ ```
235
+
236
+ **Return all transactions associated with the user (supports
237
+ [Pagination](#pagination)):**
238
+
239
+ ```ruby
240
+ client.all_user_transactions
241
+ ```
242
+
243
+ **Return all transactions associated with a card:**
244
+
245
+ ```ruby
246
+ client.all_card_transactions
247
+ ```
248
+
249
+ ## Contacts
250
+
251
+ [*Uphold documentation on contacts*](https://developer.uphold.com/api/v0/#contacts)
252
+
253
+ **Return all the user's contacts:**
254
+
255
+ ```ruby
256
+ client.all_contacts
257
+ ```
258
+
259
+ **Return the details for a specific contact associated with the user:**
260
+
261
+ ```ruby
262
+ client.find_contact(id: '9fae84eb-712d-4b6a-9b2c-764bdde4c079')
263
+ ```
264
+
265
+ **Create a contact for the user:**
266
+
267
+ ```ruby
268
+ client.create_contact(first_name: 'Luke', last_name: 'Skywalker', company: 'Lars
269
+ Moisture Farm Inc', emails: ['support@larsmoisturefarm.com')
270
+ ```
271
+
272
+ ## Users
273
+
274
+ [*Uphold documentation on users*](https://developer.uphold.com/api/v0/#users)
275
+
276
+ **Return the details of the user:**
277
+
278
+ ```ruby
279
+ client.me
280
+ ```
281
+
282
+ **Return the list of phone numbers associated with the user:**
283
+
284
+ ```ruby
285
+ client.phones
286
+ ```
287
+
288
+ ## Transparency
289
+
290
+ [*Uphold documentation on the reserve status*](https://developer.uphold.com/api/v0/#reserve-status)
291
+
292
+ **Return a summary of all obligations and assets:**
293
+
294
+ ```ruby
295
+ client.statistics
296
+ ```
297
+
298
+ [*Uphold documentation on the reserve ledger*](https://developer.uphold.com/api/v0/#the-reserveledger)
299
+
300
+ **Return a detailed record of all obligations and assets flowing into the
301
+ network:**
302
+
303
+ ```ruby
304
+ client.ledger
305
+ ```
306
+
307
+ ## Pagination
308
+
309
+ [*Uphold documentation on pagination*](https://developer.uphold.com/api/v0/#pagination)
310
+
311
+ All endpoints that support pagination take a `range` attribute, in which you can
312
+ specify the first and last indexes for the items you wish to retrieve.
313
+
314
+ The response will look exactly like an `Array`, but with a method called
315
+ `total_items`, that returns the total number of items of that type that
316
+ Uphold knows of.
317
+
318
+ ```ruby
319
+ client = Uphold::Client.new token: 'XXX'
320
+ client.all_public_transactions.size # 5
321
+ client.all_public_transactions.total_size # 21110
322
+ client.all_public_transactions(range: (5..20)).size # 16
323
+ ```
324
+
325
+ # Contributing
326
+
327
+ 1. Fork it ( https://github.com/subvisual/uphold-ruby/fork )
328
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
329
+ 4. Commit your changes (`git commit -am 'Add some feature'`)
330
+ 4. Push to the branch (`git push origin my-new-feature`)
331
+ 5. Create a new Pull Request
332
+
333
+ # Copyright
334
+
335
+ Copyright (c) 2015 Group Buddies. See [LICENSE.txt](LICENSE.txt) for further details.
data/Rakefile ADDED
@@ -0,0 +1,14 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rubocop/rake_task'
3
+ require 'rspec/core/rake_task'
4
+ RuboCop::RakeTask.new
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task :console do
8
+ require 'pry'
9
+ require 'uphold'
10
+ ARGV.clear
11
+ Pry.start
12
+ end
13
+
14
+ task default: [:rubocop, :spec]
@@ -0,0 +1,17 @@
1
+ require 'base64'
2
+
3
+ module Uphold
4
+ module API
5
+ module AuthToken
6
+ def generate_access_token(username: '', password: '', otp: '')
7
+ request_data = Uphold::RequestData.new(
8
+ Endpoints::AUTH,
9
+ Entities::AuthToken,
10
+ { 'X-Uphold-OTP' => otp, 'Authorization' => 'Basic ' + Base64.encode64("#{username}:#{password}") },
11
+ description: 'Uphold ruby'
12
+ )
13
+ Request.perform_with_object(:post, request_data)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,36 @@
1
+ module Uphold
2
+ module API
3
+ module Card
4
+ def all_cards
5
+ Request.perform_with_objects(:get, cards_request_data)
6
+ end
7
+
8
+ def find_card(id: nil)
9
+ Request.perform_with_object(:get, card_request_data(id))
10
+ end
11
+
12
+ def create_card(label: nil, currency: nil)
13
+ Request.perform_with_object(:post, cards_request_data(label: label, currency: currency))
14
+ end
15
+
16
+ private
17
+
18
+ def cards_request_data(payload = nil)
19
+ RequestData.new(
20
+ Endpoints::CARD,
21
+ Entities::Card,
22
+ authorization_header,
23
+ payload
24
+ )
25
+ end
26
+
27
+ def card_request_data(id)
28
+ RequestData.new(
29
+ Endpoints::CARD + "/#{id}",
30
+ Entities::Card,
31
+ authorization_header
32
+ )
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,34 @@
1
+ module Uphold
2
+ module API
3
+ module Contact
4
+ def all_contacts
5
+ request_data = RequestData.new(
6
+ Endpoints::USER_CONTACTS,
7
+ Entities::Contact,
8
+ authorization_header
9
+ )
10
+ Request.perform_with_objects(:get, request_data)
11
+ end
12
+
13
+ def find_contact(id: nil)
14
+ request_data = RequestData.new(
15
+ Endpoints::USER_CONTACTS + "/#{id}",
16
+ Entities::Contact,
17
+ authorization_header
18
+ )
19
+ Request.perform_with_object(:get, request_data)
20
+ end
21
+
22
+ def create_contact(**args)
23
+ request_data = RequestData.new(
24
+ Endpoints::USER_CONTACTS,
25
+ Entities::Contact,
26
+ authorization_header,
27
+ Uphold::Helpers.camelized_hash(args)
28
+ )
29
+
30
+ Request.perform_with_object(:post, request_data)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,26 @@
1
+ module Uphold
2
+ module Endpoints
3
+ AUTH = '/me/tokens'
4
+ CARD = '/me/cards'
5
+ CARD_PRIVATE_TRANSACTIONS = CARD + '/:card/transactions'
6
+ COMMIT_TRANSACTION = CARD_PRIVATE_TRANSACTIONS + '/:id/commit'
7
+ CANCEL_TRANSACTION = CARD_PRIVATE_TRANSACTIONS + '/:id/cancel'
8
+ RESEND_TRANSACTION = CARD_PRIVATE_TRANSACTIONS + '/:id/resend'
9
+ USER_PRIVATE_TRANSACTIONS = '/me/transactions'
10
+ PUBLIC_TRANSACTIONS = '/reserve/transactions'
11
+ LEDGER = '/reserve/ledger'
12
+ STATS = '/reserve/statistics'
13
+ TICKER = '/ticker'
14
+ USER = '/me'
15
+ USER_CONTACTS = '/me/contacts'
16
+ USER_PHONES = '/me/phones'
17
+
18
+ def self.with_placeholders(endpoint, substitutions = {})
19
+ new_endpoint = endpoint.dup
20
+ substitutions.each_pair do |placeholder, substitute|
21
+ new_endpoint.gsub!(placeholder, substitute)
22
+ end
23
+ new_endpoint
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,58 @@
1
+ module Uphold
2
+ module API
3
+ module PrivateTransaction
4
+ def create_transaction(card_id: nil, currency: nil, amount: 0, destination: nil)
5
+ request_data = RequestData.new(
6
+ Endpoints.with_placeholders(Endpoints::CARD_PRIVATE_TRANSACTIONS, ':card' => card_id),
7
+ Entities::Transaction,
8
+ authorization_header,
9
+ card_id: card_id, denomination: { currency: currency, amount: amount }, destination: destination
10
+ )
11
+ Request.perform_with_object(:post, request_data)
12
+ end
13
+
14
+ def commit_transaction(card_id: nil, transaction_id: nil)
15
+ request_data = transaction_request_data(Endpoints::COMMIT_TRANSACTION, card_id, transaction_id)
16
+ Request.perform_with_object(:post, request_data)
17
+ end
18
+
19
+ def cancel_transaction(card_id: nil, transaction_id: nil)
20
+ request_data = transaction_request_data(Endpoints::CANCEL_TRANSACTION, card_id, transaction_id)
21
+ Request.perform_with_object(:post, request_data)
22
+ end
23
+
24
+ def resend_transaction(card_id: nil, transaction_id: nil)
25
+ request_data = transaction_request_data(Endpoints::RESEND_TRANSACTION, card_id, transaction_id)
26
+ Request.perform_with_object(:post, request_data)
27
+ end
28
+
29
+ def all_user_transactions(range: (0..4))
30
+ request_data = RequestData.new(
31
+ Endpoints::USER_PRIVATE_TRANSACTIONS,
32
+ Entities::Transaction,
33
+ authorization_header.merge(pagination_header_for_range(range))
34
+ )
35
+ Request.perform_with_objects(:get, request_data)
36
+ end
37
+
38
+ def all_card_transactions(card_id: nil, range: (0..4))
39
+ request_data = RequestData.new(
40
+ Endpoints.with_placeholders(Endpoints::CARD_PRIVATE_TRANSACTIONS, ':card' => card_id),
41
+ Entities::Transaction,
42
+ authorization_header.merge(pagination_header_for_range(range))
43
+ )
44
+ Request.perform_with_objects(:get, request_data)
45
+ end
46
+
47
+ private
48
+
49
+ def transaction_request_data(endpoint, card_id, transaction_id)
50
+ RequestData.new(
51
+ Endpoints.with_placeholders(endpoint, ':card' => card_id, ':id' => transaction_id),
52
+ Entities::Transaction,
53
+ authorization_header
54
+ )
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,23 @@
1
+ module Uphold
2
+ module API
3
+ module PublicTransaction
4
+ def all_public_transactions(range: (0..4))
5
+ request_data = RequestData.new(
6
+ Endpoints::PUBLIC_TRANSACTIONS,
7
+ Entities::Transaction,
8
+ authorization_header.merge(pagination_header_for_range(range))
9
+ )
10
+ Request.perform_with_objects(:get, request_data)
11
+ end
12
+
13
+ def find_public_transaction(id: '')
14
+ request_data = RequestData.new(
15
+ Endpoints::PUBLIC_TRANSACTIONS + "/#{id}",
16
+ Entities::Transaction,
17
+ authorization_header
18
+ )
19
+ Request.perform_with_object(:get, request_data)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ module Uphold
2
+ module API
3
+ module Ticker
4
+ def all_tickers
5
+ request_data = RequestData.new(
6
+ Endpoints::TICKER,
7
+ Entities::Ticker,
8
+ authorization_header
9
+ )
10
+ Request.perform_with_objects(:get, request_data)
11
+ end
12
+
13
+ def find_ticker(currency: nil)
14
+ request_data = RequestData.new(
15
+ Endpoints::TICKER + "/#{currency}",
16
+ Entities::Ticker,
17
+ authorization_header
18
+ )
19
+ Request.perform_with_objects(:get, request_data)
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,15 @@
1
+ module Uphold
2
+ module API
3
+ module Transparency
4
+ def statistics
5
+ request_data = RequestData.new(Endpoints::STATS, Entities::Asset, authorization_header)
6
+ Request.perform_with_objects(:get, request_data)
7
+ end
8
+
9
+ def ledger
10
+ request_data = RequestData.new(Endpoints::LEDGER, Entities::LedgerEntry, authorization_header)
11
+ Request.perform_with_objects(:get, request_data)
12
+ end
13
+ end
14
+ end
15
+ end