Skip to content
This repository was archived by the owner on Mar 17, 2021. It is now read-only.

Commit 9cc848d

Browse files
authored
Merge pull request #12 from goraxe/master
Add support for folders api
2 parents bc20f1a + cebdee9 commit 9cc848d

File tree

5 files changed

+325
-4
lines changed

5 files changed

+325
-4
lines changed

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,6 @@ _testmain.go
2222
*.exe
2323
*.test
2424
*.prof
25+
26+
# vim swap files
27+
.*.sw?

client.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,9 @@ func (c *Client) newRequest(method, requestPath string, query url.Values, body i
5353

5454
if os.Getenv("GF_LOG") != "" {
5555
if body == nil {
56-
log.Println("request to ", url.String(), "with no body data")
56+
log.Printf("request (%s) to %s with no body data", method, url.String())
5757
} else {
58-
log.Println("request to ", url.String(), "with body data", body.(*bytes.Buffer).String())
58+
log.Printf("request (%s) to %s with body data: %s", method, url.String(), body.(*bytes.Buffer).String())
5959
}
6060
}
6161

dashboard.go

+43-2
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,32 @@ import (
66
"errors"
77
"fmt"
88
"io/ioutil"
9+
"log"
10+
"os"
911
)
1012

1113
type DashboardMeta struct {
1214
IsStarred bool `json:"isStarred"`
1315
Slug string `json:"slug"`
16+
Folder int64 `json:"folderId"`
1417
}
1518

1619
type DashboardSaveResponse struct {
1720
Slug string `json:"slug"`
21+
Id int64 `json:"id"`
22+
Uid string `json:"uid"`
1823
Status string `json:"status"`
1924
Version int64 `json:"version"`
2025
}
2126

2227
type Dashboard struct {
23-
Meta DashboardMeta `json:"meta"`
24-
Model map[string]interface{} `json:"dashboard"`
28+
Meta DashboardMeta `json:"meta"`
29+
Model map[string]interface{} `json:"dashboard"`
30+
Folder int64 `json:"folderId"`
31+
Overwrite bool `json:overwrite`
2532
}
2633

34+
// Deprecated: use NewDashboard instead
2735
func (c *Client) SaveDashboard(model map[string]interface{}, overwrite bool) (*DashboardSaveResponse, error) {
2836
wrapper := map[string]interface{}{
2937
"dashboard": model,
@@ -38,6 +46,35 @@ func (c *Client) SaveDashboard(model map[string]interface{}, overwrite bool) (*D
3846
return nil, err
3947
}
4048

49+
resp, err := c.Do(req)
50+
if err != nil {
51+
return nil, err
52+
}
53+
if resp.StatusCode != 200 {
54+
data, _ = ioutil.ReadAll(resp.Body)
55+
return nil, fmt.Errorf("status: %d, body: %s", resp.StatusCode, data)
56+
}
57+
58+
data, err = ioutil.ReadAll(resp.Body)
59+
if err != nil {
60+
return nil, err
61+
}
62+
63+
result := &DashboardSaveResponse{}
64+
err = json.Unmarshal(data, &result)
65+
return result, err
66+
}
67+
68+
func (c *Client) NewDashboard(dashboard Dashboard) (*DashboardSaveResponse, error) {
69+
data, err := json.Marshal(dashboard)
70+
if err != nil {
71+
return nil, err
72+
}
73+
req, err := c.newRequest("POST", "/api/dashboards/db", nil, bytes.NewBuffer(data))
74+
if err != nil {
75+
return nil, err
76+
}
77+
4178
resp, err := c.Do(req)
4279
if err != nil {
4380
return nil, err
@@ -78,6 +115,10 @@ func (c *Client) Dashboard(slug string) (*Dashboard, error) {
78115

79116
result := &Dashboard{}
80117
err = json.Unmarshal(data, &result)
118+
result.Folder = result.Meta.Folder
119+
if os.Getenv("GF_LOG") != "" {
120+
log.Printf("got back dashboard response %s", data)
121+
}
81122
return result, err
82123
}
83124

folder.go

+121
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
package gapi
2+
3+
import (
4+
"bytes"
5+
"encoding/json"
6+
"errors"
7+
"fmt"
8+
"io/ioutil"
9+
)
10+
11+
type Folder struct {
12+
Id int64 `json:"id"`
13+
Uid string `json:"uid"`
14+
Title string `json:"title"`
15+
}
16+
17+
func (c *Client) Folders() ([]Folder, error) {
18+
folders := make([]Folder, 0)
19+
20+
req, err := c.newRequest("GET", "/api/folders/", nil, nil)
21+
if err != nil {
22+
return folders, err
23+
}
24+
resp, err := c.Do(req)
25+
if err != nil {
26+
return folders, err
27+
}
28+
if resp.StatusCode != 200 {
29+
return folders, errors.New(resp.Status)
30+
}
31+
data, err := ioutil.ReadAll(resp.Body)
32+
if err != nil {
33+
return folders, err
34+
}
35+
err = json.Unmarshal(data, &folders)
36+
return folders, err
37+
}
38+
39+
func (c *Client) Folder(id int64) (*Folder, error) {
40+
folder := &Folder{}
41+
req, err := c.newRequest("GET", fmt.Sprintf("/api/folders/id/%d", id), nil, nil)
42+
if err != nil {
43+
return folder, err
44+
}
45+
resp, err := c.Do(req)
46+
if err != nil {
47+
return folder, err
48+
}
49+
if resp.StatusCode != 200 {
50+
return folder, errors.New(resp.Status)
51+
}
52+
data, err := ioutil.ReadAll(resp.Body)
53+
if err != nil {
54+
return folder, err
55+
}
56+
err = json.Unmarshal(data, &folder)
57+
return folder, err
58+
}
59+
60+
func (c *Client) NewFolder(title string) (Folder, error) {
61+
folder := Folder{}
62+
dataMap := map[string]string{
63+
"title": title,
64+
}
65+
data, err := json.Marshal(dataMap)
66+
req, err := c.newRequest("POST", "/api/folders", nil, bytes.NewBuffer(data))
67+
if err != nil {
68+
return folder, err
69+
}
70+
resp, err := c.Do(req)
71+
if err != nil {
72+
return folder, err
73+
}
74+
if resp.StatusCode != 200 {
75+
data, _ = ioutil.ReadAll(resp.Body)
76+
return folder, fmt.Errorf("status: %s body: %s", resp.Status, data)
77+
}
78+
data, err = ioutil.ReadAll(resp.Body)
79+
if err != nil {
80+
return folder, err
81+
}
82+
err = json.Unmarshal(data, &folder)
83+
if err != nil {
84+
return folder, err
85+
}
86+
return folder, err
87+
}
88+
89+
func (c *Client) UpdateFolder(id string, name string) error {
90+
dataMap := map[string]string{
91+
"name": name,
92+
}
93+
data, err := json.Marshal(dataMap)
94+
req, err := c.newRequest("PUT", fmt.Sprintf("/api/folders/%s", id), nil, bytes.NewBuffer(data))
95+
if err != nil {
96+
return err
97+
}
98+
resp, err := c.Do(req)
99+
if err != nil {
100+
return err
101+
}
102+
if resp.StatusCode != 200 {
103+
return errors.New(resp.Status)
104+
}
105+
return err
106+
}
107+
108+
func (c *Client) DeleteFolder(id string) error {
109+
req, err := c.newRequest("DELETE", fmt.Sprintf("/api/folders/%s", id), nil, nil)
110+
if err != nil {
111+
return err
112+
}
113+
resp, err := c.Do(req)
114+
if err != nil {
115+
return err
116+
}
117+
if resp.StatusCode != 200 {
118+
return errors.New(resp.Status)
119+
}
120+
return err
121+
}

folder_test.go

+156
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
package gapi
2+
3+
import (
4+
"github.com/gobs/pretty"
5+
"testing"
6+
)
7+
8+
const (
9+
getFoldersJSON = `
10+
[
11+
{
12+
"id":1,
13+
"uid": "nErXDvCkzz",
14+
"title": "Departmenet ABC",
15+
"url": "/dashboards/f/nErXDvCkzz/department-abc",
16+
"hasAcl": false,
17+
"canSave": true,
18+
"canEdit": true,
19+
"canAdmin": true,
20+
"createdBy": "admin",
21+
"created": "2018-01-31T17:43:12+01:00",
22+
"updatedBy": "admin",
23+
"updated": "2018-01-31T17:43:12+01:00",
24+
"version": 1
25+
}
26+
]
27+
`
28+
getFolderJSON = `
29+
{
30+
"id":1,
31+
"uid": "nErXDvCkzz",
32+
"title": "Departmenet ABC",
33+
"url": "/dashboards/f/nErXDvCkzz/department-abc",
34+
"hasAcl": false,
35+
"canSave": true,
36+
"canEdit": true,
37+
"canAdmin": true,
38+
"createdBy": "admin",
39+
"created": "2018-01-31T17:43:12+01:00",
40+
"updatedBy": "admin",
41+
"updated": "2018-01-31T17:43:12+01:00",
42+
"version": 1
43+
}
44+
`
45+
createdFolderJSON = `
46+
{
47+
"id":1,
48+
"uid": "nErXDvCkzz",
49+
"title": "Departmenet ABC",
50+
"url": "/dashboards/f/nErXDvCkzz/department-abc",
51+
"hasAcl": false,
52+
"canSave": true,
53+
"canEdit": true,
54+
"canAdmin": true,
55+
"createdBy": "admin",
56+
"created": "2018-01-31T17:43:12+01:00",
57+
"updatedBy": "admin",
58+
"updated": "2018-01-31T17:43:12+01:00",
59+
"version": 1
60+
}
61+
`
62+
updatedFolderJSON = `
63+
{
64+
"id":1,
65+
"uid": "nErXDvCkzz",
66+
"title": "Departmenet DEF",
67+
"url": "/dashboards/f/nErXDvCkzz/department-def",
68+
"hasAcl": false,
69+
"canSave": true,
70+
"canEdit": true,
71+
"canAdmin": true,
72+
"createdBy": "admin",
73+
"created": "2018-01-31T17:43:12+01:00",
74+
"updatedBy": "admin",
75+
"updated": "2018-01-31T17:43:12+01:00",
76+
"version": 1
77+
}
78+
`
79+
deletedFolderJSON = `
80+
{
81+
"message":"Folder deleted"
82+
}
83+
`
84+
)
85+
86+
func TestFolders(t *testing.T) {
87+
server, client := gapiTestTools(200, getFoldersJSON)
88+
defer server.Close()
89+
90+
folders, err := client.Folders()
91+
if err != nil {
92+
t.Error(err)
93+
}
94+
95+
t.Log(pretty.PrettyFormat(folders))
96+
97+
if len(folders) != 1 {
98+
t.Error("Length of returned folders should be 1")
99+
}
100+
if folders[0].Id != 1 || folders[0].Title != "Departmenet ABC" {
101+
t.Error("Not correctly parsing returned folders.")
102+
}
103+
}
104+
105+
func TestFolder(t *testing.T) {
106+
server, client := gapiTestTools(200, getFolderJSON)
107+
defer server.Close()
108+
109+
folder := int64(1)
110+
resp, err := client.Folder(folder)
111+
if err != nil {
112+
t.Error(err)
113+
}
114+
115+
t.Log(pretty.PrettyFormat(resp))
116+
117+
if resp.Id != folder || resp.Title != "Departmenet ABC" {
118+
t.Error("Not correctly parsing returned folder.")
119+
}
120+
}
121+
122+
func TestNewFolder(t *testing.T) {
123+
server, client := gapiTestTools(200, createdFolderJSON)
124+
defer server.Close()
125+
126+
resp, err := client.NewFolder("test-folder")
127+
if err != nil {
128+
t.Error(err)
129+
}
130+
131+
t.Log(pretty.PrettyFormat(resp))
132+
133+
if resp.Uid != "nErXDvCkzz" {
134+
t.Error("Not correctly parsing returned creation message.")
135+
}
136+
}
137+
138+
func TestUpdateFolder(t *testing.T) {
139+
server, client := gapiTestTools(200, updatedFolderJSON)
140+
defer server.Close()
141+
142+
err := client.UpdateFolder("nErXDvCkzz", "test-folder")
143+
if err != nil {
144+
t.Error(err)
145+
}
146+
}
147+
148+
func TestDeleteFolder(t *testing.T) {
149+
server, client := gapiTestTools(200, deletedFolderJSON)
150+
defer server.Close()
151+
152+
err := client.DeleteFolder("nErXDvCkzz")
153+
if err != nil {
154+
t.Error(err)
155+
}
156+
}

0 commit comments

Comments
 (0)