phaxio 0.5.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/.travis.yml +2 -1
  4. data/Gemfile +10 -0
  5. data/README.md +260 -73
  6. data/Rakefile +6 -16
  7. data/lib/phaxio.rb +47 -3
  8. data/lib/phaxio/client.rb +117 -484
  9. data/lib/phaxio/config.rb +31 -0
  10. data/lib/phaxio/error.rb +13 -0
  11. data/lib/phaxio/helpers/mime_type_helper.rb +14 -0
  12. data/lib/phaxio/resource.rb +168 -0
  13. data/lib/phaxio/resources.rb +7 -0
  14. data/lib/phaxio/resources/account.rb +41 -0
  15. data/lib/phaxio/resources/callback.rb +65 -0
  16. data/lib/phaxio/resources/fax.rb +310 -0
  17. data/lib/phaxio/resources/fax_recipient.rb +41 -0
  18. data/lib/phaxio/resources/phax_code.rb +89 -0
  19. data/lib/phaxio/resources/phone_number.rb +112 -0
  20. data/lib/phaxio/resources/public.rb +8 -0
  21. data/lib/phaxio/resources/public/area_code.rb +64 -0
  22. data/lib/phaxio/resources/public/country.rb +54 -0
  23. data/lib/phaxio/version.rb +1 -1
  24. data/phaxio.gemspec +9 -12
  25. data/spec/client_spec.rb +132 -0
  26. data/spec/helpers/mime_type_helper_spec.rb +11 -0
  27. data/spec/phaxio_spec.rb +20 -0
  28. data/spec/resources/account_spec.rb +24 -0
  29. data/spec/resources/callback_spec.rb +34 -0
  30. data/spec/resources/fax_spec.rb +227 -0
  31. data/spec/resources/phax_code_spec.rb +83 -0
  32. data/spec/resources/phone_number_spec.rb +89 -0
  33. data/spec/resources/public/area_code_spec.rb +24 -0
  34. data/spec/resources/public/country_spec.rb +24 -0
  35. data/spec/spec_helper.rb +6 -0
  36. data/spec/support/credentials.rb +7 -0
  37. data/spec/support/expectations.rb +9 -0
  38. data/spec/support/files/test.pdf +0 -0
  39. data/spec/support/vcr.rb +9 -0
  40. data/spec/support/vcr_cassettes/resources/account/status.yml +44 -0
  41. data/spec/support/vcr_cassettes/resources/fax/cancel.yml +46 -0
  42. data/spec/support/vcr_cassettes/resources/fax/create.yml +230 -0
  43. data/spec/support/vcr_cassettes/resources/fax/delete.yml +44 -0
  44. data/spec/support/vcr_cassettes/resources/fax/delete_file.yml +44 -0
  45. data/spec/support/vcr_cassettes/resources/fax/file.yml +251 -0
  46. data/spec/support/vcr_cassettes/resources/fax/get.yml +44 -0
  47. data/spec/support/vcr_cassettes/resources/fax/list.yml +56 -0
  48. data/spec/support/vcr_cassettes/resources/fax/resend.yml +46 -0
  49. data/spec/support/vcr_cassettes/resources/fax/test_receive.yml +231 -0
  50. data/spec/support/vcr_cassettes/resources/phax_code/create.yml +100 -0
  51. data/spec/support/vcr_cassettes/resources/phax_code/get.yml +190 -0
  52. data/spec/support/vcr_cassettes/resources/phone_number/create.yml +47 -0
  53. data/spec/support/vcr_cassettes/resources/phone_number/get.yml +45 -0
  54. data/spec/support/vcr_cassettes/resources/phone_number/list.yml +52 -0
  55. data/spec/support/vcr_cassettes/resources/phone_number/release.yml +44 -0
  56. data/spec/support/vcr_cassettes/resources/public/area_codes/list.yml +77 -0
  57. data/spec/support/vcr_cassettes/resources/public/country/list.yml +54 -0
  58. metadata +70 -82
  59. data/.ruby-version +0 -1
  60. data/CHANGELOG +0 -6
  61. data/test/files/test.pdf +0 -0
  62. data/test/integration/phaxio_integration_test.rb +0 -45
  63. data/test/support/responses/account_status.json +0 -9
  64. data/test/support/responses/cancel_success.json +0 -4
  65. data/test/support/responses/fax_status_success.json +0 -21
  66. data/test/support/responses/list_faxes.json +0 -68
  67. data/test/support/responses/list_numbers.json +0 -22
  68. data/test/support/responses/provision_number.json +0 -12
  69. data/test/support/responses/release_number.json +0 -7
  70. data/test/support/responses/send_failure.json +0 -8
  71. data/test/support/responses/send_success.json +0 -8
  72. data/test/support/responses/test.pdf +0 -0
  73. data/test/support/responses/test_receive.json +0 -4
  74. data/test/test_helper.rb +0 -57
  75. data/test/test_phaxio.rb +0 -128
