Skip to content

Commit 6a22dde

Browse files
zibuyu28Hengfang Wang
andauthored
Add Folder API support (#74)
* Add Folder API support * update as suggested * update as suggested Co-authored-by: Hengfang Wang <[email protected]>
1 parent 81c32c2 commit 6a22dde

File tree

3 files changed

+290
-0
lines changed

3 files changed

+290
-0
lines changed

folder.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package sdk
2+
3+
/*
4+
Copyright 2016 Alexander I.Grafov <[email protected]>
5+
Copyright 2016-2019 The Grafana SDK authors
6+
7+
Licensed under the Apache License, Version 2.0 (the "License");
8+
you may not use this file except in compliance with the License.
9+
You may obtain a copy of the License at
10+
11+
http://www.apache.org/licenses/LICENSE-2.0
12+
13+
Unless required by applicable law or agreed to in writing, software
14+
distributed under the License is distributed on an "AS IS" BASIS,
15+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16+
See the License for the specific language governing permissions and
17+
limitations under the License.
18+
19+
ॐ तारे तुत्तारे तुरे स्व
20+
*/
21+
22+
// Folder as described in the doc
23+
// https://grafana.com/docs/grafana/latest/http_api/folder/#get-all-folders
24+
type Folder struct {
25+
ID int `json:"id"`
26+
UID string `json:"uid"`
27+
Title string `json:"title"`
28+
URL string `json:"url"`
29+
HasAcl bool `json:"has_acl"`
30+
CanSave bool `json:"can_save"`
31+
CanEdit bool `json:"can_edit"`
32+
CanAdmin bool `json:"can_admin"`
33+
CreatedBy string `json:"created_by"`
34+
Created string `json:"created"`
35+
UpdatedBy string `json:"updated_by"`
36+
Updated string `json:"updated"`
37+
Version int `json:"version"`
38+
Overwrite bool `json:"overwrite"`
39+
}

rest-folder.go

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
package sdk
2+
3+
/*
4+
Copyright 2016 Alexander I.Grafov <[email protected]>
5+
Copyright 2016-2019 The Grafana SDK authors
6+
7+
Licensed under the Apache License, Version 2.0 (the "License");
8+
you may not use this file except in compliance with the License.
9+
You may obtain a copy of the License at
10+
11+
http://www.apache.org/licenses/LICENSE-2.0
12+
13+
Unless required by applicable law or agreed to in writing, software
14+
distributed under the License is distributed on an "AS IS" BASIS,
15+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16+
See the License for the specific language governing permissions and
17+
limitations under the License.
18+
19+
ॐ तारे तुत्तारे तुरे स्व
20+
*/
21+
22+
import (
23+
"encoding/json"
24+
"fmt"
25+
"net/url"
26+
"strconv"
27+
)
28+
29+
// https://grafana.com/docs/grafana/latest/http_api/folder/
30+
31+
// GetAllFolders gets all folders.
32+
// Reflects GET /api/folders API call.
33+
func (r *Client) GetAllFolders(params ...GetFolderParams) ([]Folder, error) {
34+
var (
35+
raw []byte
36+
fs []Folder
37+
code int
38+
err error
39+
requestParams = make(url.Values)
40+
)
41+
for _, p := range params {
42+
p(requestParams)
43+
}
44+
if raw, code, err = r.get("api/folders", requestParams); err != nil {
45+
return nil, err
46+
}
47+
if code != 200 {
48+
return nil, fmt.Errorf("HTTP error %d: returns %s", code, raw)
49+
}
50+
err = json.Unmarshal(raw, &fs)
51+
return fs, err
52+
}
53+
54+
// GetFolderByUID gets folder by uid.
55+
// Reflects GET /api/folders/:uid API call.
56+
func (r *Client) GetFolderByUID(UID string) (Folder, error) {
57+
var (
58+
raw []byte
59+
f Folder
60+
code int
61+
err error
62+
)
63+
if raw, code, err = r.get(fmt.Sprintf("api/folders/%s", UID), nil); err != nil {
64+
return f, err
65+
}
66+
if code != 200 {
67+
return f, fmt.Errorf("HTTP error %d: returns %s", code, raw)
68+
}
69+
err = json.Unmarshal(raw, &f)
70+
return f, err
71+
}
72+
73+
// CreateFolder create folders.
74+
// Reflects POST /api/folders API call.
75+
func (r *Client) CreateFolder(f Folder) (Folder, error) {
76+
var (
77+
raw []byte
78+
rf Folder
79+
code int
80+
err error
81+
)
82+
rf = Folder{}
83+
if raw, err = json.Marshal(f); err != nil {
84+
return rf, err
85+
}
86+
if raw, code, err = r.post("api/folders", nil, raw); err != nil {
87+
return rf, err
88+
}
89+
if code != 200 {
90+
return rf, fmt.Errorf("HTTP error %d: returns %s", code, raw)
91+
}
92+
err = json.Unmarshal(raw, &rf)
93+
return rf, err
94+
}
95+
96+
// UpdateFolderByUID update folder by uid
97+
// Reflects PUT /api/folders/:uid API call.
98+
func (r *Client) UpdateFolderByUID(f Folder) (Folder, error) {
99+
var (
100+
raw []byte
101+
rf Folder
102+
code int
103+
err error
104+
)
105+
rf = Folder{}
106+
if raw, err = json.Marshal(f); err != nil {
107+
return rf, err
108+
}
109+
if raw, code, err = r.put(fmt.Sprintf("api/folders/%s", f.UID), nil, raw); err != nil {
110+
return rf, err
111+
}
112+
if code != 200 {
113+
return f, fmt.Errorf("HTTP error %d: returns %s", code, raw)
114+
}
115+
err = json.Unmarshal(raw, &rf)
116+
return rf, err
117+
}
118+
119+
// DeleteFolderByUID deletes an existing folder by uid.
120+
// Reflects DELETE /api/folders/:uid API call.
121+
func (r *Client) DeleteFolderByUID(UID string) (bool, error) {
122+
var (
123+
raw []byte
124+
code int
125+
err error
126+
)
127+
if raw, code, err = r.delete(fmt.Sprintf("api/folders/%s", UID)); err != nil {
128+
return false, err
129+
}
130+
if code != 200 {
131+
return false, fmt.Errorf("HTTP error %d: returns %s", code, raw)
132+
}
133+
return true, err
134+
}
135+
136+
// GetFolderByID gets folder by id.
137+
// Reflects GET /api/folders/id/:id API call.
138+
func (r *Client) GetFolderByID(ID int) (Folder, error) {
139+
var (
140+
raw []byte
141+
f Folder
142+
code int
143+
err error
144+
)
145+
if ID <= 0 {
146+
return f, fmt.Errorf("ID cannot be less than zero")
147+
}
148+
if raw, code, err = r.get(fmt.Sprintf("api/folders/id/%d", ID), nil); err != nil {
149+
return f, err
150+
}
151+
if code != 200 {
152+
return f, fmt.Errorf("HTTP error %d: returns %s", code, raw)
153+
}
154+
err = json.Unmarshal(raw, &f)
155+
return f, err
156+
}
157+
158+
// GetFolderParams is the type for all options implementing query parameters
159+
type GetFolderParams func(values url.Values)
160+
161+
// Limit sets the max number of folders to return
162+
func Limit(limit uint) GetFolderParams {
163+
return func(v url.Values) {
164+
v.Set("limit", strconv.FormatUint(uint64(limit), 10))
165+
}
166+
}

rest-folder_integration_test.go

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package sdk_test
2+
3+
import (
4+
"github.com/grafana-tools/sdk"
5+
"testing"
6+
)
7+
8+
func Test_Folder_CRUD(t *testing.T) {
9+
shouldSkip(t)
10+
11+
client := getClient(t)
12+
13+
var f1 = sdk.Folder{
14+
Title: "test-folder-1",
15+
}
16+
var err error
17+
18+
fReceived1, err := client.CreateFolder(f1)
19+
if err != nil {
20+
t.Fatal(err)
21+
}
22+
if fReceived1.Title != f1.Title {
23+
t.Fatalf("got wrong title: expected %s, was %s", f1.Title, fReceived1.Title)
24+
}
25+
26+
var f2 = sdk.Folder{
27+
Title: "test-folder-2",
28+
}
29+
30+
fReceived2, err := client.CreateFolder(f2)
31+
if err != nil {
32+
t.Fatal(err)
33+
}
34+
if fReceived2.Title != f2.Title {
35+
t.Fatalf("got wrong title: expected %s, was %s", f2.Title, fReceived2.Title)
36+
}
37+
38+
fs, err := client.GetAllFolders(sdk.Limit(1))
39+
if err != nil {
40+
t.Fatal(err)
41+
}
42+
if len(fs) != 1 {
43+
t.Fatalf("expected to get one folders, got %d", len(fs))
44+
}
45+
46+
fg, err := client.GetFolderByUID(fReceived1.UID)
47+
if err != nil {
48+
t.Fatal(err)
49+
}
50+
if fReceived1.Title != fg.Title {
51+
t.Fatalf("got wrong title: expected %s, was %s", fReceived1.Title, fg.Title)
52+
}
53+
54+
fg, err = client.GetFolderByID(fReceived1.ID)
55+
if err != nil {
56+
t.Fatal(err)
57+
}
58+
if fReceived1.Title != fg.Title {
59+
t.Fatalf("got wrong title: expected %s, was %s", fReceived1.Title, fg.Title)
60+
}
61+
62+
fReceived1.Title = "test-update-folder"
63+
fg, err = client.UpdateFolderByUID(fReceived1)
64+
if err != nil {
65+
t.Fatal(err)
66+
}
67+
if fReceived1.Title != fg.Title {
68+
t.Fatalf("got wrong title: expected %s, was %s", fReceived1.Title, fg.Title)
69+
}
70+
71+
r, err := client.DeleteFolderByUID(fReceived1.UID)
72+
if err != nil {
73+
t.Fatal(err)
74+
}
75+
if !r {
76+
t.Fatal("delete failed")
77+
}
78+
r, err = client.DeleteFolderByUID(fReceived2.UID)
79+
if err != nil {
80+
t.Fatal(err)
81+
}
82+
if !r {
83+
t.Fatal("delete failed")
84+
}
85+
}

0 commit comments

Comments
 (0)