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