@@ -1,502 +1,135 @@
1
- module Phaxio
2
- include HTTMultiParty
3
- base_uri 'https://api.phaxio.com/v1'
4
-
5
- module Config
6
- attr_accessor :api_key, :api_secret, :callback_token
7
- end
8
-
9
- module Client
10
- DIGEST = OpenSSL::Digest.new('sha1')
11
-
12
- # Public: Send a fax.
13
- #
14
- # options - The Hash options used to refine the selection (default: {}):
15
- # :to - The Phone Number (i.e. [country
16
- # code][number] or just a 10 digit
17
- # number in the US or Canada). Put
18
- # square brackets after parameter
19
- # name to send to multiple
20
- # recipients (e.g. to[]) (required).
21
- # :filename - A Ruby File of a document to fax
22
- # (supported file types: https://www.phaxio.com/faq#faq10)
23
- # :string_data - A String of html, plain text, or a
24
- # URL. If additional files are
25
- # specified as well, this data will
26
- # be included first in the fax
27
- # (optional).
28
- # :string_data_type - An enum of the type of the string
29
- # data that can be 'html', 'url', or
30
- # 'text'. If not specified, default
31
- # is 'text'. See string data
32
- # rendering for more info (optional).
33
- # :batch - The bool for running in batching
34
- # mode. If present and true, fax will
35
- # be sent in batching mode. Requires
36
- # batch_delay to be specified
37
- # (optional).
38
- # :batch_delay - The int the of amount of time, in
39
- # seconds, before the batch is fired.
40
- # Must be specified if batch=true.
41
- # Maximum delay is 3600 (1 hour)
42
- # (optional).
43
- # :batch_collision_avoidance - The bool for collision avoidance
44
- # with batches. If true when
45
- # batch=true, fax will be blocked
46
- # until the receiving machine is no
47
- # longer busy (optional).
48
- # :callback_url - The String url for the callback.
49
- # Overrides the globally set one
50
- # (optional).
51
- # :cancel_timeout - An int of the number of minutes
52
- # after which the fax will be
53
- # canceled if it hasn't yet
54
- # completed. Must be between 1 and 60
55
- # (optional).
56
- #
57
- # Examples
58
- #
59
- # Phaxio.send_fax(to: "0123456789", filename: File.new("docToSend.pdf"))
60
- #
61
- # Returns a HTTParty::Response object containing a success bool,
62
- # a String message, and an in faxID.
63
- def send_fax(options)
64
- send_post("/send", options)
65
- end
66
-
67
- # Public: Resend a fax.
68
- #
69
- # options - The Hash options used to refine the selection (default: {}):
70
- # :id - The int id of the fax you want to resend (required).
71
- #
72
- # Examples
73
- #
74
- # Phaxio.resend_fax(id: "123456")
75
- #
76
- # Returns a HTTParty::Response object containing a success bool,
77
- # a message string, and data containing the fax ID int.
78
- def resend_fax(options)
79
- send_post("/resendFax", options)
80
- end
81
-
82
- # Public: Test receiving a fax.
83
- #
84
- # options - The Hash options used to refine the selection (default: {}):
85
- # from_number - The Phone Number of the simulated sender
86
- # (optional).
87
- # to_number - The Phone Number receiving the fax (optional).
88
- # filename - A String containing the name of the PDF that has
89
- # a PhaxCode and is the file you want to simulate
90
- # sending (required).
91
- #
92
- # Examples
93
- #
94
- # Phaxio.test_receive(filename: "test_file.pdf")
95
- #
96
- # Returns a HTTParty::Response object containing a success bool
97
- # and a String message.
98
- def test_receive(options)
99
- send_post("/testReceive", options)
100
- end
101
-
102
- # Public: Provision a phone number that you can use to receive faxes in
103
- # your Phaxio account.
104
- #
105
- # options - The Hash options used to refine the selection (default: {}):
106
- # area_code - The integer area code of the number you'd like
107
- # to provision (required).
108
- # callback_url - A callback URL that Phaxio will post to when a
109
- # fax is received by this number. This will
110
- # override the global receive callback URL, if you
111
- # have one set (optional).
112
- #
113
- # Examples
114
- #
115
- # Phaxio.provision_number(area_code: 802)
116
- #
117
- # Returns a HTTParty::Response object containing a success bool, a string
118
- # message, and data containing the phone number, city, state, cost,
119
- # last_billed_at, and the date the number was provisioned at.
120
- def provision_number(options)
121
- send_post("/provisionNumber", options)
122
- end
123
-
124
- # Public: Release a phone number that you no longer need. Once a phone
125
- # number is released you will no longer be charged for it.
126
- #
127
- # options - The Hash options used to refine the selection (default: {}):
128
- # number - The String of the phone number you want to release
129
- # (required).
130
- #
131
- # Examples
132
- #
133
- # Phaxio.release_number(number: "8021112222")
134
- #
135
- # Returns a HTTParty::Response object containing a success bool and a
136
- # string message.
137
- def release_number(options)
138
- send_post("/releaseNumber", options)
139
- end
1
+ # @!macro [new] paging
2
+ # @note
3
+ # This action accepts paging parameters:
4
+ # - *per_page* [Integer] - The maximum number of results to return per
5
+ # call (i.e. "page"). Max 1000.
6
+ # - *page* [Integer] - The page number to return for the request. 1-based.
140
7
 
