diff --git a/.gitignore b/.gitignore index daf913b..b98422d 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,6 @@ _testmain.go *.exe *.test *.prof + +# vim swap files +.*.sw? diff --git a/client.go b/client.go index 1ab6884..d2d1266 100644 --- a/client.go +++ b/client.go @@ -53,9 +53,9 @@ func (c *Client) newRequest(method, requestPath string, query url.Values, body i if os.Getenv("GF_LOG") != "" { if body == nil { - log.Println("request to ", url.String(), "with no body data") + log.Printf("request (%s) to %s with no body data", method, url.String()) } else { - log.Println("request to ", url.String(), "with body data", body.(*bytes.Buffer).String()) + log.Printf("request (%s) to %s with body data: %s", method, url.String(), body.(*bytes.Buffer).String()) } } diff --git a/dashboard.go b/dashboard.go index 8e4d6c4..2d6418f 100644 --- a/dashboard.go +++ b/dashboard.go @@ -6,24 +6,32 @@ import ( "errors" "fmt" "io/ioutil" + "log" + "os" ) type DashboardMeta struct { IsStarred bool `json:"isStarred"` Slug string `json:"slug"` + Folder int64 `json:"folderId"` } type DashboardSaveResponse struct { Slug string `json:"slug"` + Id int64 `json:"id"` + Uid string `json:"uid"` Status string `json:"status"` Version int64 `json:"version"` } type Dashboard struct { - Meta DashboardMeta `json:"meta"` - Model map[string]interface{} `json:"dashboard"` + Meta DashboardMeta `json:"meta"` + Model map[string]interface{} `json:"dashboard"` + Folder int64 `json:"folderId"` + Overwrite bool `json:overwrite` } +// Deprecated: use NewDashboard instead func (c *Client) SaveDashboard(model map[string]interface{}, overwrite bool) (*DashboardSaveResponse, error) { wrapper := map[string]interface{}{ "dashboard": model, @@ -38,6 +46,35 @@ func (c *Client) SaveDashboard(model map[string]interface{}, overwrite bool) (*D return nil, err } + resp, err := c.Do(req) + if err != nil { + return nil, err + } + if resp.StatusCode != 200 { + data, _ = ioutil.ReadAll(resp.Body) + return nil, fmt.Errorf("status: %d, body: %s", resp.StatusCode, data) + } + + data, err = ioutil.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + result := &DashboardSaveResponse{} + err = json.Unmarshal(data, &result) + return result, err +} + +func (c *Client) NewDashboard(dashboard Dashboard) (*DashboardSaveResponse, error) { + data, err := json.Marshal(dashboard) + if err != nil { + return nil, err + } + req, err := c.newRequest("POST", "/api/dashboards/db", nil, bytes.NewBuffer(data)) + if err != nil { + return nil, err + } + resp, err := c.Do(req) if err != nil { return nil, err @@ -78,6 +115,10 @@ func (c *Client) Dashboard(slug string) (*Dashboard, error) { result := &Dashboard{} err = json.Unmarshal(data, &result) + result.Folder = result.Meta.Folder + if os.Getenv("GF_LOG") != "" { + log.Printf("got back dashboard response %s", data) + } return result, err } diff --git a/folder.go b/folder.go new file mode 100644 index 0000000..55613c6 --- /dev/null +++ b/folder.go @@ -0,0 +1,121 @@ +package gapi + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io/ioutil" +) + +type Folder struct { + Id int64 `json:"id"` + Uid string `json:"uid"` + Title string `json:"title"` +} + +func (c *Client) Folders() ([]Folder, error) { + folders := make([]Folder, 0) + + req, err := c.newRequest("GET", "/api/folders/", nil, nil) + if err != nil { + return folders, err + } + resp, err := c.Do(req) + if err != nil { + return folders, err + } + if resp.StatusCode != 200 { + return folders, errors.New(resp.Status) + } + data, err := ioutil.ReadAll(resp.Body) + if err != nil { + return folders, err + } + err = json.Unmarshal(data, &folders) + return folders, err +} + +func (c *Client) Folder(id int64) (*Folder, error) { + folder := &Folder{} + req, err := c.newRequest("GET", fmt.Sprintf("/api/folders/id/%d", id), nil, nil) + if err != nil { + return folder, err + } + resp, err := c.Do(req) + if err != nil { + return folder, err + } + if resp.StatusCode != 200 { + return folder, errors.New(resp.Status) + } + data, err := ioutil.ReadAll(resp.Body) + if err != nil { + return folder, err + } + err = json.Unmarshal(data, &folder) + return folder, err +} + +func (c *Client) NewFolder(title string) (Folder, error) { + folder := Folder{} + dataMap := map[string]string{ + "title": title, + } + data, err := json.Marshal(dataMap) + req, err := c.newRequest("POST", "/api/folders", nil, bytes.NewBuffer(data)) + if err != nil { + return folder, err + } + resp, err := c.Do(req) + if err != nil { + return folder, err + } + if resp.StatusCode != 200 { + data, _ = ioutil.ReadAll(resp.Body) + return folder, fmt.Errorf("status: %s body: %s", resp.Status, data) + } + data, err = ioutil.ReadAll(resp.Body) + if err != nil { + return folder, err + } + err = json.Unmarshal(data, &folder) + if err != nil { + return folder, err + } + return folder, err +} + +func (c *Client) UpdateFolder(id string, name string) error { + dataMap := map[string]string{ + "name": name, + } + data, err := json.Marshal(dataMap) + req, err := c.newRequest("PUT", fmt.Sprintf("/api/folders/%s", id), nil, bytes.NewBuffer(data)) + if err != nil { + return err + } + resp, err := c.Do(req) + if err != nil { + return err + } + if resp.StatusCode != 200 { + return errors.New(resp.Status) + } + return err +} + +func (c *Client) DeleteFolder(id string) error { + req, err := c.newRequest("DELETE", fmt.Sprintf("/api/folders/%s", id), nil, nil) + if err != nil { + return err + } + resp, err := c.Do(req) + if err != nil { + return err + } + if resp.StatusCode != 200 { + return errors.New(resp.Status) + } + return err +} diff --git a/folder_test.go b/folder_test.go new file mode 100644 index 0000000..f02f313 --- /dev/null +++ b/folder_test.go @@ -0,0 +1,156 @@ +package gapi + +import ( + "github.com/gobs/pretty" + "testing" +) + +const ( + getFoldersJSON = ` +[ + { + "id":1, + "uid": "nErXDvCkzz", + "title": "Departmenet ABC", + "url": "/dashboards/f/nErXDvCkzz/department-abc", + "hasAcl": false, + "canSave": true, + "canEdit": true, + "canAdmin": true, + "createdBy": "admin", + "created": "2018-01-31T17:43:12+01:00", + "updatedBy": "admin", + "updated": "2018-01-31T17:43:12+01:00", + "version": 1 + } +] + ` + getFolderJSON = ` +{ + "id":1, + "uid": "nErXDvCkzz", + "title": "Departmenet ABC", + "url": "/dashboards/f/nErXDvCkzz/department-abc", + "hasAcl": false, + "canSave": true, + "canEdit": true, + "canAdmin": true, + "createdBy": "admin", + "created": "2018-01-31T17:43:12+01:00", + "updatedBy": "admin", + "updated": "2018-01-31T17:43:12+01:00", + "version": 1 +} +` + createdFolderJSON = ` +{ + "id":1, + "uid": "nErXDvCkzz", + "title": "Departmenet ABC", + "url": "/dashboards/f/nErXDvCkzz/department-abc", + "hasAcl": false, + "canSave": true, + "canEdit": true, + "canAdmin": true, + "createdBy": "admin", + "created": "2018-01-31T17:43:12+01:00", + "updatedBy": "admin", + "updated": "2018-01-31T17:43:12+01:00", + "version": 1 +} +` + updatedFolderJSON = ` +{ + "id":1, + "uid": "nErXDvCkzz", + "title": "Departmenet DEF", + "url": "/dashboards/f/nErXDvCkzz/department-def", + "hasAcl": false, + "canSave": true, + "canEdit": true, + "canAdmin": true, + "createdBy": "admin", + "created": "2018-01-31T17:43:12+01:00", + "updatedBy": "admin", + "updated": "2018-01-31T17:43:12+01:00", + "version": 1 +} +` + deletedFolderJSON = ` +{ + "message":"Folder deleted" +} +` +) + +func TestFolders(t *testing.T) { + server, client := gapiTestTools(200, getFoldersJSON) + defer server.Close() + + folders, err := client.Folders() + if err != nil { + t.Error(err) + } + + t.Log(pretty.PrettyFormat(folders)) + + if len(folders) != 1 { + t.Error("Length of returned folders should be 1") + } + if folders[0].Id != 1 || folders[0].Title != "Departmenet ABC" { + t.Error("Not correctly parsing returned folders.") + } +} + +func TestFolder(t *testing.T) { + server, client := gapiTestTools(200, getFolderJSON) + defer server.Close() + + folder := int64(1) + resp, err := client.Folder(folder) + if err != nil { + t.Error(err) + } + + t.Log(pretty.PrettyFormat(resp)) + + if resp.Id != folder || resp.Title != "Departmenet ABC" { + t.Error("Not correctly parsing returned folder.") + } +} + +func TestNewFolder(t *testing.T) { + server, client := gapiTestTools(200, createdFolderJSON) + defer server.Close() + + resp, err := client.NewFolder("test-folder") + if err != nil { + t.Error(err) + } + + t.Log(pretty.PrettyFormat(resp)) + + if resp.Uid != "nErXDvCkzz" { + t.Error("Not correctly parsing returned creation message.") + } +} + +func TestUpdateFolder(t *testing.T) { + server, client := gapiTestTools(200, updatedFolderJSON) + defer server.Close() + + err := client.UpdateFolder("nErXDvCkzz", "test-folder") + if err != nil { + t.Error(err) + } +} + +func TestDeleteFolder(t *testing.T) { + server, client := gapiTestTools(200, deletedFolderJSON) + defer server.Close() + + err := client.DeleteFolder("nErXDvCkzz") + if err != nil { + t.Error(err) + } +}