dns_view.go raw
1 package rest
2
3 import (
4 "errors"
5 "fmt"
6 "net/http"
7
8 "gopkg.in/ns1/ns1-go.v2/rest/model/dns"
9 )
10
11 // DNSViewService handles 'views/' endpoint.
12 type DNSViewService service
13
14 // List returns all DNS Views
15 //
16 // NS1 API docs: https://ns1.com/api#getlist-all-dns-views
17 func (s *DNSViewService) List() ([]*dns.View, *http.Response, error) {
18 req, err := s.client.NewRequest("GET", "views", nil)
19 if err != nil {
20 return nil, nil, err
21 }
22
23 var vl []*dns.View
24 resp, err := s.client.Do(req, &vl)
25 if err != nil {
26 return nil, resp, err
27 }
28
29 return vl, resp, nil
30 }
31
32 // Create takes a *dns.DNSView and creates a new DNS View.
33 //
34 // The given DNSView must have at least the name
35 // NS1 API docs: https://ns1.com/api#putcreate-a-dns-view
36 func (s *DNSViewService) Create(v *dns.View) (*http.Response, error) {
37 req, err := s.client.NewRequest("PUT", fmt.Sprintf("/v1/views/%s", v.Name), v)
38 if err != nil {
39 return nil, err
40 }
41
42 resp, err := s.client.Do(req, nil)
43 if err != nil {
44 switch errType := err.(type) {
45 case *Error:
46 if errType.Resp.StatusCode == http.StatusConflict {
47 return nil, ErrViewExists
48 }
49 }
50
51 return resp, err
52 }
53
54 return resp, nil
55 }
56
57 // Get takes a DNS view name and returns DNSView struct.
58 //
59 // NS1 API docs: https://ns1.com/api#getview-dns-view-details
60 func (s *DNSViewService) Get(viewName string) (*dns.View, *http.Response, error) {
61 path := fmt.Sprintf("views/%s", viewName)
62
63 req, err := s.client.NewRequest("GET", path, nil)
64 if err != nil {
65 return nil, nil, err
66 }
67
68 var v dns.View
69 resp, err := s.client.Do(req, &v)
70 if err != nil {
71 switch errType := err.(type) {
72 case *Error:
73 if errType.Resp.StatusCode == http.StatusNotFound {
74 return nil, resp, ErrViewMissing
75 }
76 }
77 return nil, resp, err
78 }
79
80 return &v, resp, nil
81 }
82
83 // Update takes a *dns.DNSView and updates the DNS view with same name on NS1.
84 //
85 // NS1 API docs: https://ns1.com/api#postedit-a-dns-view
86 func (s *DNSViewService) Update(v *dns.View) (*http.Response, error) {
87 path := fmt.Sprintf("views/%s", v.Name)
88
89 req, err := s.client.NewRequest("POST", path, &v)
90 if err != nil {
91 return nil, err
92 }
93
94 resp, err := s.client.Do(req, &v)
95 if err != nil {
96 switch errType := err.(type) {
97 case *Error:
98 if errType.Resp.StatusCode == http.StatusNotFound {
99 return resp, ErrViewMissing
100 }
101 }
102 return resp, err
103 }
104
105 return resp, nil
106 }
107
108 // Delete takes a DNS view name, and removes an existing DNS view
109 //
110 // NS1 API docs: https://ns1.com/api#deletedelete-a-dns-view
111 func (s *DNSViewService) Delete(viewName string) (*http.Response, error) {
112 path := fmt.Sprintf("views/%s", viewName)
113
114 req, err := s.client.NewRequest("DELETE", path, nil)
115 if err != nil {
116 return nil, err
117 }
118
119 resp, err := s.client.Do(req, nil)
120 if err != nil {
121 switch errType := err.(type) {
122 case *Error:
123 if errType.Resp.StatusCode == http.StatusNotFound {
124 return resp, ErrViewMissing
125 }
126 }
127 return resp, err
128 }
129
130 return resp, nil
131 }
132
133 // GetPreferences returns a map[string]int of preferences.
134 //
135 // NS1 API docs: https://ns1.com/api#getget-dns-view-preference
136 func (s *DNSViewService) GetPreferences() (map[string]int, *http.Response, error) {
137 path := "config/views/preference"
138
139 req, err := s.client.NewRequest("GET", path, nil)
140 if err != nil {
141 return nil, nil, err
142 }
143
144 m := make(map[string]int)
145 resp, err := s.client.Do(req, &m)
146 if err != nil {
147 return nil, resp, err
148 }
149
150 return m, resp, nil
151 }
152
153 // UpdatePreferences takes a map[string]int and returns a map[string]int of preferences.
154 //
155 // NS1 API docs: https://ns1.com/api#postedit-dns-view-preference
156 func (s *DNSViewService) UpdatePreferences(m map[string]int) (map[string]int, *http.Response, error) {
157 path := "config/views/preference"
158
159 req, err := s.client.NewRequest("POST", path, m)
160 if err != nil {
161 return nil, nil, err
162 }
163
164 mapUpdated := make(map[string]int)
165 resp, err := s.client.Do(req, &mapUpdated)
166 if err != nil {
167 switch errType := err.(type) {
168 case *Error:
169 if errType.Resp.StatusCode == http.StatusNotFound {
170 return nil, resp, ErrViewMissing
171 }
172 }
173 return nil, resp, err
174 }
175
176 return mapUpdated, resp, nil
177 }
178
179 var (
180 // ErrViewExists bundles CREATE error.
181 ErrViewExists = errors.New("DNS view already exists")
182
183 // ErrViewMissing bundles GET error.
184 ErrViewMissing = errors.New("DNS view not found")
185 )
186