141
- # Public: Get a detailed list of the phone numbers you current own on
142
- # Phaxio.
143
- #
144
- # options - The Hash options used to refne th selection (default: {}):
145
- # area_code - An integer area code you'd like to filter by
146
- # (optional).
147
- # number - A String phone number you'd like to retrieve
148
- # (optional).
149
- #
150
- # Examples
151
- #
152
- # Phaxio.list_numbers # list all the numbers you own
153
- #
154
- # Phaxio.list_numbers(area_code: 802) # list all numbers in the 802 area
155
- #
156
- # Phaxio.list_numbers(number: "8021112222") # show specific number detail
157
- #
158
- # Returns a HTTParty::Reponse object containing a success bool, a message,
159
- # and the data attributes containing the queried phone number(s) details.
160
- def list_numbers(options = {})
161
- send_post("/numberList", options)
162
- end
163
-
164
- # Public: Get an image thumbnail or PDF file for a fax. For images to work
165
- # file storage must not be disabled with Phaxio.
166
- #
167
- # options - The Hash options used to refine the selection (default: {}):
168
- # id - The integer fax id of the fax you wish to retreive
169
- # (required).
170
- # type - An enum for the type return, defaults to 'p' (optional):
171
- # s - Small JPG format thumbnail of the fax, 129 x 167 px.
172
- # l - Large JPG format thumbnail of the fax, 300 x 388 px.
173
- # p - PDF version of the fax (default).
174
- #
175
- # Examples
176
- #
177
- # Phaxio.get_fax_file(id: 1234, type: p)
178
- # Phaxio.get_fax_file(id: 3254, type: l)
179
- #
180
- # Returns the fax as the type specified in the call, defaults to PDF.
181
- def get_fax_file(options)
182
- send_post("/faxFile", options)
183
- end
184
-
185
- # Public: List faxes within the specified time range.
186
- #
187
- # options - The Hash options used to refine the selection (default: {}):
188
- # start - The Unix Timestamp for the beginning of the range
189
- # (required).
190
- # end - The Unix Timestamp for the end of the range (required).
191
- #
192
- # Examples
193
- #
194
- # Phaxio.list_faxes(start: 1293861600, end: 1294034400)
195
- #
196
- # Returns a HTTParty::Response object containing a success bool, a string
197
- # message, paging information, and the fax data.
198
- def list_faxes(options)
199
- send_post("/faxList", options)
200
- end
201
-
202
- # Public: Get the status of a specific fax.
203
- #
204
- # options - The Hash options used to refine the selection (default: {}):
205
- # id - The int id of the fax you want to get the status of
206
- # (required).
207
- #
208
- # Examples
209
- #
210
- # Phaxio.get_fax_status(id: "123456")
211
- #
212
- # Returns a HTTParty::Response object containing a success bool,
213
- # a String message, and the data of the fax.
214
- def get_fax_status(options)
215
- if options[:id].nil?
216
- raise StandardError, "You must include a fax id."
8
+ module Phaxio
9
+ # @api private
10
+
11
+ class Client
12
+ class << self
13
+ # Makes a request to the Phaxio API.
14
+ #
15
+ # @param method [Symbol, String]
16
+ # The HTTP method for the request. Currently only `:get`, `:post`, and `:delete` are
17
+ # supported.
18
+ # @param endpoint [String]
19
+ # The endpoint for the API action, relative to `Phaxio::Config.api_endpoint`.
20
+ # @param params [Hash]
21
+ # Any parameters to be sent with the request.
22
+ #
23
+ # @return [Object]
24
+ # The `"data"` attribute of the deserialized JSON response. Varies based on the API action.
25
+ def request method, endpoint, params = {}
26
+ params = api_params params
27
+ begin
28
+ response = case method.to_s
29
+ when 'post' then post(endpoint, params)
30
+ when 'get' then get(endpoint, params)
31
+ when 'delete' then delete(endpoint, params)
32
+ else raise ArgumentError, "HTTP method `#{method}` is not supported."
33
+ end
34
+ handle_response response
35
+ rescue Faraday::ConnectionFailed, Faraday::TimeoutError, Faraday::SSLError => error
36
+ raise Error::ApiConnectionError, "Error communicating with Phaxio: #{error}"
37
+ end
217
38
  end
