dataset.go raw

   1  package rest
   2  
   3  import (
   4  	"bytes"
   5  	"errors"
   6  	"fmt"
   7  	"net/http"
   8  	"strings"
   9  
  10  	"gopkg.in/ns1/ns1-go.v2/rest/model/dataset"
  11  )
  12  
  13  var (
  14  	// ErrDatasetNotFound bundles GET/POST/DELETE not found errors.
  15  	ErrDatasetNotFound = errors.New("dataset not found")
  16  )
  17  
  18  // DatasetsService handles 'datasets' endpoint.
  19  type DatasetsService service
  20  
  21  // List returns the configured datasets.
  22  //
  23  // NS1 API docs: https://developer.ibm.com/apis/catalog/ns1--ibm-ns1-connect-api/api/API--ns1--ibm-ns1-connect-api#listDataset
  24  func (s *DatasetsService) List() ([]*dataset.Dataset, *http.Response, error) {
  25  	req, err := s.client.NewRequest("GET", "datasets", nil)
  26  	if err != nil {
  27  		return nil, nil, err
  28  	}
  29  
  30  	dts := make([]*dataset.Dataset, 0)
  31  	resp, err := s.client.Do(req, &dts)
  32  
  33  	return dts, resp, err
  34  }
  35  
  36  // Get takes a dataset id and returns all its data.
  37  //
  38  // NS1 API docs: https://developer.ibm.com/apis/catalog/ns1--ibm-ns1-connect-api/api/API--ns1--ibm-ns1-connect-api#getDataset
  39  func (s *DatasetsService) Get(dtID string) (*dataset.Dataset, *http.Response, error) {
  40  	path := fmt.Sprintf("datasets/%s", dtID)
  41  
  42  	req, err := s.client.NewRequest("GET", path, nil)
  43  	if err != nil {
  44  		return nil, nil, err
  45  	}
  46  
  47  	var dt dataset.Dataset
  48  	resp, err := s.client.Do(req, &dt)
  49  	if err != nil {
  50  		var clientErr *Error
  51  		switch {
  52  		case errors.As(err, &clientErr):
  53  			if strings.HasSuffix(clientErr.Message, " not found") {
  54  				return nil, resp, ErrDatasetNotFound
  55  			}
  56  		}
  57  		return nil, resp, err
  58  	}
  59  
  60  	return &dt, resp, nil
  61  }
  62  
  63  // Create takes a *Dataset and creates a new dataset.
  64  //
  65  // NS1 API docs: https://developer.ibm.com/apis/catalog/ns1--ibm-ns1-connect-api/api/API--ns1--ibm-ns1-connect-api#createDataset
  66  func (s *DatasetsService) Create(dt *dataset.Dataset) (*dataset.Dataset, *http.Response, error) {
  67  	req, err := s.client.NewRequest("PUT", "datasets", dt)
  68  	if err != nil {
  69  		return nil, nil, err
  70  	}
  71  
  72  	resp, err := s.client.Do(req, dt)
  73  	return dt, resp, err
  74  }
  75  
  76  // Delete takes a dataset id and deletes it.
  77  //
  78  // NS1 API docs: https://developer.ibm.com/apis/catalog/ns1--ibm-ns1-connect-api/api/API--ns1--ibm-ns1-connect-api#deleteDataset
  79  func (s *DatasetsService) Delete(dtID string) (*http.Response, error) {
  80  	path := fmt.Sprintf("datasets/%s", dtID)
  81  
  82  	req, err := s.client.NewRequest("DELETE", path, nil)
  83  	if err != nil {
  84  		return nil, err
  85  	}
  86  
  87  	resp, err := s.client.Do(req, nil)
  88  	if err != nil {
  89  		var clientErr *Error
  90  		switch {
  91  		case errors.As(err, &clientErr):
  92  			if strings.HasSuffix(clientErr.Message, " not found") {
  93  				return resp, ErrDatasetNotFound
  94  			}
  95  		}
  96  		return resp, err
  97  	}
  98  
  99  	return resp, nil
 100  }
 101  
 102  // GetReport takes a dataset id and a report id and returns bytes.Buffer which contains the file contents
 103  // Additionally, file name can be grabbed from the 'Content-Disposition' header in the http.Response
 104  //
 105  // NS1 API docs: https://developer.ibm.com/apis/catalog/ns1--ibm-ns1-connect-api/api/API--ns1--ibm-ns1-connect-api#getDatasetReport
 106  func (s *DatasetsService) GetReport(dtID string, reportID string) (*bytes.Buffer, *http.Response, error) {
 107  	path := fmt.Sprintf("datasets/%s/reports/%s", dtID, reportID)
 108  
 109  	req, err := s.client.NewRequest("GET", path, nil)
 110  	if err != nil {
 111  		return nil, nil, err
 112  	}
 113  
 114  	var buf bytes.Buffer
 115  
 116  	resp, err := s.client.Do(req, &buf)
 117  	if err != nil {
 118  		var clientErr *Error
 119  		switch {
 120  		case errors.As(err, &clientErr):
 121  			if strings.HasSuffix(clientErr.Message, " not found") {
 122  				return nil, resp, ErrDatasetNotFound
 123  			}
 124  		}
 125  		return nil, resp, err
 126  	}
 127  
 128  	return &buf, resp, nil
 129  }
 130