rdstation-ruby-client 2.0.0 → 2.4.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.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +116 -4
  3. data/README.md +114 -22
  4. data/lib/rdstation-ruby-client.rb +6 -1
  5. data/lib/rdstation.rb +19 -0
  6. data/lib/rdstation/api_response.rb +1 -2
  7. data/lib/rdstation/authentication.rb +32 -3
  8. data/lib/rdstation/{authorization_header.rb → authorization.rb} +11 -8
  9. data/lib/rdstation/builder/field.rb +70 -0
  10. data/lib/rdstation/client.rb +17 -7
  11. data/lib/rdstation/contacts.rb +22 -13
  12. data/lib/rdstation/error.rb +2 -0
  13. data/lib/rdstation/error/format.rb +29 -3
  14. data/lib/rdstation/error/formatter.rb +69 -8
  15. data/lib/rdstation/error_handler.rb +6 -1
  16. data/lib/rdstation/events.rb +7 -12
  17. data/lib/rdstation/fields.rb +35 -6
  18. data/lib/rdstation/retryable_request.rb +35 -0
  19. data/lib/rdstation/version.rb +1 -1
  20. data/lib/rdstation/webhooks.rb +25 -13
  21. data/rdstation-ruby-client.gemspec +2 -1
  22. data/spec/lib/rdstation/api_response_spec.rb +34 -0
  23. data/spec/lib/rdstation/authentication_spec.rb +164 -0
  24. data/spec/lib/rdstation/{authorization_header_spec.rb → authorization_spec.rb} +3 -3
  25. data/spec/lib/rdstation/builder/field_spec.rb +69 -0
  26. data/spec/lib/rdstation/client_spec.rb +6 -6
  27. data/spec/lib/rdstation/contacts_spec.rb +23 -3
  28. data/spec/lib/rdstation/error/format_spec.rb +63 -0
  29. data/spec/lib/rdstation/error/formatter_spec.rb +113 -0
  30. data/spec/lib/rdstation/error_handler_spec.rb +23 -0
  31. data/spec/lib/rdstation/events_spec.rb +8 -3
  32. data/spec/lib/rdstation/fields_spec.rb +6 -1
  33. data/spec/lib/rdstation/retryable_request_spec.rb +142 -0
  34. data/spec/lib/rdstation/webhooks_spec.rb +26 -1
  35. data/spec/lib/rdstation_spec.rb +18 -0
  36. metadata +36 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5ca94a755162557e5fcca58d15583986492ee1ef64c569c54d7c8a6feab6edec
4
- data.tar.gz: 7b258da27dd4f13148e2f9de60a4a95eb32131fb0e5e0d8f5cc133eb3e4720fd
3
+ metadata.gz: d51df272057d17abe280b0fe23f7a97f9ef2ceb543f823db1ce8b047788d1887
4
+ data.tar.gz: d59bd8063663bb95df477c672066e4c6655172a193d9b2244bba6b8608a92869
5
5
  SHA512:
