search.go raw

   1  package rest
   2  
   3  import (
   4  	"encoding/json"
   5  	"fmt"
   6  	"net/http"
   7  
   8  	"gopkg.in/ns1/ns1-go.v2/rest/model/dns"
   9  )
  10  
  11  // RecordSearchService handles 'dns/record/search' endpoint.
  12  type RecordSearchService service
  13  
  14  // Find takes query parameters and returns matching DNS records.
  15  func (s *RecordSearchService) Search(params string) (*dns.RecordSearchResult, *http.Response, error) {
  16  	path := fmt.Sprintf("dns/record/search?%s", params)
  17  
  18  	req, err := s.client.NewRequest("GET", path, nil)
  19  	if err != nil {
  20  		return nil, nil, err
  21  	}
  22  
  23  	var r dns.RecordSearchResult
  24  	resp, err := s.client.Do(req, &r)
  25  	if err != nil {
  26  		return nil, resp, err
  27  	}
  28  
  29  	for _, record := range r.Results {
  30  		for _, answer := range record.Answers {
  31  			if err := processSearchAnswer(answer); err != nil {
  32  				fmt.Printf("error processing search answer: %v", err)
  33  				continue
  34  			}
  35  		}
  36  	}
  37  
  38  	return &r, resp, nil
  39  }
  40  
  41  func processSearchAnswer(answer *dns.SearchAnswer) error {
  42  	if len(answer.Raw) == 0 {
  43  		return nil
  44  	}
  45  
  46  	var rawArray []interface{}
  47  	if err := json.Unmarshal(answer.Raw, &rawArray); err != nil {
  48  		return err
  49  	}
  50  
  51  	answer.Rdata = make([]string, len(rawArray))
  52  	for i, v := range rawArray {
  53  		switch val := v.(type) {
  54  		case string:
  55  			answer.Rdata[i] = val
  56  		case float64:
  57  			answer.Rdata[i] = fmt.Sprintf("%.0f", val)
  58  		case int:
  59  			answer.Rdata[i] = fmt.Sprintf("%d", val)
  60  		default:
  61  			answer.Rdata[i] = fmt.Sprintf("%v", val)
  62  		}
  63  	}
  64  
  65  	return nil
  66  }
  67  
  68  // ZoneSearchService handles 'dns/zone/search' endpoint.
  69  type ZoneSearchService service
  70  
  71  func (s *ZoneSearchService) Search(params string) (*dns.ZoneSearchResult, *http.Response, error) {
  72  	path := fmt.Sprintf("dns/zone/search?%s", params)
  73  
  74  	req, err := s.client.NewRequest("GET", path, nil)
  75  	if err != nil {
  76  		return nil, nil, err
  77  	}
  78  
  79  	var result dns.ZoneSearchResult
  80  	resp, err := s.client.Do(req, &result)
  81  	if err != nil {
  82  		return nil, resp, err
  83  	}
  84  
  85  	return &result, resp, nil
  86  }
  87