218
39
 
219
- send_post("/faxStatus", options)
220
- end
221
-
222
- # Public: Cancel a specific fax.
223
- #
224
- # options - The Hash options used to refine the selection (defaults: {}):
225
- # id - The int id of the fax you want to cancel (required).
226
- #
227
- # Examples
228
- #
229
- # Phaxio.cancel_fax(id: "123456")
230
- #
231
- # Returns a HTTParty::Response object containing a success bool
232
- # and a String message.
233
- def cancel_fax(options)
234
- send_post("/faxCancel", options)
235
- end
236
-
237
- # Public: Delete a specific fax.
238
- #
239
- # options - The hash options used to refine the selection (defaults: {}):
240
- # :id - The int ID of the fax you want to cancel
241
- # (required).
242
- # :files_only - The bool used to determine whether only the files
243
- # are deleted. If not specified, default is false
244
- # (optional).
245
- #
246
- # Examples
247
- #
248
- # Phaxio.delete_fax(id: 1234, files_only: true)
249
- #
250
- # Returns a HTTParty::Response object with success bool and message string.
251
- def delete_fax(options)
252
- send_post("/deleteFax", options)
253
- end
254
-
255
- # Public: Get the status of Client's account.
256
- #
257
- # Examples
258
- #
259
- # Phaxio.get_account_status
260
- #
261
- # Returns a HTTParty::Response object with success, message, and data
262
- # (containing faxes_sent_this_month, faxes_sent_today, and balance).
263
- def get_account_status
264
- send_post("/accountStatus", {})
265
- end
266
-
267
- # Public: Attach a PhaxCode to a PDF you provide.
268
- #
269
- # options - Type: hash. Options used to refine the action (default: {}):
270
- # x - Type: float. The x-coordinate (in PDF points*)
271
- # where the PhaxCode should be drawn. x=0 is at the
272
- # left-most point on the page. (required)
273
- # y - Type: float. The y-coordinate (in PDF points*)
274
- # where the PhaxCode should be drawn. Y=0 is the
275
- # bottom-most point on the page. (required)
276
- # filename - A Ruby File in PDF format (required)
277
- # metadata - Type: string. Custom metadata to be associated
278
- # with the created barcode. If not present, the
279
- # basic PhaxCode for your account will be used.
280
- # page_number - Type: integer. The page where the PhaxCode should
281
- # be drawn. 1-based.
282
- # *PDF points definition: A "point" is 1/72 of an inch. An
283
- # 8.5"x11" document is therefore 612 pt x 792 pt.
284
- #
285
- # Examples
286
- #
287
- # Phaxio.attach_phaxcode_to_pdf(
288
- # x: "0", y: "100", filename: File.new("input.pdf")
289
- # )
290
- #
291
- # Response: A PDF file containing a PhaxCode at the location specified.
292
- def attach_phaxcode_to_pdf(options)
293
- if options[:filename].nil?
294
- raise StandardError, 'You must include a PDF file.'
40
+ # @return [Faraday::Connection] A new Faraday connection to `Phaxio::Config.api_endpoint`.
41
+ def conn
42
+ Faraday.new(Phaxio.api_endpoint) do |conn|
43
+ conn.request :multipart
44
+ conn.request :url_encoded
45
+ conn.adapter :net_http
46
+ end
295
47
  end
