phaxio 2.0.0 → 2.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 +5 -5
- data/Gemfile +2 -1
- data/README.md +53 -20
- data/lib/phaxio/client.rb +46 -16
- data/lib/phaxio/config.rb +7 -5
- data/lib/phaxio/resource.rb +11 -5
- data/lib/phaxio/resources/account.rb +1 -1
- data/lib/phaxio/resources/ata.rb +285 -0
- data/lib/phaxio/resources/callback.rb +10 -56
- data/lib/phaxio/resources/fax.rb +11 -11
- data/lib/phaxio/resources/phax_code.rb +2 -2
- data/lib/phaxio/resources/phone_number.rb +31 -5
- data/lib/phaxio/resources/port_number.rb +42 -0
- data/lib/phaxio/resources/port_number_note.rb +51 -0
- data/lib/phaxio/resources/port_order.rb +172 -0
- data/lib/phaxio/resources/public/area_code.rb +1 -1
- data/lib/phaxio/resources/public/country.rb +1 -1
- data/lib/phaxio/resources/webhook.rb +65 -0
- data/lib/phaxio/version.rb +1 -1
- data/lib/phaxio.rb +13 -3
- data/phaxio.gemspec +2 -1
- data/spec/client_spec.rb +38 -6
- data/spec/phaxio_spec.rb +7 -1
- data/spec/resources/account_spec.rb +1 -7
- data/spec/resources/ata_spec.rb +207 -0
- data/spec/resources/fax_spec.rb +42 -89
- data/spec/resources/phax_code_spec.rb +26 -32
- data/spec/resources/phone_number_spec.rb +19 -30
- data/spec/resources/port_number_note_spec.rb +33 -0
- data/spec/resources/port_number_spec.rb +32 -0
- data/spec/resources/port_order_spec.rb +76 -0
- data/spec/resources/public/area_code_spec.rb +1 -1
- data/spec/resources/public/country_spec.rb +1 -7
- data/spec/resources/{callback_spec.rb → webhook_spec.rb} +8 -8
- data/spec/spec_helper.rb +1 -0
- data/spec/support/{vcr_cassettes/resources/account/status.yml → cassettes/account/get.yml} +13 -14
- data/spec/support/cassettes/ata/add_phone_number.yml +89 -0
- data/spec/support/cassettes/ata/create.yml +46 -0
- data/spec/support/cassettes/ata/delete.yml +86 -0
- data/spec/support/cassettes/ata/get.yml +87 -0
- data/spec/support/cassettes/ata/list.yml +67 -0
- data/spec/support/cassettes/ata/provisioning_urls.yml +43 -0
- data/spec/support/cassettes/ata/reference.yml +87 -0
- data/spec/support/cassettes/ata/regenerate.yml +89 -0
- data/spec/support/cassettes/ata/remove_phone_number.yml +130 -0
- data/spec/support/cassettes/ata/update.yml +89 -0
- data/spec/support/cassettes/fax/cancel.yml +90 -0
- data/spec/support/cassettes/fax/create.yml +48 -0
- data/spec/support/cassettes/fax/delete.yml +88 -0
- data/spec/support/cassettes/fax/delete_file.yml +88 -0
- data/spec/support/cassettes/fax/file.yml +93 -0
- data/spec/support/cassettes/fax/get.yml +88 -0
- data/spec/support/cassettes/fax/list.yml +49 -0
- data/spec/support/cassettes/fax/reference.yml +88 -0
- data/spec/support/cassettes/fax/resend.yml +90 -0
- data/spec/support/cassettes/fax/test_receive.yml +49 -0
- data/spec/support/{vcr_cassettes/resources/fax/resend.yml → cassettes/phax_code/create.yml} +14 -15
- data/spec/support/cassettes/phax_code/create_png.yml +50 -0
- data/spec/support/cassettes/phax_code/get_by_id.yml +86 -0
- data/spec/support/{vcr_cassettes/resources/fax/delete.yml → cassettes/phax_code/get_default.yml} +14 -15
- data/spec/support/cassettes/phax_code/get_default_png.yml +48 -0
- data/spec/support/cassettes/phax_code/get_png_by_id.yml +90 -0
- data/spec/support/{vcr_cassettes/resources → cassettes}/phone_number/create.yml +15 -16
- data/spec/support/cassettes/phone_number/get.yml +44 -0
- data/spec/support/cassettes/phone_number/list.yml +72 -0
- data/spec/support/cassettes/phone_number/reference.yml +45 -0
- data/spec/support/cassettes/phone_number/release.yml +86 -0
- data/spec/support/cassettes/port_number/get.yml +88 -0
- data/spec/support/cassettes/port_number_note/list.yml +88 -0
- data/spec/support/cassettes/port_order/create.yml +48 -0
- data/spec/support/cassettes/port_order/get.yml +91 -0
- data/spec/support/cassettes/port_order/list.yml +52 -0
- data/spec/support/{vcr_cassettes/resources/public/area_codes → cassettes/public/area_code}/list.yml +18 -18
- data/spec/support/{vcr_cassettes/resources → cassettes}/public/country/list.yml +14 -15
- data/spec/support/files/test.txt +1 -0
- data/spec/support/vcr.rb +25 -8
- metadata +125 -31
- data/spec/support/credentials.rb +0 -7
- data/spec/support/vcr_cassettes/resources/fax/cancel.yml +0 -46
- data/spec/support/vcr_cassettes/resources/fax/create.yml +0 -230
- data/spec/support/vcr_cassettes/resources/fax/delete_file.yml +0 -44
- data/spec/support/vcr_cassettes/resources/fax/file.yml +0 -251
- data/spec/support/vcr_cassettes/resources/fax/get.yml +0 -44
- data/spec/support/vcr_cassettes/resources/fax/list.yml +0 -56
- data/spec/support/vcr_cassettes/resources/fax/test_receive.yml +0 -231
- data/spec/support/vcr_cassettes/resources/phax_code/create.yml +0 -100
- data/spec/support/vcr_cassettes/resources/phax_code/get.yml +0 -190
- data/spec/support/vcr_cassettes/resources/phone_number/get.yml +0 -45
- data/spec/support/vcr_cassettes/resources/phone_number/list.yml +0 -52
- data/spec/support/vcr_cassettes/resources/phone_number/release.yml +0 -44
data/lib/phaxio/resources/fax.rb
CHANGED
|
@@ -84,7 +84,7 @@ module Phaxio
|
|
|
84
84
|
attr_accessor :id
|
|
85
85
|
|
|
86
86
|
# Gets the referenced fax.
|
|
87
|
-
# @return [Phaxio::
|
|
87
|
+
# @return [Phaxio::Resources::Fax]
|
|
88
88
|
# The referenced Fax.
|
|
89
89
|
def get
|
|
90
90
|
Fax.get self
|
|
@@ -120,7 +120,7 @@ module Phaxio
|
|
|
120
120
|
# @return [Phaxio::Resource::Collection<Phaxio::Resources::Fax>]
|
|
121
121
|
# The collection of faxes matching your request.
|
|
122
122
|
# @raise [Phaxio::Error::PhaxioError]
|
|
123
|
-
# @see https://www.phaxio.com/docs/api/v2/faxes/list_faxes
|
|
123
|
+
# @see https://www.phaxio.com/docs/api/v2.1/faxes/list_faxes
|
|
124
124
|
def list params = {}
|
|
125
125
|
response = Client.request :get, faxes_endpoint, params
|
|
126
126
|
response_collection response
|
|
@@ -159,8 +159,8 @@ module Phaxio
|
|
|
159
159
|
# @return [Phaxio::Resources::Fax]
|
|
160
160
|
# The created fax.
|
|
161
161
|
# @raise [Phaxio::Error::PhaxioError]
|
|
162
|
-
# @see https://www.phaxio.com/docs/api/v2/faxes/create_and_send_fax
|
|
163
|
-
# @see https://www.phaxio.com/docs/api/v2/faxes/batching
|
|
162
|
+
# @see https://www.phaxio.com/docs/api/v2.1/faxes/create_and_send_fax
|
|
163
|
+
# @see https://www.phaxio.com/docs/api/v2.1/faxes/batching
|
|
164
164
|
def create params = {}
|
|
165
165
|
response = Client.request :post, faxes_endpoint, params
|
|
166
166
|
response_reference response
|
|
@@ -174,7 +174,7 @@ module Phaxio
|
|
|
174
174
|
# A hash of parameters to send to Phaxio. This action takes no unique parameters.
|
|
175
175
|
# @return [Phaxio::Resource::Fax] The requested fax.
|
|
176
176
|
# @raise [Phaxio::Error::PhaxioError]
|
|
177
|
-
# @see https://www.phaxio.com/docs/api/v2/faxes/get_fax
|
|
177
|
+
# @see https://www.phaxio.com/docs/api/v2.1/faxes/get_fax
|
|
178
178
|
def get id, params = {}
|
|
179
179
|
response = Client.request :get, fax_endpoint(id.to_i), params
|
|
180
180
|
response_record response
|
|
@@ -191,7 +191,7 @@ module Phaxio
|
|
|
191
191
|
# @return [Phaxio::Resources::Fax::Reference]
|
|
192
192
|
# A reference to the canceled fax.
|
|
193
193
|
# @raise [Phaxio::Error::PhaxioError]
|
|
194
|
-
# @see https://www.phaxio.com/docs/api/v2/faxes/cancel
|
|
194
|
+
# @see https://www.phaxio.com/docs/api/v2.1/faxes/cancel
|
|
195
195
|
def cancel id, params = {}
|
|
196
196
|
response = Client.request :post, cancel_fax_endpoint(id), params
|
|
197
197
|
response_reference response
|
|
@@ -207,7 +207,7 @@ module Phaxio
|
|
|
207
207
|
# @return [Phaxio::Resources::Fax::Reference]
|
|
208
208
|
# A reference to the resent fax.
|
|
209
209
|
# @raise [Phaxio::Error::PhaxioError]
|
|
210
|
-
# @see https://www.phaxio.com/docs/api/v2/faxes/resend
|
|
210
|
+
# @see https://www.phaxio.com/docs/api/v2.1/faxes/resend
|
|
211
211
|
def resend id, params = {}
|
|
212
212
|
response = Client.request :post, resend_fax_endpoint(id), params
|
|
213
213
|
response_reference response
|
|
@@ -221,7 +221,7 @@ module Phaxio
|
|
|
221
221
|
# parameters.
|
|
222
222
|
# @return [true]
|
|
223
223
|
# @raise [Phaxio::Error::PhaxioError]
|
|
224
|
-
# @see https://www.phaxio.com/docs/api/v2/faxes/delete_fax
|
|
224
|
+
# @see https://www.phaxio.com/docs/api/v2.1/faxes/delete_fax
|
|
225
225
|
def delete id, params = {}
|
|
226
226
|
Client.request :delete, fax_endpoint(id), params
|
|
227
227
|
true
|
|
@@ -235,7 +235,7 @@ module Phaxio
|
|
|
235
235
|
# parameters.
|
|
236
236
|
# @return [true]
|
|
237
237
|
# @raise [Phaxio::Error::PhaxioError]
|
|
238
|
-
# @see https://www.phaxio.com/docs/api/v2/faxes/delete_fax_file
|
|
238
|
+
# @see https://www.phaxio.com/docs/api/v2.1/faxes/delete_fax_file
|
|
239
239
|
def delete_file id, params = {}
|
|
240
240
|
Client.request :delete, fax_file_endpoint(id), params
|
|
241
241
|
true
|
|
@@ -252,7 +252,7 @@ module Phaxio
|
|
|
252
252
|
# @return [File]
|
|
253
253
|
# The requested fax file.
|
|
254
254
|
# @raise [Phaxio::Error::PhaxioError]
|
|
255
|
-
# @see https://www.phaxio.com/docs/api/v2/faxes/get_fax_file
|
|
255
|
+
# @see https://www.phaxio.com/docs/api/v2.1/faxes/get_fax_file
|
|
256
256
|
def file id, params = {}
|
|
257
257
|
Client.request :get, fax_file_endpoint(id), params
|
|
258
258
|
end
|
|
@@ -269,7 +269,7 @@ module Phaxio
|
|
|
269
269
|
# number. Default is the public Phaxio phone number.
|
|
270
270
|
# @return [true]
|
|
271
271
|
# @raise [Phaxio::Error::PhaxioError]
|
|
272
|
-
# @see https://www.phaxio.com/docs/api/v2/faxes/test_receive
|
|
272
|
+
# @see https://www.phaxio.com/docs/api/v2.1/faxes/test_receive
|
|
273
273
|
def test_receive params = {}
|
|
274
274
|
Client.request :post, faxes_endpoint, test_receive_params(params)
|
|
275
275
|
true
|
|
@@ -28,7 +28,7 @@ module Phaxio
|
|
|
28
28
|
# file instead of a PhaxCode object.
|
|
29
29
|
# @return [Phaxio::Resources::PhaxCode | File] The created PhaxCode
|
|
30
30
|
# @raise [Phaxio::Error::PhaxioError]
|
|
31
|
-
# @see https://www.phaxio.com/docs/api/v2/phaxcodes/create_phax_code
|
|
31
|
+
# @see https://www.phaxio.com/docs/api/v2.1/phaxcodes/create_phax_code
|
|
32
32
|
def create params = {}
|
|
33
33
|
endpoint = case (params[:type] || params['type']).to_s
|
|
34
34
|
when 'png' then phax_codes_endpoint_png
|
|
@@ -48,7 +48,7 @@ module Phaxio
|
|
|
48
48
|
# PhaxCode object.
|
|
49
49
|
# @return [Phaxio::Resources::PhaxCode | File]
|
|
50
50
|
# @raise [Phaxio::Error::PhaxioError]
|
|
51
|
-
# @see https://www.phaxio.com/docs/api/v2/phaxcodes/retrieve_phax_code
|
|
51
|
+
# @see https://www.phaxio.com/docs/api/v2.1/phaxcodes/retrieve_phax_code
|
|
52
52
|
def get params = {}
|
|
53
53
|
identifier = params[:identifier] || params['identifier']
|
|
54
54
|
endpoint = case (identifier)
|
|
@@ -33,6 +33,32 @@ module Phaxio
|
|
|
33
33
|
|
|
34
34
|
has_time_attributes %w(provisioned_at last_billed_at)
|
|
35
35
|
|
|
36
|
+
# A reference to a phone number, returned by some actions.
|
|
37
|
+
class Reference
|
|
38
|
+
# @return [String]
|
|
39
|
+
# The phone number in E.164 format.
|
|
40
|
+
attr_accessor :phone_number
|
|
41
|
+
|
|
42
|
+
def to_s
|
|
43
|
+
phone_number
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Gets the referenced phone number.
|
|
47
|
+
# @return [Phaxio::Resources::PhoneNumber]
|
|
48
|
+
# The referenced phone number.
|
|
49
|
+
def get
|
|
50
|
+
PhoneNumber.get self
|
|
51
|
+
end
|
|
52
|
+
alias :retrieve :get
|
|
53
|
+
alias :find :get
|
|
54
|
+
|
|
55
|
+
private
|
|
56
|
+
|
|
57
|
+
def initialize phone_number
|
|
58
|
+
self.phone_number = phone_number
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
36
62
|
private
|
|
37
63
|
|
|
38
64
|
class << self
|
|
@@ -44,7 +70,7 @@ module Phaxio
|
|
|
44
70
|
# - *callback_url* [String] - A callback URL that we'll post to when a fax is received by this number. This will override the global receive callback URL, if you have one specified.
|
|
45
71
|
# @return [Phaxio::Resources::PhoneNumber] The newly provisioned number.
|
|
46
72
|
# @raise [Phaxio::Error::PhaxioError]
|
|
47
|
-
# @see https://www.phaxio.com/docs/api/v2/phone_numbers/provision
|
|
73
|
+
# @see https://www.phaxio.com/docs/api/v2.1/phone_numbers/provision
|
|
48
74
|
def create params = {}
|
|
49
75
|
response = Client.request :post, phone_numbers_endpoint, params
|
|
50
76
|
response_record response
|
|
@@ -58,9 +84,9 @@ module Phaxio
|
|
|
58
84
|
# A hash of parameters to send to Phaxio. This action has no unique parameters.
|
|
59
85
|
# @return [Phaxio::Resources::PhoneNumber] The requested number.
|
|
60
86
|
# @raise [Phaxio::Error::PhaxioError]
|
|
61
|
-
# @see https://www.phaxio.com/docs/api/v2/phone_numbers/get_number
|
|
87
|
+
# @see https://www.phaxio.com/docs/api/v2.1/phone_numbers/get_number
|
|
62
88
|
def get phone_number, params = {}
|
|
63
|
-
response = Client.request :get, phone_number_endpoint(phone_number), params
|
|
89
|
+
response = Client.request :get, phone_number_endpoint(phone_number.to_s), params
|
|
64
90
|
response_record response
|
|
65
91
|
end
|
|
66
92
|
alias :find :get
|
|
@@ -76,7 +102,7 @@ module Phaxio
|
|
|
76
102
|
# @return [Phaxio::Resource::Collection<Phaxio::Resources::PhoneNumber>]
|
|
77
103
|
# A collection of phone numbers.
|
|
78
104
|
# @raise [Phaxio::Error::PhaxioError]
|
|
79
|
-
# @see https://www.phaxio.com/docs/api/v2/phone_numbers/list
|
|
105
|
+
# @see https://www.phaxio.com/docs/api/v2.1/phone_numbers/list
|
|
80
106
|
def list params = {}
|
|
81
107
|
response = Client.request :get, phone_numbers_endpoint, params
|
|
82
108
|
response_collection response
|
|
@@ -90,7 +116,7 @@ module Phaxio
|
|
|
90
116
|
# A hash of parameters to send to Phaxio. This action has no unique parameters.
|
|
91
117
|
# @return true
|
|
92
118
|
# @raise [Phaxio::Error::PhaxioError]
|
|
93
|
-
# @see https://www.phaxio.com/docs/api/v2/phone_numbers/release
|
|
119
|
+
# @see https://www.phaxio.com/docs/api/v2.1/phone_numbers/release
|
|
94
120
|
def delete phone_number, params = {}
|
|
95
121
|
Client.request :delete, phone_number_endpoint(phone_number), params
|
|
96
122
|
true
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
module Phaxio
|
|
2
|
+
module Resources
|
|
3
|
+
# Provides functionality for viewing port numbers.
|
|
4
|
+
class PortNumber < Resource
|
|
5
|
+
PORT_NUMBERS_PATH = 'port_numbers'.freeze
|
|
6
|
+
private_constant :PORT_NUMBERS_PATH
|
|
7
|
+
|
|
8
|
+
# @return [Integer] the ID associated with this number.
|
|
9
|
+
# @!attribute id
|
|
10
|
+
|
|
11
|
+
# @return [String] the E.164 number.
|
|
12
|
+
# @!attribute port_number
|
|
13
|
+
|
|
14
|
+
# @return [String] the status of this number.
|
|
15
|
+
# @!attribute status
|
|
16
|
+
|
|
17
|
+
has_normal_attributes %w(id port_number status)
|
|
18
|
+
|
|
19
|
+
class << self
|
|
20
|
+
# Get port number info.
|
|
21
|
+
# @param id [Integer] The ID of the number to retrieve.
|
|
22
|
+
# @param params [Hash]
|
|
23
|
+
# A hash of parameters to send to Phaxio. This action takes no unique parameters.
|
|
24
|
+
# @return [Phaxio::Resource::PortNumber]
|
|
25
|
+
# @raise [Phaxio::Error::PhaxioError]
|
|
26
|
+
# @see https://www.phaxio.com/docs/api/v2/port_numbers/get_port_number
|
|
27
|
+
def get id, params = {}
|
|
28
|
+
response = Client.request :get, port_number_endpoint(id.to_i), params
|
|
29
|
+
response_record response
|
|
30
|
+
end
|
|
31
|
+
alias :retrieve :get
|
|
32
|
+
alias :find :get
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
def port_number_endpoint id
|
|
37
|
+
"#{PORT_NUMBERS_PATH}/#{id}"
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
module Phaxio
|
|
2
|
+
module Resources
|
|
3
|
+
# Provides functionality for viewing port number notes.
|
|
4
|
+
class PortNumberNote < Resource
|
|
5
|
+
PORT_NUMBERS_PATH = 'port_numbers'.freeze
|
|
6
|
+
private_constant :PORT_NUMBERS_PATH
|
|
7
|
+
NOTES_PATH = 'notes'.freeze
|
|
8
|
+
private_constant :NOTES_PATH
|
|
9
|
+
|
|
10
|
+
# @return [Integer] the ID associated with this note.
|
|
11
|
+
# @!attribute id
|
|
12
|
+
|
|
13
|
+
# @return [String] the author of this note.
|
|
14
|
+
# @!attribute author
|
|
15
|
+
|
|
16
|
+
# @return [String] the content of the note
|
|
17
|
+
# @!attribute note
|
|
18
|
+
|
|
19
|
+
has_normal_attributes %w[id note author]
|
|
20
|
+
|
|
21
|
+
# @return [Time] the time this note was created.
|
|
22
|
+
# @!attribute created_at
|
|
23
|
+
|
|
24
|
+
# @return [Time] the time this note was updated.
|
|
25
|
+
# @!attribute updated_at
|
|
26
|
+
|
|
27
|
+
has_time_attributes %w[created_at updated_at]
|
|
28
|
+
|
|
29
|
+
class << self
|
|
30
|
+
# List notes for a port number.
|
|
31
|
+
# @param port_number_id [Integer]
|
|
32
|
+
# The ID of the port number to list notes for.
|
|
33
|
+
# @param params [Hash]
|
|
34
|
+
# Any parameters to send to Phaxio. This action takes no unique parameters.
|
|
35
|
+
# @return [Phaxio::Resource::Collection<Phaxio::Resources::PortNumberNote>]
|
|
36
|
+
# @raise [Phaxio::Error::PhaxioError]
|
|
37
|
+
# @see https://www.phaxio.com/docs/api/v2/port_number_notes/list_notes
|
|
38
|
+
def list port_number_id, params = {}
|
|
39
|
+
response = Client.request :get, port_number_notes_endpoint(port_number_id.to_i), params
|
|
40
|
+
response_collection response
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
private
|
|
44
|
+
|
|
45
|
+
def port_number_notes_endpoint port_number_id
|
|
46
|
+
"#{PORT_NUMBERS_PATH}/#{port_number_id}/#{NOTES_PATH}"
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
module Phaxio
|
|
2
|
+
module Resources
|
|
3
|
+
# Provides functionality for viewing and managing port orders.
|
|
4
|
+
class PortOrder < Resource
|
|
5
|
+
PORT_ORDERS_PATH = 'port_orders'.freeze
|
|
6
|
+
private_constant :PORT_ORDERS_PATH
|
|
7
|
+
|
|
8
|
+
# @return [Integer] the ID associated with this order.
|
|
9
|
+
# @!attribute id
|
|
10
|
+
|
|
11
|
+
# @return [String] the status of this order.
|
|
12
|
+
# @!attribute status
|
|
13
|
+
|
|
14
|
+
# @return [String] the E.164 contact number.
|
|
15
|
+
# @!attribute contact_number
|
|
16
|
+
|
|
17
|
+
# @return [String] The email address for the order.
|
|
18
|
+
# @!attribute contact_email
|
|
19
|
+
|
|
20
|
+
# @return [String] The identifier for the account associated with the numbers.
|
|
21
|
+
# @!attribute account_identifier
|
|
22
|
+
|
|
23
|
+
# @return [String] Type of numbers to be ported. Either "business" or "residential".
|
|
24
|
+
# @!attribute port_type
|
|
25
|
+
|
|
26
|
+
# @return [String] The PIN or password needed to port out the numbers.
|
|
27
|
+
# @!attribute port_out_pin
|
|
28
|
+
|
|
29
|
+
# @return [String] the name associated with the account.
|
|
30
|
+
# @!attribute name_on_account
|
|
31
|
+
|
|
32
|
+
# @return [String] the name of the business.
|
|
33
|
+
# @!attribute name_of_business
|
|
34
|
+
|
|
35
|
+
# @return [String] the provider name.
|
|
36
|
+
# @!attribute provider_name
|
|
37
|
+
|
|
38
|
+
# @return [String] the E.164 billing number.
|
|
39
|
+
# @!attribute billing_number
|
|
40
|
+
|
|
41
|
+
# @return [String] the first billing address line.
|
|
42
|
+
# @!attribute billing_address1
|
|
43
|
+
|
|
44
|
+
# @return [String] the second billing address line.
|
|
45
|
+
# @!attribute billing_address2
|
|
46
|
+
|
|
47
|
+
# @return [String] the billing address city.
|
|
48
|
+
# @!attribute billing_city
|
|
49
|
+
|
|
50
|
+
# @return [String] the billing address state.
|
|
51
|
+
# @!attribute billing_state
|
|
52
|
+
|
|
53
|
+
# @return [String] the billing address zip.
|
|
54
|
+
# @!attribute billing_zip
|
|
55
|
+
|
|
56
|
+
# @return [String] the electronic signature used to sign the order.
|
|
57
|
+
# @!attribute esig
|
|
58
|
+
|
|
59
|
+
# @return [true | false]
|
|
60
|
+
# whether or not a bill will be provided. (only present on new orders)
|
|
61
|
+
# @!attribute has_bill
|
|
62
|
+
|
|
63
|
+
# @return [true | false]
|
|
64
|
+
# whether or not the legal agreement is accepted. (only present on new orders)
|
|
65
|
+
# @!attribute legal_agreement
|
|
66
|
+
|
|
67
|
+
has_normal_attributes %w[
|
|
68
|
+
id contact_number contact_email name_on_account name_of_business provider_name
|
|
69
|
+
billing_number billing_address1 billing_address2 account_identifier
|
|
70
|
+
billing_city billing_state billing_zip esig legal_agreement port_type port_out_pin
|
|
71
|
+
status
|
|
72
|
+
]
|
|
73
|
+
|
|
74
|
+
# @return [Time] the time the order was created.
|
|
75
|
+
# @!attribute created_at
|
|
76
|
+
|
|
77
|
+
# @return [Time] the time the order was updated.
|
|
78
|
+
# @!attribute updated_at
|
|
79
|
+
|
|
80
|
+
# @return [Time] the time the bill for the order was received.
|
|
81
|
+
# @!attribute bill_received_at
|
|
82
|
+
|
|
83
|
+
# @return [Time] the time the order was requested for.
|
|
84
|
+
# @!attribute requested_for
|
|
85
|
+
|
|
86
|
+
# @return [Time] the time the order was completed.
|
|
87
|
+
# @!attribute completed_at
|
|
88
|
+
|
|
89
|
+
has_time_attributes %w[
|
|
90
|
+
created_at updated_at bill_received_at requested_for completed_at
|
|
91
|
+
]
|
|
92
|
+
|
|
93
|
+
# @return [Phaxio::Resource::Collection<Phaxio::Resources::PortNumber>]
|
|
94
|
+
# a collection of port numbers associated with the order
|
|
95
|
+
# @!attribute port_numbers
|
|
96
|
+
|
|
97
|
+
has_collection_attributes({port_numbers: PortNumber})
|
|
98
|
+
|
|
99
|
+
class << self
|
|
100
|
+
# @macro paging
|
|
101
|
+
# List port orders in date range.
|
|
102
|
+
# @param params [Hash]
|
|
103
|
+
# Any parameters to send to Phaxio.
|
|
104
|
+
# - *created_before* [String] - RFC 3339 timestamp representing the end of the range.
|
|
105
|
+
# - *created_after* [String] - RFC 3339 timestamp representing the beginning of the range.
|
|
106
|
+
# @return [Phaxio::Resource::Collection<Phaxio::Resources::PortOrder>]
|
|
107
|
+
# The collection of port orders matching your request.
|
|
108
|
+
# @raise [Phaxio::Error::PhaxioError
|
|
109
|
+
# @see https://www.phaxio.com/docs/api/v2/port_orders/list_port_orders
|
|
110
|
+
def list params = {}
|
|
111
|
+
response = Client.request :get, port_orders_endpoint, params
|
|
112
|
+
response_collection response
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Create a port order.
|
|
116
|
+
# @param params [Hash]
|
|
117
|
+
# Any parameters to send to Phaxio.
|
|
118
|
+
# - *port_numbers* [Array<String>] - Numbers to port.
|
|
119
|
+
# - *contact_number* [String] - Number to contact about the port.
|
|
120
|
+
# - *contact_email* [String] - The email address for the order.
|
|
121
|
+
# - *account_identifier* [String] - The identifier for the account associated with the numbers.
|
|
122
|
+
# - *port_type* [String] - Type of numbers to be ported. Either "business" or "residential".
|
|
123
|
+
# - *port_out_pin* [String] - The PIN or password needed to port out the numbers.
|
|
124
|
+
# - *name_on_account* [String] - Name on the account for the port.
|
|
125
|
+
# - *name_of_business* [String] - Name of business associated with the port.
|
|
126
|
+
# - *provider_name* [String] - Name of provider for the port.
|
|
127
|
+
# - *esig* [String] - Electronic signature used to sign the order.
|
|
128
|
+
# - *legal_agreement* [true | false] - Indicates acceptance of the legal agreement.
|
|
129
|
+
# - *has_bill* [true | false] - Indicates whether or not a bill will be provided. If true, billing number
|
|
130
|
+
# and address fields are not needed.
|
|
131
|
+
# - *billing_number* [String] - Billing number.
|
|
132
|
+
# - *billing_address1* [String] - Billing address line 1
|
|
133
|
+
# - *billing_address2* [String] - Billing address line 2
|
|
134
|
+
# - *billing_city* [String] - Billing address city.
|
|
135
|
+
# - *billing_state* [String] - Billing address state.
|
|
136
|
+
# - *billing_zip* [String] - Billing address zip.
|
|
137
|
+
# @return [Phaxio::Resources::PortOrder]
|
|
138
|
+
# @raise [Phaxio::Error::PhaxioError]
|
|
139
|
+
# @see https://www.phaxio.com/docs/api/v2/port_orders/create_port_order
|
|
140
|
+
def create params = {}
|
|
141
|
+
response = Client.request :post, port_orders_endpoint, params
|
|
142
|
+
response_record response
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# Get port order info.
|
|
146
|
+
# @param id [Integer]
|
|
147
|
+
# The ID of the order to retrieve.
|
|
148
|
+
# @param params [Hash]
|
|
149
|
+
# A hash of parameters to send to Phaxio. This action takes no unique parameters.
|
|
150
|
+
# @return [Phaxio::Resource::PortOrder]
|
|
151
|
+
# @raise [Phaxio::Error::PhaxioError]
|
|
152
|
+
# @see https://www.phaxio.com/docs/api/v2/port_orders/get_port_order
|
|
153
|
+
def get id, params = {}
|
|
154
|
+
response = Client.request :get, port_order_endpoint(id.to_i), params
|
|
155
|
+
response_record response
|
|
156
|
+
end
|
|
157
|
+
alias :retrieve :get
|
|
158
|
+
alias :find :get
|
|
159
|
+
|
|
160
|
+
private
|
|
161
|
+
|
|
162
|
+
def port_orders_endpoint
|
|
163
|
+
PORT_ORDERS_PATH
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def port_order_endpoint id
|
|
167
|
+
"#{PORT_ORDERS_PATH}/#{id}"
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
end
|
|
@@ -46,7 +46,7 @@ module Phaxio
|
|
|
46
46
|
# @return [Phaxio::Resource::Collection<Phaxio::Resources::AreaCode>] A collection of
|
|
47
47
|
# AreaCode objects.
|
|
48
48
|
# @raise [Phaxio::Error::PhaxioError]
|
|
49
|
-
# @see https://www.phaxio.com/docs/api/v2/public/list_area_codes
|
|
49
|
+
# @see https://www.phaxio.com/docs/api/v2.1/public/list_area_codes
|
|
50
50
|
def list params = {}
|
|
51
51
|
response = Client.request :get, available_area_codes_endpoint, params
|
|
52
52
|
AreaCode.response_collection response
|
|
@@ -36,7 +36,7 @@ module Phaxio
|
|
|
36
36
|
# @return [Phaxio::Resource::Collection<Phaxio::Resources::Country>]
|
|
37
37
|
# A collection of supported countries.
|
|
38
38
|
# @raise Phaxio::Error::PhaxioError
|
|
39
|
-
# @see https://www.phaxio.com/docs/api/v2/public/list_countries
|
|
39
|
+
# @see https://www.phaxio.com/docs/api/v2.1/public/list_countries
|
|
40
40
|
def list params = {}
|
|
41
41
|
response = Client.request :get, supported_countries_endpoint, params
|
|
42
42
|
Country.response_collection response
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
module Phaxio
|
|
2
|
+
module Resources
|
|
3
|
+
# Provides utilities for working with webhooks.
|
|
4
|
+
# @see https://www.phaxio.com/docs/api/v2.1/faxes/send_webhook
|
|
5
|
+
# @see https://www.phaxio.com/docs/api/v2.1/faxes/receive_webhooks
|
|
6
|
+
class Webhook
|
|
7
|
+
DIGEST = OpenSSL::Digest.new('sha1')
|
|
8
|
+
private_constant :DIGEST
|
|
9
|
+
|
|
10
|
+
class << self
|
|
11
|
+
# Determines whether or not the passed signature is valid for the given
|
|
12
|
+
# url, params, and files.
|
|
13
|
+
# @param signature [String]
|
|
14
|
+
# The signature received from Phaxio.
|
|
15
|
+
# @param url [String]
|
|
16
|
+
# The webhook URL used in this request.
|
|
17
|
+
# @param params [Hash]
|
|
18
|
+
# The parameters received with the webhook, excluding files.
|
|
19
|
+
# @param files [Array<File>]
|
|
20
|
+
# The files received with the webhook, if any.
|
|
21
|
+
# @return [true, false]
|
|
22
|
+
# @raise [Phaxio::Error::PhaxioError]
|
|
23
|
+
# @see https://www.phaxio.com/docs/security/callbacks
|
|
24
|
+
def valid_signature? signature, url, params, files = []
|
|
25
|
+
check_signature = generate_check_signature url, params, files
|
|
26
|
+
check_signature == signature
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
private
|
|
30
|
+
|
|
31
|
+
def generate_check_signature url, params, files = []
|
|
32
|
+
params_string = generate_params_string(params)
|
|
33
|
+
files_string = generate_files_string(files)
|
|
34
|
+
webhook_data = "#{url}#{params_string}#{files_string}"
|
|
35
|
+
OpenSSL::HMAC.hexdigest(DIGEST, webhook_token, webhook_data)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def webhook_token
|
|
39
|
+
Phaxio.webhook_token or raise(Error::PhaxioError, 'No webhook token has been set')
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def generate_params_string(params)
|
|
43
|
+
sorted_params = params.sort_by { |key, _value| key }
|
|
44
|
+
params_strings = sorted_params.map { |key, value| "#{key}#{value}" }
|
|
45
|
+
params_strings.join
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def generate_files_string(files)
|
|
49
|
+
files_array = files_to_array(files).reject(&:nil?)
|
|
50
|
+
sorted_files = files_array.sort_by { |file| file[:name] }
|
|
51
|
+
files_strings = sorted_files.map { |file| generate_file_string(file) }
|
|
52
|
+
files_strings.join
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def files_to_array(files)
|
|
56
|
+
files.is_a?(Array) ? files : [files]
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def generate_file_string(file)
|
|
60
|
+
file[:name] + DIGEST.hexdigest(file[:tempfile].read)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
data/lib/phaxio/version.rb
CHANGED
data/lib/phaxio.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
require 'base64'
|
|
1
2
|
require 'json'
|
|
2
3
|
require 'tempfile'
|
|
3
4
|
require 'openssl'
|
|
@@ -16,7 +17,10 @@ Dir[File.expand_path(File.join('..', 'phaxio', 'helpers', '*.rb'), __FILE__)].ea
|
|
|
16
17
|
require file
|
|
17
18
|
end
|
|
18
19
|
|
|
19
|
-
%w[
|
|
20
|
+
%w[
|
|
21
|
+
fax_recipient fax account callback webhook phax_code phone_number public ata
|
|
22
|
+
port_number_note port_number port_order
|
|
23
|
+
].each do |filename|
|
|
20
24
|
require File.expand_path(File.join('..', 'phaxio', 'resources', filename), __FILE__)
|
|
21
25
|
end
|
|
22
26
|
|
|
@@ -28,11 +32,13 @@ module Phaxio
|
|
|
28
32
|
# @see Config.api_key
|
|
29
33
|
# @!attribute api_secret
|
|
30
34
|
# @see Config.api_secret
|
|
35
|
+
# @!attribute webhook_token
|
|
36
|
+
# @see Config.webhook_token
|
|
31
37
|
# @!attribute callback_token
|
|
32
|
-
# @see Config.
|
|
38
|
+
# @see Config.webhook_token
|
|
33
39
|
# @!attribute api_endpoint
|
|
34
40
|
# @see Config.api_endpoint
|
|
35
|
-
%w(api_key api_secret callback_token api_endpoint).each do |config_attribute|
|
|
41
|
+
%w(api_key api_secret webhook_token callback_token api_endpoint).each do |config_attribute|
|
|
36
42
|
# Define getters
|
|
37
43
|
define_method(config_attribute) do
|
|
38
44
|
Config.public_send config_attribute
|
|
@@ -44,5 +50,9 @@ module Phaxio
|
|
|
44
50
|
Config.public_send setter, value
|
|
45
51
|
end
|
|
46
52
|
end
|
|
53
|
+
|
|
54
|
+
# for backwards compatibility
|
|
55
|
+
alias callback_token webhook_token
|
|
56
|
+
alias callback_token= webhook_token=
|
|
47
57
|
end
|
|
48
58
|
end
|
data/phaxio.gemspec
CHANGED
|
@@ -14,9 +14,10 @@ Gem::Specification.new do |gem|
|
|
|
14
14
|
gem.name = "phaxio"
|
|
15
15
|
gem.require_paths = ["lib"]
|
|
16
16
|
gem.version = Phaxio::VERSION
|
|
17
|
+
gem.licenses = ['MIT']
|
|
17
18
|
|
|
18
19
|
gem.required_ruby_version = '>= 2.0'
|
|
19
|
-
gem.add_dependency 'faraday', '
|
|
20
|
+
gem.add_dependency 'faraday', '>= 0.10', '< 2.0'
|
|
20
21
|
gem.add_dependency 'mime-types', '~> 3.0'
|
|
21
22
|
gem.add_dependency 'activesupport'
|
|
22
23
|
end
|
data/spec/client_spec.rb
CHANGED
|
@@ -32,10 +32,42 @@ RSpec.describe Phaxio::Client do
|
|
|
32
32
|
client.request :get, endpoint, params
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
+
it 'handles a single file param' do
|
|
36
|
+
file_path = File.expand_path File.join('..', 'support', 'files', 'test.pdf'), __FILE__
|
|
37
|
+
params = {to: '+12258888888', file: File.open(file_path)}
|
|
38
|
+
expect(test_connection).to receive(:post) do |request_endpoint, request_params|
|
|
39
|
+
expect(request_params[:file]).to be_a(Faraday::UploadIO)
|
|
40
|
+
expect(request_params[:file].original_filename).to eq(File.basename(file_path))
|
|
41
|
+
test_response 200
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
client.request :post, 'faxes', params
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it 'handles multiple file params' do
|
|
48
|
+
file_names = ['test.pdf', 'test.txt']
|
|
49
|
+
file_paths = file_names.map do |file_name|
|
|
50
|
+
File.expand_path File.join('..', 'support', 'files', file_name), __FILE__
|
|
51
|
+
end
|
|
52
|
+
params = {to: '+12258888888', file: file_paths.map { |file_path| File.open(file_path) }}
|
|
53
|
+
|
|
54
|
+
expect(test_connection).to receive(:post) do |request_endpoint, request_params|
|
|
55
|
+
expect(request_params[:file]).to be_a(Array)
|
|
56
|
+
correct_file_params = request_params[:file].all? do |file_param|
|
|
57
|
+
file_param.is_a? Faraday::UploadIO
|
|
58
|
+
end
|
|
59
|
+
expect(correct_file_params).to eq(true)
|
|
60
|
+
expect(request_params[:file].map(&:original_filename)).to eq(file_names)
|
|
61
|
+
test_response 200
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
client.request :post, 'faxes', params
|
|
65
|
+
end
|
|
66
|
+
|
|
35
67
|
it 'uses the configured API key and secret by default' do
|
|
36
|
-
expect(test_connection).to receive(:get) do |_endpoint,
|
|
37
|
-
|
|
38
|
-
expect(
|
|
68
|
+
expect(test_connection).to receive(:get) do |_endpoint, _request_params, request_headers|
|
|
69
|
+
auth_header = "Basic #{Base64.strict_encode64("#{Phaxio.api_key}:#{Phaxio.api_secret}")}"
|
|
70
|
+
expect(request_headers['Authorization']).to eq(auth_header)
|
|
39
71
|
test_response 200
|
|
40
72
|
end
|
|
41
73
|
client.request :get, 'test'
|
|
@@ -44,9 +76,9 @@ RSpec.describe Phaxio::Client do
|
|
|
44
76
|
it 'uses the api key specified in the params hash' do
|
|
45
77
|
custom_api_key = 'custom-api-key'
|
|
46
78
|
custom_api_secret = 'custom-api-secret'
|
|
47
|
-
expect(test_connection).to receive(:get) do |_endpoint,
|
|
48
|
-
|
|
49
|
-
expect(
|
|
79
|
+
expect(test_connection).to receive(:get) do |_endpoint, _request_params, request_headers|
|
|
80
|
+
auth_header = "Basic #{Base64.strict_encode64('custom-api-key:custom-api-secret')}"
|
|
81
|
+
expect(request_headers['Authorization']).to eq(auth_header)
|
|
50
82
|
test_response 200
|
|
51
83
|
end
|
|
52
84
|
client.request :get, 'test', api_key: custom_api_key, api_secret: custom_api_secret
|
data/spec/phaxio_spec.rb
CHANGED
|
@@ -13,8 +13,14 @@ RSpec.describe Phaxio do
|
|
|
13
13
|
expect(subject.api_secret).to eq('test-api-secret')
|
|
14
14
|
end
|
|
15
15
|
|
|
16
|
-
it 'sets the
|
|
16
|
+
it 'sets the webhook token' do
|
|
17
|
+
subject.webhook_token = 'test-webhook-token'
|
|
18
|
+
expect(subject.webhook_token).to eq('test-webhook-token')
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it 'sets and gets the webhook token as callback_token' do
|
|
17
22
|
subject.callback_token = 'test-callback-token'
|
|
18
23
|
expect(subject.callback_token).to eq('test-callback-token')
|
|
24
|
+
expect(subject.webhook_token).to eq('test-callback-token')
|
|
19
25
|
end
|
|
20
26
|
end
|