diff --git a/extension_schema.go b/extension_schema.go new file mode 100644 index 00000000..eeee2dd0 --- /dev/null +++ b/extension_schema.go @@ -0,0 +1,70 @@ +package pagerduty + +import ( + "fmt" + "net/http" + + "github.com/google/go-querystring/query" +) + +type ExtensionSchema struct { + APIObject + IconURL string `json:"icon_url"` + LogoURL string `json:"logo_url"` + Label string `json:"label"` + Key string `json:"key"` + Description string `json:"description"` + GuideURL string `json:"guide_url"` + SendTypes []string `json:"send_types"` + URL string `json:"url"` +} + +type ListExtensionSchemaResponse struct { + APIListObject + ExtensionSchemas []ExtensionSchema `json:"extension_schemas"` +} + +type ListExtensionSchemaOptions struct { + APIListObject + Query string `url:"query,omitempty"` +} + +func (c *Client) ListExtensionSchemas(o ListExtensionSchemaOptions) (*ListExtensionSchemaResponse, error) { + v, err := query.Values(o) + if err != nil { + return nil, err + } + + resp, err := c.get("/extension_schemas?" + v.Encode()) + if err != nil { + return nil, err + } + + var result ListExtensionSchemaResponse + + return &result, c.decodeJSON(resp, &result) +} + +func (c *Client) GetExtensionSchema(id string) (*ExtensionSchema, error) { + resp, err := c.get("/extension_schemas/" + id) + return getExtensionSchemaFromResponse(c, resp, err) +} + +func getExtensionSchemaFromResponse(c *Client, resp *http.Response, err error) (*ExtensionSchema, error) { + if err != nil { + return nil, err + } + + var target map[string]ExtensionSchema + if dErr := c.decodeJSON(resp, &target); dErr != nil { + return nil, fmt.Errorf("Could not decode JSON response: %v", dErr) + } + + rootNode := "extension_schema" + t, nodeOK := target[rootNode] + if !nodeOK { + return nil, fmt.Errorf("JSON response does not have %s field", rootNode) + } + + return &t, nil +} diff --git a/extension_schema_test.go b/extension_schema_test.go new file mode 100644 index 00000000..8374f0de --- /dev/null +++ b/extension_schema_test.go @@ -0,0 +1,78 @@ +package pagerduty + +import ( + "net/http" + "testing" +) + +func TestExtensionSchema_List(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/extension_schemas", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + w.Write([]byte(`{"extension_schemas":[{"id":"1","summary":"foo","send_types":["trigger", "acknowledge", "resolve"]}]}`)) + + }) + + var listObj = APIListObject{Limit: 0, Offset: 0, More: false, Total: 0} + var client = &Client{apiEndpoint: server.URL, authToken: "foo", HTTPClient: defaultHTTPClient} + var opts = ListExtensionSchemaOptions{ + APIListObject: listObj, + Query: "foo", + } + + res, err := client.ListExtensionSchemas(opts) + + want := &ListExtensionSchemaResponse{ + APIListObject: listObj, + ExtensionSchemas: []ExtensionSchema{ + { + APIObject: APIObject{ + ID: "1", + Summary: "foo", + }, + SendTypes: []string{ + "trigger", + "acknowledge", + "resolve", + }, + }, + }, + } + + if err != nil { + t.Fatal(err) + } + testEqual(t, want, res) +} + +func TestExtensionSchema_Get(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/extension_schemas/1", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + w.Write([]byte(`{"extension_schema": {"name": "foo", "id": "1", "send_types": ["trigger", "acknowledge", "resolve"]}}`)) + }) + + var client = &Client{apiEndpoint: server.URL, authToken: "foo", HTTPClient: defaultHTTPClient} + + res, err := client.GetExtensionSchema("1") + + want := &ExtensionSchema{ + APIObject: APIObject{ + ID: "1", + }, + SendTypes: []string{ + "trigger", + "acknowledge", + "resolve", + }, + } + + if err != nil { + t.Fatal(err) + } + testEqual(t, want, res) +}