forked from carlosdp/twiliogo
/
incoming_phone_number.go
149 lines (128 loc) · 4.73 KB
/
incoming_phone_number.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
143
144
145
146
147
148
149
package twiliogo
import (
"encoding/json"
"fmt"
"net/url"
"strconv"
)
type Capabilites struct {
Voice bool `json:"voice"`
SMS bool `json:"SMS"`
MMS bool `json:"MMS"`
}
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"`
StatusCallback string `json:"status_callback"`
StatusCallbackMethod string `json:"status_callback_method"`
VoiceCallerIdLookup bool `json:"voice_caller_id_lookup"`
VoiceApplicationId string `json:"voice_application_id"`
DateCreated string `json:"date_created"`
DateUpdated string `json:"date_updated"`
SmsUrl string `json:"sms_url"`
SmsMethod string `json:"sms_method"`
SmsFallbackUrl string `json:"sms_fallback_url"`
SmsFallbackMethod string `json:"sms_fallback_method"`
SmsApplicationId string `json:"sms_application_id"`
Capabilities Capabilites `json:"capabilities"`
ApiVersion string `json:"api_version"`
Uri string `json:"uri"`
}
func GetIncomingPhoneNumber(client Client, sid string) (*IncomingPhoneNumber, error) {
var incomingPhoneNumber *IncomingPhoneNumber
res, err := client.get(url.Values{}, "/IncomingPhoneNumbers/"+sid+".json")
if err != nil {
return nil, err
}
incomingPhoneNumber = new(IncomingPhoneNumber)
err = json.Unmarshal(res, incomingPhoneNumber)
return incomingPhoneNumber, err
}
func BuyPhoneNumber(client Client, number Optional) (*IncomingPhoneNumber, error) {
var incomingPhoneNumber *IncomingPhoneNumber
if number == nil {
return nil, Error{"Must input PhoneNumber or AreaCode"}
}
params := url.Values{}
param, value := number.GetParam()
params.Set(param, value)
res, err := client.post(params, "/IncomingPhoneNumbers.json")
if err != nil {
return incomingPhoneNumber, err
}
incomingPhoneNumber = new(IncomingPhoneNumber)
err = json.Unmarshal(res, incomingPhoneNumber)
return incomingPhoneNumber, err
}
// UpdateSetPhoneNumberFields updates any non-empty fields (other than sid) in the passed struct
// because pretty much every field can be updated, we assume we are handed a
// struct with only the fields that we want to update and the sid nonempty.
//
// Because we can't set the bool VoiceCallerIdLookup to false or true, we must
// pass it explicitly as a pointer to true or false, or else leave it nil to leave it alone
func UpdatePhoneNumberFields(client Client, number *IncomingPhoneNumber, voiceCallerIdLookup *bool) (*IncomingPhoneNumber, error) {
if number == nil || len(number.Sid) == 0 {
return nil, fmt.Errorf("You must pass a struct with sid set")
}
changes := url.Values{}
if len(number.AccountSid) > 0 {
changes.Add("AccountSid", number.AccountSid)
}
if len(number.FriendlyName) > 0 {
changes.Add("FriendlyName", number.FriendlyName)
}
if len(number.ApiVersion) > 0 {
changes.Add("ApiVersion", number.ApiVersion)
}
if len(number.VoiceUrl) > 0 {
changes.Add("VoiceUrl", number.VoiceUrl)
}
if len(number.VoiceMethod) > 0 {
changes.Add("VoiceMethod", number.VoiceMethod)
}
if len(number.VoiceFallbackUrl) > 0 {
changes.Add("VoiceFallbackUrl", number.VoiceFallbackUrl)
}
if len(number.VoiceFallbackMethod) > 0 {
changes.Add("VoiceFallbackMethod", number.VoiceFallbackMethod)
}
if len(number.StatusCallback) > 0 {
changes.Add("StatusCallback", number.StatusCallback)
}
if len(number.StatusCallbackMethod) > 0 {
changes.Add("StatusCallbackMethod", number.StatusCallbackMethod)
}
if voiceCallerIdLookup != nil {
changes.Add("VoiceCallerIdLookup", strconv.FormatBool(*voiceCallerIdLookup))
}
if len(number.SmsUrl) > 0 {
changes.Add("SmsUrl", number.SmsUrl)
}
if len(number.SmsMethod) > 0 {
changes.Add("SmsMethod", number.SmsMethod)
}
if len(number.SmsFallbackUrl) > 0 {
changes.Add("SmsFallbackUrl", number.SmsFallbackUrl)
}
if len(number.SmsFallbackMethod) > 0 {
changes.Add("SmsFallbackMethod", number.SmsFallbackMethod)
}
res, err := client.post(changes, "/IncomingPhoneNumbers/"+number.Sid+".json")
if err != nil {
return nil, err
}
var incomingPhoneNumber *IncomingPhoneNumber
incomingPhoneNumber = new(IncomingPhoneNumber)
err = json.Unmarshal(res, incomingPhoneNumber)
return incomingPhoneNumber, err
}
func ReleasePhoneNumber(client Client, sid string) error {
err := client.delete("/IncomingPhoneNumbers/" + sid)
return err
}