-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathvtwilio.go
142 lines (127 loc) · 4.72 KB
/
vtwilio.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package vtwilio
// Interface for VTwilio
type Interface interface {
SetPhoneNumber(n string) *VTwilio
SendMessage(message string, to string, opts ...SendOption) (*Message, error)
ListMessages(opts ...ListOption) (*List, error)
GetMessage(messageSID string) (*Message, error)
AvailablePhoneNumbers(countryCode string, opts ...AvailableOption) (*AvailablePhoneNumbers, error)
IncomingPhoneNumber(number string, opts ...IncomingPhoneNumberOption) (*IncomingPhoneNumber, error)
UpdateIncomingPhoneNumber(number, sid string, opts ...IncomingPhoneNumberOption) (*IncomingPhoneNumber, error)
ReleaseNumber(sid string) error
}
const (
baseAPI = "https://api.twilio.com/2010-04-01/Accounts/"
messageAPI = "/Messages"
availablePhoneNumbersAPI = "/AvailablePhoneNumbers"
incomingPhoneNumbersAPI = "/IncomingPhoneNumbers"
local = "/Local"
tag = "vtwilio"
)
// VTwilio is a structure holding details about a twilio account
type VTwilio struct {
accountSID string
authToken string
twilioNumber string
baseAPI string
}
// List is a response from a get
type List struct {
FirstPageURI string `json:"first_page_uri"`
End int `json:"end"`
PreviousPageURI string `json:"previous_page_uri"`
Messages []*Message `json:"messages"`
}
// Media contains media data
type Media struct {
Media string `json:"media"`
}
// Message is a response from Twilio
type Message struct {
SID string `json:"sid"`
DateCreated string `json:"date_created"`
DateUpdated string `json:"date_updated"`
DateSent string `json:"date_sent"`
AccountSID string `json:"account_sid"`
To string `json:"to"`
From string `json:"from"`
MessagingServiceSID string `json:"messaging_service_sid"`
Body string `json:"body"`
Status string `json:"status"`
NumSegments string `json:"num_segments"`
NumMedia string `json:"num_media"`
Direction string `json:"direction"`
APIVersion string `json:"api_version"`
Price string `json:"price"`
PriceUnit string `json:"price_unit"`
ErrorCode string `json:"error_code"`
ErrorMessage string `json:"error_message"`
URI string `json:"uri"`
SubresourceURIs Media `json:"subresource_uris"`
}
// Capabilities structure
type Capabilities struct {
Voice bool `json:"voice"`
SMS bool `json:"SMS"`
MMS bool `json:"MMS"`
}
// AvailablePhoneNumberData is the data for an available phone number
type AvailablePhoneNumberData struct {
FriendlyName string `json:"friendly_name"`
PhoneNumber string `json:"phone_number"`
LATA string `json:"lata"`
RateCenter string `json:"rate_center"`
Latitude string `json:"latitude"`
Longitude string `json:"longitude"`
Region string `json:"region"`
PostalCode string `json:"postal_code"`
ISOCountry string `json:"iso_country"`
Capabilities Capabilities `json:"capabilities"`
Beta bool `json:"beta"`
}
// AvailablePhoneNumbers response form twilio
type AvailablePhoneNumbers struct {
URI string `json:"uri"`
AvailablePhoneNumber []AvailablePhoneNumberData `json:"available_phone_numbers"`
}
// IncomingPhoneNumber data from twilio
type IncomingPhoneNumber struct {
SID string `json:"sid"`
AccountSID string `json:"account_sid"`
FriendlyName string `json:"friendly_name"`
PhoneNumber string `json:"phone_number"`
VoiceURL string `json:"voice_url"`
VoiceMethod string `json:"voice_method"`
VoiceFallbackURL string `json:"voice_fallback_url"`
VoiceFallbackMethod string `json:"voice_fallback_method"`
DateCreated string `json:"date_created"`
DateUpdated string `json:"date_updated"`
Capabilities Capabilities `json:"capabilities"`
Beta bool `json:"beta"`
URI string `json:"uri"`
}
// Option options for vtwilio
type Option func(*VTwilio)
// TwilioNumber sets the twilio number
func TwilioNumber(n string) Option {
return func(v *VTwilio) {
v.twilioNumber = n
}
}
// NewVTwilio returns a new NewVTwilio instance
func NewVTwilio(accountSID, authToken string, opts ...Option) *VTwilio {
v := &VTwilio{accountSID: accountSID, authToken: authToken}
for _, o := range opts {
o(v)
}
setDefaults(v)
return v
}
func setDefaults(v *VTwilio) {
v.baseAPI = baseAPI
}
// SetPhoneNumber sets the twilio phone number
func (v *VTwilio) SetPhoneNumber(n string) *VTwilio {
v.twilioNumber = n
return v
}