-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathincoming_numbers.go
95 lines (83 loc) · 2.46 KB
/
incoming_numbers.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
package vtwilio
import (
"fmt"
"net/http"
"net/url"
"reflect"
"strings"
)
// IncomingPhoneNumber purchase an incoming phone number
func (v *VTwilio) IncomingPhoneNumber(number string, opts ...IncomingPhoneNumberOption) (*IncomingPhoneNumber, error) {
return v.incomingPhoneNumber(number, "", opts...)
}
// UpdateIncomingPhoneNumber updates an existing phone numbers info
func (v *VTwilio) UpdateIncomingPhoneNumber(number, sid string, opts ...IncomingPhoneNumberOption) (*IncomingPhoneNumber, error) {
return v.incomingPhoneNumber(number, sid, opts...)
}
func (v *VTwilio) incomingPhoneNumber(number, sid string, opts ...IncomingPhoneNumberOption) (*IncomingPhoneNumber, error) {
if err := validateNumber(number); err != nil {
return nil, err
}
config := &incomingNumberConfiguration{
PhoneNumber: number,
}
for _, o := range opts {
o(config)
}
en := buildPostValues(config)
urlStr := buildIncomingPhoneNumber(v.baseAPI, v.accountSID, sid)
req, err := http.NewRequest("POST", urlStr, strings.NewReader(en))
if err != nil {
return nil, err
}
setUpRequest(req, v.accountSID, v.authToken)
return handleIncomingPhoneNumbers(req)
}
func buildIncomingPhoneNumber(api, accountSID, sid string) string {
urlStr := fmt.Sprintf("%s%s%s", api, accountSID, incomingPhoneNumbersAPI)
if sid != "" {
urlStr = fmt.Sprintf("%s/%s", urlStr, sid)
}
urlStr = fmt.Sprintf("%s.json", urlStr)
return urlStr
}
// ReleaseNumber "deletes" a number. This number could be used by someone else.
func (v *VTwilio) ReleaseNumber(sid string) error {
if sid == "" {
return fmt.Errorf("invalid sid")
}
urlStr := buildIncomingPhoneNumber(v.baseAPI, v.accountSID, sid)
req, err := http.NewRequest("DELETE", urlStr, nil)
if err != nil {
return err
}
setUpRequest(req, v.accountSID, v.authToken)
return genericHandler(req)
}
func validateNumber(n string) error {
if n == "" {
return fmt.Errorf("phone number is required")
}
if n[0] != '+' {
return fmt.Errorf("phone number must begin with +")
}
if strings.Contains(n, "-") {
return fmt.Errorf("phone number must be numbers")
}
if len(n) > 16 {
return fmt.Errorf("number can only contain 15 digits")
}
return nil
}
func buildPostValues(c *incomingNumberConfiguration) string {
v := reflect.Indirect(reflect.ValueOf(c))
values := url.Values{}
for i := 0; i < v.NumField(); i++ {
val, _ := v.Field(i).Interface().(string)
if val == "" {
continue
}
values.Set(v.Type().Field(i).Tag.Get(tag), val)
}
return values.Encode()
}