blob: cdc025536360d0c73ed950c210a148711f445764 [file] [log] [blame]
Sergiusz Bazanski325e9472019-09-27 02:49:47 +02001package main
2
3import (
4 "context"
5 "encoding/json"
6 "fmt"
7 "net/http"
8 "net/url"
9 "strings"
10)
11
12type twilio struct {
13 accountSID string
14 accountToken string
15}
16
17type incomingPhoneNumber struct {
18 FriendlyName string `json:"friendly_name"`
19 SMSMethod string `json:"sms_method"`
20 SMSURL string `json:"sms_url"`
21 SID string `json:"sid"`
22}
23
24func (t *twilio) getIncomingPhoneNumbers(ctx context.Context) ([]incomingPhoneNumber, error) {
25 url := fmt.Sprintf("https://api.twilio.com/2010-04-01/Accounts/%s/IncomingPhoneNumbers.json", t.accountSID)
26 req, err := http.NewRequest("GET", url, nil)
27 if err != nil {
28 return nil, err
29 }
30 req = req.WithContext(ctx)
31 req.SetBasicAuth(t.accountSID, t.accountToken)
32 res, err := http.DefaultClient.Do(req)
33 if err != nil {
34 return nil, err
35 }
36 defer res.Body.Close()
37
38 result := struct {
39 Message string `json:"message"`
40 Status int64 `json:"status"`
41 IPN []incomingPhoneNumber `json:"incoming_phone_numbers"`
42 }{}
43
44 if err := json.NewDecoder(res.Body).Decode(&result); err != nil {
45 return nil, err
46 }
47
48 if result.Message != "" {
49 return nil, fmt.Errorf("REST response error, status: %v, message: %q", result.Status, result.Message)
50 }
51
52 return result.IPN, nil
53}
54
55func (t *twilio) updateIncomingPhoneNumberSMSWebhook(ctx context.Context, sid, method, whurl string) error {
56 turl := fmt.Sprintf("https://api.twilio.com/2010-04-01/Accounts/%s/IncomingPhoneNumbers/%s.json", t.accountSID, sid)
57
58 data := url.Values{}
59 data.Set("SmsMethod", method)
60 data.Set("SmsUrl", whurl)
61
62 req, err := http.NewRequest("POST", turl, strings.NewReader(data.Encode()))
63 if err != nil {
64 return err
65 }
66 req = req.WithContext(ctx)
67 req.SetBasicAuth(t.accountSID, t.accountToken)
68 req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
69 res, err := http.DefaultClient.Do(req)
70 if err != nil {
71 return err
72 }
73 defer res.Body.Close()
74
75 if res.StatusCode != 200 {
76 return fmt.Errorf("status code: %v", res.StatusCode)
77 }
78 return nil
79}