296
48
 
297
- if options[:x] < 0 || options[:y] < 0
298
- raise StandardError, 'Coordinates must be greater than or equal to 0.'
49
+ private
50
+
51
+ def handle_response response
52
+ content_type = response.headers[:content_type]
53
+
54
+ if content_type.start_with? 'application/json'
55
+ body = JSON.parse(response.body).with_indifferent_access
56
+ else
57
+ extension = MimeTypeHelper.extension_for_mimetype content_type
58
+ filename = File.join(
59
+ Dir.tmpdir,
60
+ Dir::Tmpname.make_tmpname('phaxio-', "download.#{extension}")
61
+ )
62
+ File.open(filename, 'wb') { |file| file.write response.body }
63
+ body = {'success' => response.success?, 'data' => File.open(filename, 'rb')}
64
+ end
65
+
66
+ if response.success?
67
+ raise(Error::GeneralError, body['message']) unless body['success']
68
+
69
+ # Check if this is a response with paging. If so, we want to return that along with the
70
+ # data.
71
+ if body.key? 'paging'
72
+ {'data' => body['data'], 'paging' => body['paging']}
73
+ else
74
+ body['data']
75
+ end
76
+ else
77
+ status = response.status
78
+ # TODO: Handle blank message
79
+ message = body['message']
80
+
81
+ case status
82
+ when 401
83
+ raise Error::AuthenticationError, "#{status}: #{message}"
84
+ when 404
85
+ raise Error::NotFoundError, "#{status}: #{message}"
86
+ when 422
87
+ raise Error::InvalidRequestError, "#{status}: #{message}"
88
+ when 429
89
+ raise Error::RateLimitExceededError, "#{status}: #{message}"
90
+ else
91
+ raise Error::GeneralError, "#{status}: #{message}"
92
+ end
93
+ end
299
94
  end
300
95
 