6
- metadata.gz: 28bf2fc07e73df574917d1b441867146d3120d44a7e72599399648b118922c04c7e4fc75364180bdc175c14ee77c2452cf7ff02885d83d7daf6924c642876759
7
- data.tar.gz: c70a26f5d2b8a42d6b4deb8ee3de27ad817262e58b033a88200bcda04f9c36e468f2ce919b25d29181d810eb286a018a8eaed52eb04e4f545682e7a36b7a3876
6
+ metadata.gz: 1451abf2db818f4551575ea88befdb63b6f8f8b1afa3270b96ee50b059f0f69676d6c6104a6e217d58e9c84384527d77e81d257d5a222a1ab2df74e1ed525446
7
+ data.tar.gz: 06c2620cdf413e945207f7b0bad15bcdb762038b360ef3c9ed5371e2ff06edc4949f97602fc0c3ffc352ff14bf66774234c398b291a5606d34931ab0eded84e9
@@ -1,8 +1,118 @@
1
+ ## 2.4.0
2
+
3
+ - Add the TooManyRequests errors in case of rate limit exceeded. See [API request limit](https://developers.rdstation.com/en/request-limit) for more details
4
+
5
+ ## 2.3.1
6
+
7
+ - Fixed a bug when no error is found in the known errors list (issue [#52](https://github.com/ResultadosDigitais/rdstation-ruby-client/issues/52))
8
+
9
+ ## 2.3.0
10
+
11
+ ### Additions
12
+
13
+ #### 1. New Field methods
14
+
15
+ The following methods were added to "Fields" client:
16
+
17
+ - create
18
+ - update
19
+ - delete
20
+
21
+ Besides reading, this client is now capable of create, update or delete a field.
22
+
23
+ Usage example:
24
+
25
+ ```ruby
26
+ client = RDStation::Client.new(access_token: 'ACCESS_TOKEN', refresh_token: 'REFRESH_TOKEN')
27
+ client.fields.delete('FIELD_UUID')
28
+ ```
29
+
30
+ #### 2. New format of errors supported
31
+
32
+ Two new formats of errors are now supported by the error handler:
33
+
34
+ ##### `HASH_OF_HASHES`
35
+
36
+ When the error message is a hash containing other hashes as values, for example:
37
+
38
+ ```ruby
39
+ {
40
+ 'error' => {
41
+ 'field1' => {...},
42
+ 'field2' => {...}
43
+ }
44
+ }
45
+ ```
46
+
47
+ ##### `HASH_OF_MULTIPLE_TYPES`
48
+
49
+ When the error message is a hash that could contain multiple data types as values, for example:
50
+
51
+ ```ruby
52
+ {
53
+ 'error' => {
54
+ 'field1' => [...] # Array,
55
+ 'field2' => {...} # Hash
56
+ }
57
+ }
58
+ ```
59
+
60
+ ## 2.2.0
61
+
62
+ ### Additions
63
+
64
+ #### Configuration
65
+
66
+ Now it is possible to configure global params like client_id and client_secret only once, so you don't need to provide them to `RDStation::Authentication` every time.
67
+
68
+ This can be done in the following way:
69
+
70
+ ```ruby
71
+ RDStation.configure do |config|
72
+ config.client_id = YOUR_CLIENT_ID
73
+ config.client_secret = YOUR_CLIENT_SECRET
74
+ end
75
+ ```
76
+
77
+ If you're using Rails, this can be done in `config/initializers`.
78
+
79
+ #### Automatic refresh of access_tokens
80
+
81
+ When an access_token expires, a new one will be obtained automatically and the request will be made again.
82
+
83
+ For this to work, you have to use `RDStation.configure` as described above, and provide the refresh token when instantiating `RDStation::Client` (ex: RDStation::Client.new(access_token: MY_ACCESS_TOKEN, refresh_token: MY_REFRESH_TOKEN).
84
+
85
+ You can keep track of access_token changes, by providing a callback block inconfiguration. This block will be called with an `RDStation::Authorization` object, which contains the updated `access_token` and `refresh_token`. For example:
86
+
87
+ ```ruby
88
+ RDStation.configure do |config|
89
+ config.on_access_token_refresh do |authorization|
90
+ MyStoredAuth.where(refresh_token: authorization.refresh_token).update_all(access_token: authorization.access_token)
91
+ end
92
+ end
93
+ ```
94
+
95
+ ### Deprecations
96
+
97
+ Providing `client_id` and `client_secret` directly to `RDStation::Authentication.new` is deprecated and will be removed in future versions. Use `RDStation.configure` instead.
98
+
99
+ Specifying refresh_token in `RDStation::Client.new(access_token: 'at', refresh_token: 'rt')` is optional right now, but will be mandatory in future versions.
100
+
101
+ ## 2.1.1
102
+
103
+ - Fixed a bug in error handling (issue [#47](https://github.com/ResultadosDigitais/rdstation-ruby-client/issues/47))
104
+
105
+ ## 2.1.0
106
+
107
+ ### Additions
108
+
109
+ `RDStation::Authentication.revoke` added. This method revokes an access_token at RD Station.
110
+
1
111
  ## 2.0.0
2
112
 
3
113
  ### Removals
4
114
 
5
- All API methods that were called directly on `RDStation::Client` (ex: `RDStation::Client.new('rdstation_token', 'auth_token').create_lead(lead_info)`) have been removed. See the [upgrading guide](#Upgrading-to-version-2.0.0) for a comprehensive guide on how to upgrade from version 1.2.x.
115
+ All API methods that were called directly on `RDStation::Client` (ex: `RDStation::Client.new('rdstation_token', 'auth_token').create_lead(lead_info)`) have been removed. See the [migration guide](README.md#Upgrading-from-1.2.x-to-2.0.0) for a comprehensive guide on how to upgrade from version 1.2.x.
6
116
 
7
117
  ### Notable changes
8
118
 
@@ -43,17 +153,19 @@ In case of a Bad Request (400), the following specific errors may be raised (tho
43
153
  - `RDStation::Error::ConflictingField`
44
154
  - `RDStation::Error::InvalidEventType`
45
155
 
46
- In cause of Unahtorized (401), the following specific errors may be raised (those are subclasses of `RDStation::Error::Unauthorized`):
156
+ In cause of Unauthorized (401), the following specific errors may be raised (those are subclasses of `RDStation::Error::Unauthorized`):
47
157
  - `RDStation::Error::ExpiredAccessToken`
48
158
  - `RDStation::Error::ExpiredCodeGrant`
49
159
  - `RDStation::Error::InvalidCredentials`
50
160
 
161
+ The specific message and the http code are now returned by the `details` method.
162
+
51
163
  ### Dependencies
52
164
 
53
165
  `rdstation-ruby-client` now requires `ruby >= 2.0.0`.
54
166
 
55
- ## 1.2.1
167
+ ## 1.2.1
56
168
 
57
169
  ### Deprecations
58
170
 
59
- All API methods that were called directly on `RDStation::Client` (ex: `RDStation::Client.new('rdstation_token', 'auth_token').create_lead(lead_info)`) are now deprecated. Those methods call RDSM's 1.3 API and will be removed in the next release.
171
+ All API methods that were called directly on `RDStation::Client` (ex: `RDStation::Client.new('rdstation_token', 'auth_token').create_lead(lead_info)`) are now deprecated. Those methods call RDSM's 1.3 API and will be removed in the next release.
data/README.md CHANGED
@@ -10,12 +10,13 @@ Upgrading? Check the [migration guide](#Migration-guide) before bumping to a new
10
10
 
11
11
  1. [Installation](#Installation)
12
12
  2. [Usage](#Usage)
13
- 1. [Authentication](#Authentication)
14
- 2. [Contacts](#Contacts)
15
- 3. [Events](#Events)
16
- 4. [Fields](#Fields)
17
- 5. [Webhooks](#Webhooks)
18
- 6. [Errors](#Errors)
13
+ 1. [Configuration](#Configuration)
14
+ 2. [Authentication](#Authentication)
15
+ 3. [Contacts](#Contacts)
16
+ 4. [Events](#Events)
17
+ 5. [Fields](#Fields)
18
+ 6. [Webhooks](#Webhooks)
19
+ 7. [Errors](#Errors)
19
20
  3. [Changelog](#Changelog)
20
21
  4. [Migration guide](#Migration-guide)
21
22
  1. [Upgrading from 1.2.x to 2.0.0](#Upgrading-from-1.2.x-to-2.0.0)
@@ -39,6 +40,19 @@ Or install it yourself as:
39
40
 
40
41
  ## Usage
41
42
 
43
+ ### Configuration
44
+
45
+ Before getting youre credentials, you need to configure client_id and client_secret as following:
46
+
47
+ ```ruby
48
+ RDStation.configure do |config|
49
+ config.client_id = YOUR_CLIENT_ID
50
+ config.client_secret = YOUR_CLIENT_SECRET
51
+ end
52
+ ```
53
+
54
+ For details on what `client_id` and `client_secret` are, check the [developers portal](https://developers.rdstation.com/en/authentication).
55
+
42
56
  ### Authentication
43
57
 
44
58
  For more details, check the [developers portal](https://developers.rdstation.com/en/authentication).
@@ -46,7 +60,7 @@ For more details, check the [developers portal](https://developers.rdstation.com
46
60
  #### Getting authentication URL
47
61
 
48
62
  ```ruby
49
- rdstation_authentication = RDStation::Authentication.new('client_id', 'client_secret')
63
+ rdstation_authentication = RDStation::Authentication.new
50
64
 
51
65
  redirect_url = 'https://yourapp.org/auth/callback'
52
66
  rdstation_authentication.auth_url(redirect_url)
@@ -57,17 +71,43 @@ rdstation_authentication.auth_url(redirect_url)
57
71
  You will need the code param that is returned from RD Station to your application after the user confirms the access at the authorization dialog.
58
72
 
59
73
  ```ruby
60
- rdstation_authentication = RDStation::Authentication.new('client_id', 'client_secret')
74
+ rdstation_authentication = RDStation::Authentication.new
61
75
  rdstation_authentication.authenticate(code_returned_from_rdstation)
76
+ # => { 'access_token' => '54321', 'expires_in' => 86_400, 'refresh_token' => 'refresh' }
62
77
  ```
63
78
 
64
- #### Updating access_token
79
+ #### Updating an expired access_token
65
80
 
66
81
  ```ruby
67
- rdstation_authentication = RDStation::Authentication.new('client_id', 'client_secret')
82
+ rdstation_authentication = RDStation::Authentication.new
68
83
  rdstation_authentication.update_access_token('refresh_token')
69
84
  ```
70
85
 
86
+ **NOTE**: This is done automatically when a request fails due to access_token expiration. To keep track of the new token, you have to provide a callback block in configuration. For example:
87
+
88
+ ```ruby
89
+ RDStation.configure do |config|
90
+ config.client_id = YOUR_CLIENT_ID
91
+ config.client_secret = YOUR_CLIENT_SECRET
92
+ config.on_access_token_refresh do |authorization|
93
+ # authorization.access_token_expires_in is the time (in seconds for with the token is valid)
94
+ # authorization.access_token is the new token
95
+ # authorization.refresh_token is the existing refresh_token
96
+ #
97
+ # If you are using ActiveRecord, you may want to update the stored access_token, like in the following code:
98
+ MyStoredAuth.where(refresh_token: authorization.refresh_token).update_all(access_token: authorization.access_token)
99
+ end
100
+ end
101
+ ```
102
+
103
+ #### Revoking an access_token
104
+
105
+ ```ruby
106
+ RDStation::Authentication.revoke(access_token: "your token")
107
+ ```
108
+
109
+ Note: this will completely remove your credentials from RD Station (`update_access_token` won't work anymore).
110
+
71
111
  ### Contacts
72
112
 
73
113
  #### Getting a Contact by UUID
@@ -75,7 +115,7 @@ rdstation_authentication.update_access_token('refresh_token')
75
115
  Returns data about a specific Contact
76
116
 
77
117
  ```ruby
78
- client = RDStation::Client.new(access_token: 'access_token')
118
+ client = RDStation::Client.new(access_token: 'access_token', refresh_token: 'refresh_token')
79
119
  client.contacts.by_uuid('uuid')
80
120
  ```
81
121
 
@@ -86,7 +126,7 @@ More info: https://developers.rdstation.com/pt-BR/reference/contacts#methodGetDe
86
126
  Returns data about a specific Contact
87
127
 
88
128
  ```ruby
89
- client = RDStation::Client.new(access_token: 'access_token')
129
+ client = RDStation::Client.new(access_token: 'access_token', refresh_token: 'refresh_token')
90
130
  client.contacts.by_email('email')
91
131
  ```
92
132
 
@@ -101,7 +141,7 @@ contact_info = {
101
141
  name: "Joe Foo"
102
142
  }
103
143
 
104
- client = RDStation::Client.new(access_token: 'access_token')
144
+ client = RDStation::Client.new(access_token: 'access_token', refresh_token: 'refresh_token')
105
145
  client.contacts.update('uuid', contact_info)
106
146
  ```
107
147
  Contact Default Parameters
@@ -131,7 +171,7 @@ contact_info = {
131
171
  identifier = "email"
132
172
  identifier_value = "joe@foo.bar"
133
173
 
134
- client = RDStation::Client.new(access_token: 'access_token')
174
+ client = RDStation::Client.new(access_token: 'access_token', refresh_token: 'refresh_token')
135
175
  client.contacts.upsert(identifier, identifier_value, contact_info)
136
176
  ```
137
177
 
@@ -151,7 +191,7 @@ This creates a new event on RDSM:
151
191
 
152
192
  ```ruby
153
193
  payload = {} # hash representing the payload
154
- client = RDStation::Client.new(access_token: 'access_token')
194
+ client = RDStation::Client.new(access_token: 'access_token', refresh_token: 'refresh_token')
155
195
  client.events.create(payload)
156
196
  ```
157
197
 
@@ -162,10 +202,59 @@ Endpoints to [manage Contact Fields](https://developers.rdstation.com/en/referen
162
202
  #### List all fields
163
203
 
164
204
  ```ruby
165
- client = RDStation::Client.new(access_token: 'access_token')
205
+ client = RDStation::Client.new(access_token: 'access_token', refresh_token: 'refresh_token')
166
206
  client.fields.all
167
207
  ```
168
208
 
209
+ #### Create a field
210
+
211
+ ```ruby
212
+ payload = {} # hash representing the payload
213
+ client = RDStation::Client.new(access_token: 'access_token', refresh_token: 'refresh_token')
214
+ client.fields.create payload
215
+ ```
216
+ Or you can use the new `RDStation::Builder::Field`
217
+
218
+ ```ruby
219
+ payload = {} # hash representing the payload
220
+ builder = RDStation::Builder::Field.new payload['api_identifier']
221
+ builder.data_type(payload['data_type'])
222
+ builder.presentation_type(payload['presentation_type'])
223
+ builder.name('pt-BR', payload['name'])
224
+ builder.label('pt-BR', payload['label'])
225
+
226
+ client = RDStation::Client.new(access_token: 'access_token', refresh_token: 'refresh_token')
227
+ client.fields.create builder.build
228
+ ```
229
+
230
+ #### Update a field
231
+
232
+ ```ruby
233
+ payload = {} # hash representing the payload
234
+ client = RDStation::Client.new(access_token: 'access_token', refresh_token: 'refresh_token')
235
+ client.fields.update('FIELD_UUID', payload)
236
+ ```
237
+ Or you can use the new `RDStation::Builder::Field`
238
+
239
+ ```ruby
240
+ payload = {} # hash representing the payload
241
+ builder = RDStation::Builder::Field.new payload['api_identifier']
242
+ builder.data_type(payload['data_type'])
243
+ builder.presentation_type(payload['presentation_type'])
244
+ builder.name('pt-BR', payload['name'])
245
+ builder.label('pt-BR', payload['label'])
246
+
247
+ client = RDStation::Client.new(access_token: 'access_token', refresh_token: 'refresh_token')
248
+ client.fields.update('FIELD_UUID', builder.build)
249
+ ```
250
+ #### Deleting a field
251
+
252
+ ```ruby
253
+ client = RDStation::Client.new(access_token: 'access_token', refresh_token: 'refresh_token')
254
+ client.fields.delete('FIELD_UUID')
255
+ ```
256
+
257
+
169
258
  ### Webhooks
170
259
 
171
260
  Webhooks provide the ability to receive real-time data updates about your contact activity.
@@ -175,14 +264,14 @@ Choose to receive data based on certain actions, re-cast or marked as an opportu
175
264
  #### List all webhooks
176
265
 
177
266
  ```ruby
178
- client = RDStation::Client.new(access_token: 'access_token')
267
+ client = RDStation::Client.new(access_token: 'access_token', refresh_token: 'refresh_token')
179
268
  client.webhooks.all
180
269
  ```
181
270
 
182
271
  #### Getting a webhook by UUID
183
272
 
184
273
  ```ruby
185
- client = RDStation::Client.new(access_token: 'access_token')
274
+ client = RDStation::Client.new(access_token: 'access_token', refresh_token: 'refresh_token')
186
275
  client.webhooks.by_uuid('WEBHOOK_UUID')
187
276
  ```
188
277
 
@@ -190,7 +279,7 @@ client.webhooks.by_uuid('WEBHOOK_UUID')
190
279
 
191
280
  ```ruby
192
281
  payload = {} # payload representing a webhook
193
- client = RDStation::Client.new(access_token: 'access_token')
282
+ client = RDStation::Client.new(access_token: 'access_token', refresh_token: 'refresh_token')
194
283
  client.webhooks.create(payload)
195
284
  ```
196
285
 
@@ -200,7 +289,7 @@ The required strucutre of the payload is [described here](https://developers.rds
200
289
 
201
290
  ```ruby
202
291
  payload = {} # payload representing a webhook
203
- client = RDStation::Client.new(access_token: 'access_token')
292
+ client = RDStation::Client.new(access_token: 'access_token', refresh_token: 'refresh_token')
204
293
  client.webhooks.create('WEBHOOK_UUID', payload)
205
294
  ```
206
295
 
@@ -209,7 +298,7 @@ The required strucutre of the payload is [described here](https://developers.rds
209
298
  #### Deleting a webhook
210
299
 
211
300
  ```ruby
212
- client = RDStation::Client.new(access_token: 'access_token')
301
+ client = RDStation::Client.new(access_token: 'access_token', refresh_token: 'refresh_token')
213
302
  client.webhooks.delete('WEBHOOK_UUID')
214
303
  ```
215
304
 
@@ -226,6 +315,7 @@ Each endpoint may raise errors accoording to the HTTP response code from RDStati
226
315
  - `RDStation::Error::Conflict` (409)
227
316
  - `RDStation::Error::UnsupportedMediaType` (415)
228
317
  - `RDStation::Error::UnprocessableEntity` (422)
318
+ - `RDStation::Error::TooManyRequests` (429)
229
319
  - `RDStation::Error::InternalServerError` (500)
230
320
  - `RDStation::Error::NotImplemented` (501)
231
321
  - `RDStation::Error::BadGateway` (502)
@@ -241,6 +331,8 @@ In cause of Unauthorized (401), the following specific errors may be raised (tho
241
331
  - `RDStation::Error::ExpiredCodeGrant`
242
332
  - `RDStation::Error::InvalidCredentials`
243
333
 
334
+ Any error class has a `details` method which returns the specific error message and the http_status.
335
+
244
336
  ## Changelog
245
337
 
246
338
  See [CHANGELOG.md](CHANGELOG.md)
@@ -255,7 +347,7 @@ So, here is a step-by-step guide on how to upgrade your app:
255
347
  - Ensure you're using `ruby >= 2.0.0`.
256
348
  - Remove every direct instantiation of `RDStation::Contacts`, `RDStation::Events`, `RDStation::Fields` and `RDStation::Webhooks` and use `RDStation::Client` to get them instead.
257
349
  - Replace any call of `RDStation::Client#create_lead`, `RDStation::Client#change_lead` or `RDStation::Client#change_lead_status` with the equivalent method in the [Contacts API](#Contacts).
258
- - Review your error handling, as [more options](CHANGELOG.md#Error-handling) are available now.
350
+ - Review your error handling, as [more options](CHANGELOG.md#Error-handling) are available now. `http_status` method will always return nil. To get the status now use `error.details[:http_status]` or check the type of the class.
259
351
 
260
352
  ## Contributing
261
353
 
@@ -4,8 +4,10 @@ require 'httparty'
4
4
  require 'rdstation/api_response'
5
5
 
6
6
  # API requests
7
+ require 'rdstation'
8
+ require 'rdstation/retryable_request'
7
9
  require 'rdstation/authentication'
8
- require 'rdstation/authorization_header'
10
+ require 'rdstation/authorization'
9
11
  require 'rdstation/client'
10
12
  require 'rdstation/contacts'
11
13
  require 'rdstation/events'
@@ -15,3 +17,6 @@ require 'rdstation/webhooks'
15
17
  # Error handling
16
18
  require 'rdstation/error'
17
19
  require 'rdstation/error_handler'
20
+
21
+ # Builders
22
+ require 'rdstation/builder/field'
@@ -0,0 +1,19 @@
1
+ module RDStation
2
+ class << self
3
+ attr_accessor :configuration
4
+
5
+ def configure
6
+ self.configuration ||= Configuration.new
7
+ yield(configuration)
8
+ end
9
+ end
10
+
11
+ class Configuration
12
+ attr_accessor :client_id, :client_secret
13
+ attr_reader :access_token_refresh_callback
14
+
15
+ def on_access_token_refresh(&block)
16
+ @access_token_refresh_callback = block
17
+ end
18
+ end
19
+ end