voicetel 2.2.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE +21 -0
- data/README.md +235 -0
- data/lib/voicetel/api_error.rb +59 -0
- data/lib/voicetel/internal/transport.rb +178 -0
- data/lib/voicetel/resources/account.rb +64 -0
- data/lib/voicetel/resources/acl.rb +27 -0
- data/lib/voicetel/resources/authentication.rb +25 -0
- data/lib/voicetel/resources/base.rb +21 -0
- data/lib/voicetel/resources/e911.rb +38 -0
- data/lib/voicetel/resources/gateways.rb +35 -0
- data/lib/voicetel/resources/i_numbering.rb +53 -0
- data/lib/voicetel/resources/lookups.rb +20 -0
- data/lib/voicetel/resources/messaging.rb +54 -0
- data/lib/voicetel/resources/numbers.rb +120 -0
- data/lib/voicetel/resources/support.rb +43 -0
- data/lib/voicetel/version.rb +16 -0
- data/lib/voicetel.rb +122 -0
- data/sig/voicetel.rbs +206 -0
- data/voicetel.gemspec +35 -0
- metadata +112 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base"
|
|
4
|
+
|
|
5
|
+
module VoiceTel
|
|
6
|
+
module Resources
|
|
7
|
+
# GatewaysService — outbound termination gateways on the account.
|
|
8
|
+
class Gateways < Base
|
|
9
|
+
def list
|
|
10
|
+
@transport.request(:get, "/v2.2/gateways")
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def add(body)
|
|
14
|
+
@transport.request(:post, "/v2.2/gateways", body: body)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def get(id)
|
|
18
|
+
@transport.request(:get, "/v2.2/gateways/#{id}")
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def update(id, body)
|
|
22
|
+
@transport.request(:put, "/v2.2/gateways/#{id}", body: body)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Returns nil on 204 No Content.
|
|
26
|
+
def remove(id)
|
|
27
|
+
@transport.request(:delete, "/v2.2/gateways/#{id}")
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def numbers(id)
|
|
31
|
+
@transport.request(:get, "/v2.2/gateways/#{id}/numbers")
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base"
|
|
4
|
+
|
|
5
|
+
module VoiceTel
|
|
6
|
+
module Resources
|
|
7
|
+
# INumberingService — inventory searches, orders, and port-ins.
|
|
8
|
+
#
|
|
9
|
+
# PortAvailability returns the v2.2.10 fields `local_routing_number` and
|
|
10
|
+
# `rate_center_tier` alongside `number`, `portable`, `losing_carrier`, `reason`.
|
|
11
|
+
class INumbering < Base
|
|
12
|
+
# GET /v2.2/inventory — search available TNs.
|
|
13
|
+
def search_inventory(npa: nil, nxx: nil, state: nil, ratecenter: nil, contains: nil, endswith: nil, limit: nil)
|
|
14
|
+
q = compact_query(
|
|
15
|
+
"npa" => npa, "nxx" => nxx, "state" => state, "ratecenter" => ratecenter,
|
|
16
|
+
"contains" => contains, "endswith" => endswith, "limit" => limit
|
|
17
|
+
)
|
|
18
|
+
@transport.request(:get, "/v2.2/inventory", query: q)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# GET /v2.2/inventory/coverage — aggregated availability buckets.
|
|
22
|
+
def coverage(state: nil, ratecenter: nil)
|
|
23
|
+
q = compact_query("state" => state, "ratecenter" => ratecenter)
|
|
24
|
+
@transport.request(:get, "/v2.2/inventory/coverage", query: q)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# POST /v2.2/orders — purchase new TNs.
|
|
28
|
+
def order(body)
|
|
29
|
+
@transport.request(:post, "/v2.2/orders", body: body)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# GET /v2.2/ports — list every port-in record.
|
|
33
|
+
def ports
|
|
34
|
+
@transport.request(:get, "/v2.2/ports")
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# GET /v2.2/ports/{id} — detail for one port-in.
|
|
38
|
+
def port(id)
|
|
39
|
+
@transport.request(:get, "/v2.2/ports/#{id}")
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# POST /v2.2/ports — submit a port-in.
|
|
43
|
+
def submit_port(body)
|
|
44
|
+
@transport.request(:post, "/v2.2/ports", body: body)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# GET /v2.2/ports/availability/{number} — check whether a TN can be ported in.
|
|
48
|
+
def port_availability(number)
|
|
49
|
+
@transport.request(:get, "/v2.2/ports/availability/#{number}")
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base"
|
|
4
|
+
|
|
5
|
+
module VoiceTel
|
|
6
|
+
module Resources
|
|
7
|
+
# LookupsService — CNAM and LRN dips.
|
|
8
|
+
#
|
|
9
|
+
# Each call costs money; meter accordingly.
|
|
10
|
+
class Lookups < Base
|
|
11
|
+
def cnam(number)
|
|
12
|
+
@transport.request(:get, "/v2.2/cnam/#{number}")
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def lrn(number, ani)
|
|
16
|
+
@transport.request(:get, "/v2.2/lrn/#{number}/#{ani}")
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base"
|
|
4
|
+
|
|
5
|
+
module VoiceTel
|
|
6
|
+
module Resources
|
|
7
|
+
# MessagingService — SMS/MMS sending and 10DLC brand/campaign registration.
|
|
8
|
+
#
|
|
9
|
+
# The message-send wire body uses `fromNumber` / `toNumber`. Pass those
|
|
10
|
+
# snake_case in your Ruby hash (`from_number`, `to_number`) and the
|
|
11
|
+
# transport will translate them when serializing.
|
|
12
|
+
class Messaging < Base
|
|
13
|
+
# GET /v2.2/messages — fetch message history.
|
|
14
|
+
def history(number: nil, start: nil, end_at: nil, type: nil)
|
|
15
|
+
q = compact_query(
|
|
16
|
+
"number" => number,
|
|
17
|
+
"start" => start,
|
|
18
|
+
"end" => end_at,
|
|
19
|
+
"type" => type
|
|
20
|
+
)
|
|
21
|
+
@transport.request(:get, "/v2.2/messages", query: q)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# POST /v2.2/messages — send an SMS or MMS.
|
|
25
|
+
def send_message(body)
|
|
26
|
+
@transport.request(:post, "/v2.2/messages", body: body)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# POST /v2.2/messaging/brands — register a 10DLC brand.
|
|
30
|
+
def create_brand(body)
|
|
31
|
+
@transport.request(:post, "/v2.2/messaging/brands", body: body)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# GET /v2.2/messaging/campaigns — current 10DLC campaign statuses.
|
|
35
|
+
def campaign_status
|
|
36
|
+
@transport.request(:get, "/v2.2/messaging/campaigns")
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# POST /v2.2/messaging/campaigns — register a 10DLC campaign.
|
|
40
|
+
def create_campaign(body)
|
|
41
|
+
@transport.request(:post, "/v2.2/messaging/campaigns", body: body)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# GET /v2.2/numbers/messaging — messaging state for many numbers.
|
|
45
|
+
# Pass an empty array (or omit) for "all numbers on the account".
|
|
46
|
+
def numbers_state(numbers: nil)
|
|
47
|
+
q = compact_query(
|
|
48
|
+
"numbers" => (numbers && !numbers.empty? ? Array(numbers).join(",") : nil)
|
|
49
|
+
)
|
|
50
|
+
@transport.request(:get, "/v2.2/numbers/messaging", query: q)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base"
|
|
4
|
+
|
|
5
|
+
module VoiceTel
|
|
6
|
+
module Resources
|
|
7
|
+
# NumbersService — every operation on a TN owned by the account.
|
|
8
|
+
#
|
|
9
|
+
# Most methods take the 10-digit TN as the first argument. Methods that
|
|
10
|
+
# return 204 No Content return nil. The two exceptions in this resource
|
|
11
|
+
# — DELETE /v2.2/numbers/{n}/messaging-campaign and
|
|
12
|
+
# DELETE /v2.2/numbers/messaging-campaign — return 200 with a body and
|
|
13
|
+
# are exposed via #unassign_campaign and #bulk_unassign_campaign.
|
|
14
|
+
class Numbers < Base
|
|
15
|
+
def list
|
|
16
|
+
@transport.request(:get, "/v2.2/numbers")
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def add(body)
|
|
20
|
+
@transport.request(:post, "/v2.2/numbers", body: body)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def get(number)
|
|
24
|
+
@transport.request(:get, "/v2.2/numbers/#{number}")
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Returns nil on 204 No Content.
|
|
28
|
+
def remove(number)
|
|
29
|
+
@transport.request(:delete, "/v2.2/numbers/#{number}")
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# PATCH /v2.2/numbers/{number} — move a TN to another account.
|
|
33
|
+
def move(number, body)
|
|
34
|
+
@transport.request(:patch, "/v2.2/numbers/#{number}", body: body)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# POST /v2.2/numbers/{number}/release — release a TN back to the network.
|
|
38
|
+
def release(number)
|
|
39
|
+
@transport.request(:post, "/v2.2/numbers/#{number}/release")
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def set_route(number, body)
|
|
43
|
+
@transport.request(:put, "/v2.2/numbers/#{number}/route", body: body)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def set_translation(number, body)
|
|
47
|
+
@transport.request(:put, "/v2.2/numbers/#{number}/translation", body: body)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def set_cnam(number, body)
|
|
51
|
+
@transport.request(:put, "/v2.2/numbers/#{number}/cnam", body: body)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def set_lidb(number, body)
|
|
55
|
+
@transport.request(:put, "/v2.2/numbers/#{number}/lidb", body: body)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def get_fax(number)
|
|
59
|
+
@transport.request(:get, "/v2.2/numbers/#{number}/fax")
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def set_fax(number, body)
|
|
63
|
+
@transport.request(:put, "/v2.2/numbers/#{number}/fax", body: body)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Returns nil on 204 No Content.
|
|
67
|
+
def remove_fax(number)
|
|
68
|
+
@transport.request(:delete, "/v2.2/numbers/#{number}/fax")
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def set_forward(number, body)
|
|
72
|
+
@transport.request(:put, "/v2.2/numbers/#{number}/forward", body: body)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Returns nil on 204 No Content.
|
|
76
|
+
def remove_forward(number)
|
|
77
|
+
@transport.request(:delete, "/v2.2/numbers/#{number}/forward")
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def get_sms(number)
|
|
81
|
+
@transport.request(:get, "/v2.2/numbers/#{number}/sms")
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def set_sms(number, body)
|
|
85
|
+
@transport.request(:put, "/v2.2/numbers/#{number}/sms", body: body)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Returns nil on 204 No Content.
|
|
89
|
+
def remove_sms(number)
|
|
90
|
+
@transport.request(:delete, "/v2.2/numbers/#{number}/sms")
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def get_messaging(number)
|
|
94
|
+
@transport.request(:get, "/v2.2/numbers/#{number}/messaging")
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def patch_messaging(number, body)
|
|
98
|
+
@transport.request(:patch, "/v2.2/numbers/#{number}/messaging", body: body)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def assign_campaign(number, body)
|
|
102
|
+
@transport.request(:put, "/v2.2/numbers/#{number}/messaging-campaign", body: body)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# Returns response data (200 with body, not 204).
|
|
106
|
+
def unassign_campaign(number)
|
|
107
|
+
@transport.request(:delete, "/v2.2/numbers/#{number}/messaging-campaign")
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# Returns response data (200 with body, not 204).
|
|
111
|
+
def bulk_unassign_campaign(numbers)
|
|
112
|
+
@transport.request(:delete, "/v2.2/numbers/messaging-campaign", body: { numbers: numbers })
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def set_port_out_pin(number, body)
|
|
116
|
+
@transport.request(:patch, "/v2.2/numbers/#{number}/port-out-pin", body: body)
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "base"
|
|
4
|
+
|
|
5
|
+
module VoiceTel
|
|
6
|
+
module Resources
|
|
7
|
+
# SupportService — support tickets (create, read, update, delete, reply).
|
|
8
|
+
#
|
|
9
|
+
# On the wire, SupportConversation.number is a ticket sequence integer
|
|
10
|
+
# (1015, 2114, ...), NOT a phone number. When the spec uses `number`
|
|
11
|
+
# in this context, that's the ticket id.
|
|
12
|
+
class Support < Base
|
|
13
|
+
def list
|
|
14
|
+
@transport.request(:get, "/v2.2/support/tickets")
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def create(body)
|
|
18
|
+
@transport.request(:post, "/v2.2/support/tickets", body: body)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def get(id)
|
|
22
|
+
@transport.request(:get, "/v2.2/support/tickets/#{id}")
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def update(id, body)
|
|
26
|
+
@transport.request(:put, "/v2.2/support/tickets/#{id}", body: body)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Returns nil on 204 No Content.
|
|
30
|
+
def delete(id)
|
|
31
|
+
@transport.request(:delete, "/v2.2/support/tickets/#{id}")
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def messages(id)
|
|
35
|
+
@transport.request(:get, "/v2.2/support/tickets/#{id}/messages")
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def reply(id, body)
|
|
39
|
+
@transport.request(:post, "/v2.2/support/tickets/#{id}/replies", body: body)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module VoiceTel
|
|
4
|
+
# The semantic version of the VoiceTel Ruby SDK. This tracks the API version
|
|
5
|
+
# it targets (currently v2.2.10).
|
|
6
|
+
VERSION = "2.2.10"
|
|
7
|
+
|
|
8
|
+
# The VoiceTel REST API version this SDK targets.
|
|
9
|
+
API_VERSION = "v2.2.10"
|
|
10
|
+
|
|
11
|
+
# Default production API endpoint.
|
|
12
|
+
DEFAULT_BASE_URL = "https://api.voicetel.com"
|
|
13
|
+
|
|
14
|
+
# User-Agent header sent on every request unless overridden.
|
|
15
|
+
USER_AGENT = "voicetel-ruby/#{VERSION} (+https://github.com/voicetel/ruby-sdk)".freeze
|
|
16
|
+
end
|
data/lib/voicetel.rb
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "voicetel/version"
|
|
4
|
+
require_relative "voicetel/api_error"
|
|
5
|
+
require_relative "voicetel/internal/transport"
|
|
6
|
+
require_relative "voicetel/resources/account"
|
|
7
|
+
require_relative "voicetel/resources/acl"
|
|
8
|
+
require_relative "voicetel/resources/authentication"
|
|
9
|
+
require_relative "voicetel/resources/e911"
|
|
10
|
+
require_relative "voicetel/resources/gateways"
|
|
11
|
+
require_relative "voicetel/resources/i_numbering"
|
|
12
|
+
require_relative "voicetel/resources/lookups"
|
|
13
|
+
require_relative "voicetel/resources/messaging"
|
|
14
|
+
require_relative "voicetel/resources/numbers"
|
|
15
|
+
require_relative "voicetel/resources/support"
|
|
16
|
+
|
|
17
|
+
# VoiceTel is the official Ruby SDK for the VoiceTel REST API.
|
|
18
|
+
#
|
|
19
|
+
# See:
|
|
20
|
+
# - https://voicetel.com/docs/api/v2.2/ — full API reference
|
|
21
|
+
# - https://voicetel.com/docs/api/v2.2/playground/ — interactive playground
|
|
22
|
+
# - https://voicetel.com/docs/api/v2.2/credentials/ — obtain credentials
|
|
23
|
+
module VoiceTel
|
|
24
|
+
# Client is the entry point for the VoiceTel API. Construct with an API key
|
|
25
|
+
# (or call #login to exchange username/password) and reach the API through
|
|
26
|
+
# the resource accessors:
|
|
27
|
+
#
|
|
28
|
+
# c = VoiceTel::Client.new(api_key: ENV.fetch("VOICETEL_API_KEY"))
|
|
29
|
+
# c.numbers.list
|
|
30
|
+
#
|
|
31
|
+
# Client is safe to share across threads as long as you don't reassign
|
|
32
|
+
# the API key concurrently with in-flight requests.
|
|
33
|
+
class Client
|
|
34
|
+
attr_reader :transport
|
|
35
|
+
|
|
36
|
+
def initialize(api_key: nil, base_url: nil, timeout: 30, max_retries: 2, user_agent: nil, adapter: nil)
|
|
37
|
+
@transport = Internal::Transport.new(
|
|
38
|
+
base_url: base_url,
|
|
39
|
+
api_key: api_key,
|
|
40
|
+
timeout: timeout,
|
|
41
|
+
max_retries: max_retries,
|
|
42
|
+
user_agent: user_agent,
|
|
43
|
+
adapter: adapter
|
|
44
|
+
)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Exchange username + password for a 32-hex API key and install it on
|
|
48
|
+
# this client. Shares the 6 req/hour/IP rate limit with the rest of the
|
|
49
|
+
# account/* endpoints.
|
|
50
|
+
#
|
|
51
|
+
# @return [String] the freshly exchanged bearer token
|
|
52
|
+
def login(username:, password:)
|
|
53
|
+
data = @transport.request(
|
|
54
|
+
:post, "/v2.2/account/api-key",
|
|
55
|
+
body: { username: username, password: password },
|
|
56
|
+
require_auth: false
|
|
57
|
+
)
|
|
58
|
+
key = data.is_a?(Hash) ? data["apikey"] : nil
|
|
59
|
+
if key.nil? || key.empty?
|
|
60
|
+
raise ApiError.new(
|
|
61
|
+
"voicetel: api-key response did not contain data.apikey",
|
|
62
|
+
kind: :authentication,
|
|
63
|
+
body: data
|
|
64
|
+
)
|
|
65
|
+
end
|
|
66
|
+
@transport.api_key = key
|
|
67
|
+
key
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Currently installed bearer token (nil if none).
|
|
71
|
+
def api_key
|
|
72
|
+
@transport.api_key
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# API endpoint this client is pointed at.
|
|
76
|
+
def base_url
|
|
77
|
+
@transport.base_url
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# --- resource accessors ------------------------------------------------
|
|
81
|
+
|
|
82
|
+
def account
|
|
83
|
+
@account ||= Resources::Account.new(@transport)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def acl
|
|
87
|
+
@acl ||= Resources::Acl.new(@transport)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def authentication
|
|
91
|
+
@authentication ||= Resources::Authentication.new(@transport)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def e911
|
|
95
|
+
@e911 ||= Resources::E911.new(@transport)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def gateways
|
|
99
|
+
@gateways ||= Resources::Gateways.new(@transport)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def i_numbering
|
|
103
|
+
@i_numbering ||= Resources::INumbering.new(@transport)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def lookups
|
|
107
|
+
@lookups ||= Resources::Lookups.new(@transport)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def messaging
|
|
111
|
+
@messaging ||= Resources::Messaging.new(@transport)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def numbers
|
|
115
|
+
@numbers ||= Resources::Numbers.new(@transport)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def support
|
|
119
|
+
@support ||= Resources::Support.new(@transport)
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
data/sig/voicetel.rbs
ADDED
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
# RBS type signatures for the VoiceTel Ruby SDK.
|
|
2
|
+
#
|
|
3
|
+
# Hashes/Arrays are deliberately typed as untyped throughout — request bodies
|
|
4
|
+
# and response shapes are spec-defined and would explode this file's size if
|
|
5
|
+
# fully modelled. The public API (Client, Resources, ApiError) is statically
|
|
6
|
+
# typed; payloads pass through as `untyped`.
|
|
7
|
+
|
|
8
|
+
module VoiceTel
|
|
9
|
+
VERSION: String
|
|
10
|
+
API_VERSION: String
|
|
11
|
+
DEFAULT_BASE_URL: String
|
|
12
|
+
USER_AGENT: String
|
|
13
|
+
|
|
14
|
+
class ApiError < StandardError
|
|
15
|
+
KINDS: Array[Symbol]
|
|
16
|
+
|
|
17
|
+
attr_reader kind: Symbol
|
|
18
|
+
attr_reader status_code: Integer?
|
|
19
|
+
attr_reader code: String?
|
|
20
|
+
attr_reader body: untyped
|
|
21
|
+
|
|
22
|
+
def initialize: (String message, ?kind: Symbol, ?status_code: Integer?, ?code: String?, ?body: untyped) -> void
|
|
23
|
+
|
|
24
|
+
def bad_request?: () -> bool
|
|
25
|
+
def authentication?: () -> bool
|
|
26
|
+
def permission_denied?: () -> bool
|
|
27
|
+
def not_found?: () -> bool
|
|
28
|
+
def conflict?: () -> bool
|
|
29
|
+
def rate_limit?: () -> bool
|
|
30
|
+
def server?: () -> bool
|
|
31
|
+
def unknown?: () -> bool
|
|
32
|
+
|
|
33
|
+
def self.kind_from_status: (Integer) -> Symbol
|
|
34
|
+
def self.from_response: (Integer status, String? code, String message, untyped body) -> ApiError
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
module Internal
|
|
38
|
+
class Transport
|
|
39
|
+
RETRYABLE_STATUSES: Array[Integer]
|
|
40
|
+
|
|
41
|
+
attr_reader base_url: String
|
|
42
|
+
attr_reader user_agent: String
|
|
43
|
+
attr_reader timeout: Integer | Float
|
|
44
|
+
attr_reader max_retries: Integer
|
|
45
|
+
attr_accessor api_key: String?
|
|
46
|
+
|
|
47
|
+
def initialize: (
|
|
48
|
+
base_url: String?,
|
|
49
|
+
?api_key: String?,
|
|
50
|
+
?timeout: Integer | Float,
|
|
51
|
+
?max_retries: Integer,
|
|
52
|
+
?user_agent: String?,
|
|
53
|
+
?adapter: Symbol?
|
|
54
|
+
) -> void
|
|
55
|
+
|
|
56
|
+
def request: (
|
|
57
|
+
Symbol method, String path,
|
|
58
|
+
?query: Hash[untyped, untyped]?, ?body: untyped, ?require_auth: bool
|
|
59
|
+
) -> untyped
|
|
60
|
+
|
|
61
|
+
def camelize_keys: (untyped) -> untyped
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
module Resources
|
|
66
|
+
class Base
|
|
67
|
+
def initialize: (Internal::Transport transport) -> void
|
|
68
|
+
def compact_query: (Hash[untyped, untyped]) -> Hash[untyped, untyped]
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
class Account < Base
|
|
72
|
+
def get: () -> untyped
|
|
73
|
+
def update: (untyped body) -> untyped
|
|
74
|
+
def add: (untyped body) -> untyped
|
|
75
|
+
def signup: (untyped body) -> untyped
|
|
76
|
+
def cdr: (?start: untyped?, ?end_at: untyped?) -> untyped
|
|
77
|
+
def credits: () -> untyped
|
|
78
|
+
def recurring_charges: () -> untyped
|
|
79
|
+
def payments: () -> untyped
|
|
80
|
+
def registration: () -> untyped
|
|
81
|
+
def recover: (untyped body) -> untyped
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
class Acl < Base
|
|
85
|
+
def list: () -> untyped
|
|
86
|
+
def add: (untyped body) -> untyped
|
|
87
|
+
def remove: (untyped body) -> untyped
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
class Authentication < Base
|
|
91
|
+
AUTH_TYPE_DIGEST: Integer
|
|
92
|
+
AUTH_TYPE_IP: Integer
|
|
93
|
+
AUTH_TYPE_DIGEST_OR_IP: Integer
|
|
94
|
+
AUTH_TYPE_DIGEST_AND_IP: Integer
|
|
95
|
+
|
|
96
|
+
def get: () -> untyped
|
|
97
|
+
def update: (untyped body) -> untyped
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
class E911 < Base
|
|
101
|
+
def list: () -> untyped
|
|
102
|
+
def create: (untyped body) -> untyped
|
|
103
|
+
def validate: (untyped body) -> untyped
|
|
104
|
+
def get: (String dn) -> untyped
|
|
105
|
+
def provision: (String dn, untyped body) -> untyped
|
|
106
|
+
def remove: (String dn) -> untyped
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
class Gateways < Base
|
|
110
|
+
def list: () -> untyped
|
|
111
|
+
def add: (untyped body) -> untyped
|
|
112
|
+
def get: (Integer id) -> untyped
|
|
113
|
+
def update: (Integer id, untyped body) -> untyped
|
|
114
|
+
def remove: (Integer id) -> untyped
|
|
115
|
+
def numbers: (Integer id) -> untyped
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
class INumbering < Base
|
|
119
|
+
def search_inventory: (
|
|
120
|
+
?npa: Integer?, ?nxx: Integer?, ?state: String?, ?ratecenter: String?,
|
|
121
|
+
?contains: String?, ?endswith: String?, ?limit: Integer?
|
|
122
|
+
) -> untyped
|
|
123
|
+
def coverage: (?state: String?, ?ratecenter: String?) -> untyped
|
|
124
|
+
def order: (untyped body) -> untyped
|
|
125
|
+
def ports: () -> untyped
|
|
126
|
+
def port: (Integer id) -> untyped
|
|
127
|
+
def submit_port: (untyped body) -> untyped
|
|
128
|
+
def port_availability: (String number) -> untyped
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
class Lookups < Base
|
|
132
|
+
def cnam: (String number) -> untyped
|
|
133
|
+
def lrn: (String number, String ani) -> untyped
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
class Messaging < Base
|
|
137
|
+
def history: (?number: String?, ?start: Integer?, ?end_at: Integer?, ?type: String?) -> untyped
|
|
138
|
+
def send_message: (untyped body) -> untyped
|
|
139
|
+
def create_brand: (untyped body) -> untyped
|
|
140
|
+
def campaign_status: () -> untyped
|
|
141
|
+
def create_campaign: (untyped body) -> untyped
|
|
142
|
+
def numbers_state: (?numbers: Array[String]?) -> untyped
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
class Numbers < Base
|
|
146
|
+
def list: () -> untyped
|
|
147
|
+
def add: (untyped body) -> untyped
|
|
148
|
+
def get: (String number) -> untyped
|
|
149
|
+
def remove: (String number) -> untyped
|
|
150
|
+
def move: (String number, untyped body) -> untyped
|
|
151
|
+
def release: (String number) -> untyped
|
|
152
|
+
def set_route: (String number, untyped body) -> untyped
|
|
153
|
+
def set_translation: (String number, untyped body) -> untyped
|
|
154
|
+
def set_cnam: (String number, untyped body) -> untyped
|
|
155
|
+
def set_lidb: (String number, untyped body) -> untyped
|
|
156
|
+
def get_fax: (String number) -> untyped
|
|
157
|
+
def set_fax: (String number, untyped body) -> untyped
|
|
158
|
+
def remove_fax: (String number) -> untyped
|
|
159
|
+
def set_forward: (String number, untyped body) -> untyped
|
|
160
|
+
def remove_forward: (String number) -> untyped
|
|
161
|
+
def get_sms: (String number) -> untyped
|
|
162
|
+
def set_sms: (String number, untyped body) -> untyped
|
|
163
|
+
def remove_sms: (String number) -> untyped
|
|
164
|
+
def get_messaging: (String number) -> untyped
|
|
165
|
+
def patch_messaging: (String number, untyped body) -> untyped
|
|
166
|
+
def assign_campaign: (String number, untyped body) -> untyped
|
|
167
|
+
def unassign_campaign: (String number) -> untyped
|
|
168
|
+
def bulk_unassign_campaign: (Array[String] numbers) -> untyped
|
|
169
|
+
def set_port_out_pin: (String number, untyped body) -> untyped
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
class Support < Base
|
|
173
|
+
def list: () -> untyped
|
|
174
|
+
def create: (untyped body) -> untyped
|
|
175
|
+
def get: (Integer id) -> untyped
|
|
176
|
+
def update: (Integer id, untyped body) -> untyped
|
|
177
|
+
def delete: (Integer id) -> untyped
|
|
178
|
+
def messages: (Integer id) -> untyped
|
|
179
|
+
def reply: (Integer id, untyped body) -> untyped
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
class Client
|
|
184
|
+
attr_reader transport: Internal::Transport
|
|
185
|
+
|
|
186
|
+
def initialize: (
|
|
187
|
+
?api_key: String?, ?base_url: String?, ?timeout: Integer | Float,
|
|
188
|
+
?max_retries: Integer, ?user_agent: String?, ?adapter: Symbol?
|
|
189
|
+
) -> void
|
|
190
|
+
|
|
191
|
+
def login: (username: untyped, password: String) -> String
|
|
192
|
+
def api_key: () -> String?
|
|
193
|
+
def base_url: () -> String
|
|
194
|
+
|
|
195
|
+
def account: () -> Resources::Account
|
|
196
|
+
def acl: () -> Resources::Acl
|
|
197
|
+
def authentication: () -> Resources::Authentication
|
|
198
|
+
def e911: () -> Resources::E911
|
|
199
|
+
def gateways: () -> Resources::Gateways
|
|
200
|
+
def i_numbering: () -> Resources::INumbering
|
|
201
|
+
def lookups: () -> Resources::Lookups
|
|
202
|
+
def messaging: () -> Resources::Messaging
|
|
203
|
+
def numbers: () -> Resources::Numbers
|
|
204
|
+
def support: () -> Resources::Support
|
|
205
|
+
end
|
|
206
|
+
end
|