301
- send_post('/attachPhaxCodeToPdf', options)
302
- end
96
+ def post endpoint, params = {}
97
+ # Handle file params
98
+ params.each do |k, v|
99
+ next unless k.to_s == 'file'
100
+ mime_type = MimeTypeHelper.mimetype_for_file v.path
101
+ params[k] = Faraday::UploadIO.new v, mime_type
102
+ end
303
103
 
304
- # Public: Create a custom PhaxCode.
305
- #
306
- # options - Type: hash. Options used to refine the action (default: {}):
307
- # metadata - Type: string. Custom metadata to be associated with
308
- # this barcode. If not present, the basic PhaxCode for
309
- # your account will be used. (optional)
310
- # redirect - Type: boolean. If present and true, the PhaxCode
311
- # barcode image will be dumped in the response.
312
- # (optional)
313
- #
314
- # Example:
315
- # Phaxio.create_phaxcode(metadata: "sale_id=44")
316
- #
317
- # Response: If the redirect parameter is not provided, a JSON object with
318
- # success, message, and data attributes is returned. The data
319
- # attribute contains a url where the PhaxCode barcode image can be
320
- # accessed. Otherwise, the image data is dumped in the response.
321
- def create_phaxcode(options = {})
322
- send_post('/createPhaxCode', options)
323
- end
324
-
325
- # Public: Get a Hosted Document with PhaxCode included
326
- #
327
- # Note: You will have to set up the hosted document with Phaxio (along with
328
- # the relevant PhaxCode) before calling this method.
329
- #
330
- # options - Type: hash. Options used to refine the action (default: {}):
331
- # name - Type: string. The name of a hosted document.
332
- # (required)
333
- # metadata - Type: string. Custom metadata to be associated with
334
- # the PhaxCode that will be attached to the hosted
335
- # document. If not present, the basic PhaxCode for your
336
- # account will be used.
337
- # (optional)
338
- #
339
- # Example:
340
- # Phaxio.get_hosted_document(name:"business_fax")
341
- #
342
- # Response: A PDF copy of the hosted document with a PhaxCode included at
343
- # the pre-specified location.
344
- def get_hosted_document(options)
345
- if options[:name].nil?
346
- raise StandardError, 'You must include the name of the hosted document.'
104
+ conn.post endpoint, params
347
105
  end
348
106
 
