diff --git a/vendor.go b/vendor.go new file mode 100644 index 00000000..f5a5ad2b --- /dev/null +++ b/vendor.go @@ -0,0 +1,73 @@ +package pagerduty + +import ( + "fmt" + "net/http" + + "github.com/google/go-querystring/query" +) + +// Vendor represents a specific type of integration. AWS Cloudwatch, Splunk, Datadog, etc are all examples of vendors that can be integrated in PagerDuty by making an integration. +type Vendor struct { + APIObject + Name string `json:"name,omitempty"` + LogoURL string `json:"logo_url,omitempty"` + LongName string `json:"long_name,omitempty"` + WebsiteURL string `json:"website_url,omitempty"` + Description string `json:"description,omitempty"` + Connectable bool `json:"connectable,omitempty"` + ThumbnailURL string `json:"thumbnail_url,omitempty"` + GenericServiceType string `json:"generic_service_type,omitempty"` + IntegrationGuideURL string `json:"integration_guide_url,omitempty"` +} + +// ListVendorResponse is the data structure returned from calling the ListVendors API endpoint. +type ListVendorResponse struct { + APIListObject + Vendors []Vendor +} + +// ListVendorOptions is the data structure used when calling the ListVendors API endpoint. +type ListVendorOptions struct { + APIListObject +} + +// ListVendors lists existing vendors. +func (c *Client) ListVendors(o ListVendorOptions) (*ListVendorResponse, error) { + v, err := query.Values(o) + + if err != nil { + return nil, err + } + + resp, err := c.get("/vendors?" + v.Encode()) + + if err != nil { + return nil, err + } + + var result ListVendorResponse + return &result, c.decodeJSON(resp, &result) +} + +// GetVendor gets details about an existing vendor. +func (c *Client) GetVendor(id string) (*Vendor, error) { + resp, err := c.get("/vendors/" + id) + return getVendorFromResponse(c, resp, err) +} + +func getVendorFromResponse(c *Client, resp *http.Response, err error) (*Vendor, error) { + if err != nil { + return nil, err + } + var target map[string]Vendor + if dErr := c.decodeJSON(resp, &target); dErr != nil { + return nil, fmt.Errorf("Could not decode JSON response: %v", dErr) + } + rootNode := "vendor" + t, nodeOK := target[rootNode] + if !nodeOK { + return nil, fmt.Errorf("JSON response does not have %s field", rootNode) + } + return &t, nil +}