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