349
- send_post('/getHostedDocument', options)
350
- end
351
-
352
- # Public: Get a list of supported countries for sending faxes
353
- #
354
- # Note: This method doesn't require API keys and is included for the sake of
355
- # completion.
356
- #
357
- # Example:
358
- # Phaxio.supported_countries
359
- #
360
- # Response: A JSON object with success, message, and data attributes. The
361
- # data attribute contains a hash, where the key contains the name
362
- # of the country, and the value is a hash of attributes for the
363
- # country (currently only pricing information).
364
- #
365
- # Example Response:
366
- # {
367
- # "success": true,
368
- # "message": "Data contains supported countries.",
369
- # "data": {
370
- # "United States": {
371
- # "price_per_page": 7
372
- # },
373
- # "Canada": {
374
- # "price_per_page": 7
375
- # },
376
- # "United Kingdom": {
377
- # "price_per_page": 10
378
- # },
379
- # ...
380
- # }
381
- # }
382
- def supported_countries
383
- post('/supportedCountries')
384
- end
385
-
386
- # Public: List area codes available for purchasing numbers
387
- #
388
- # Note: This method doesn't require API keys and is included for the sake of
389
- # completion.
390
- #
391
- # options - Type: hash. Options used to refine the query (default: {}):
392
- # is_toll_free - Type: boolean. Will only return toll free area
393
- # codes. (optional)
394
- # state - Type: string. A two character state or province
395
- # abbreviation (e.g. IL or YT). Will only return
396
- # area codes for this state. (optional)
397
- #
398
- # Response: A JSON object with success, message, and data attributes. The
399
- # data attribute contains a map of area codes to city and state.
400
- #
401
- # Example response:
402
- # {
403
- # "success": true,
404
- # "message": "295 area codes available.",
405
- # "data": {
406
- # "201": {
407
- # "city": "Bayonne, Jersey City, Union City",
408
- # "state": "New Jersey"
409
- # },
410
- # "202": {
411
- # "city": "Washington",
412
- # "state": "District Of Columbia"
413
- # },
414
- # ... a lot more area codes here...
415
- # }
416
- # }
417
- def area_codes(options = {})
418
- post('/areaCodes', options)
419
- end
420
-
421
- def send_post(path, options)
422
- post(
423
- path, query: options.merge!(api_key: api_key, api_secret: api_secret)
424
- )
425
- end
426
-
427
- # Public: Check the signature of the signed request.
428
- #
429
- # signature - Type: string. The X-Phaxio-Signature HTTP header value.
430
- # url - Type: string. The full URL that was called by Phaxio,
431
- # including the query. (required)
432
- # params - Type: hash. The POSTed form data (required)
433
- # files - Type: array. Submitted files (required - "received" fax
434
- # callback only)
435
- #
436
- # Returns true if the signature matches the signed request, otherwise false
437
- def valid_callback_signature?(signature, url, params, files = [])
438
- check_signature = generate_check_signature(url, params, files)
439
- check_signature == signature
440
- end
441
-
442
- # Public: Generate a signature using the request data and callback token
443
- #
444
- # url - Type: string. The full URL that was called by Phaxio,
445
- # including the query. (required)
446
- # params - Type: hash. The POSTed form data (required)
447
- # files - Type: array. Submitted files (required - "received" fax
448
- # callback only)
449
- #
450
- # Retuns a signature based on the request data and configured callback
451
- # token, which can then be compared with the request signature.
452
- def generate_check_signature(url, params, files = [])
453
- params_string = generate_params_string(params)
454
- file_string = generate_files_string(files)
455
- callback_data = "#{url}#{params_string}#{file_string}"
456
- OpenSSL::HMAC.hexdigest(DIGEST, callback_token, callback_data)
457
- end
107
+ def get endpoint, params = {}
108
+ conn.get endpoint, params
109
+ end
458
110
 
459
- private
111
+ def delete endpoint, params = {}
112
+ conn.delete endpoint, params
113
+ end
460
114
 
461
- def generate_params_string(params)
462
- sorted_params = params.sort_by { |key, _value| key }
463
- params_strings = sorted_params.map { |key, value| "#{key}#{value}" }
464
- params_strings.join
465
- end
115
+ def api_params params
116
+ params = default_params.merge params
466
117
 
467
- def generate_files_string(files)
468
- files_array = files_to_array(files).reject(&:nil?)
469
- sorted_files = files_array.sort_by { |file| file[:name] }
470
- files_strings = sorted_files.map { |file| generate_file_string(file) }
471
- files_strings.join
472
- end
118
+ # Convert times to ISO 8601
119
+ params.each do |k, v|
120
+ next unless v.kind_of?(Time) || v.kind_of?(Date)
121
+ params[k] = v.to_datetime.iso8601
122
+ end
473
123
 
474
- def files_to_array(files)
475
- files.is_a?(Array) ? files : [files]
476
- end
124
+ params
125
+ end
477
126
 
478
- def generate_file_string(file)
479
- file[:name] + DIGEST.hexdigest(file[:tempfile].read)
127
+ def default_params
128
+ {
129
+ api_key: Phaxio.api_key,
130
+ api_secret: Phaxio.api_secret
131
+ }
132
+ end
480
133
  end
481
134
  end
482
-
483
- # Public: Configure Phaxio with your api_key, api_secret, and the callback
484
- # token provided in your Phaxio account (to verify that requests are
485
- # coming from Phaxio).
486
- #
487
- # Examples
488
- #
489
- # Phaxio.config do |config|
490
- # config.api_key = '12345678910'
491
- # config.api_secret = '10987654321'
492
- # config.callback_token = '32935829'
493
- # end
494
- #
495
- # Returns nothing.
496
- def self.config
497
- yield(self)
498
- end
499
-
500
- extend Client
501
- extend Config
502
135
  end