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

Commit c95b50a

Browse files
authored
Merge pull request #36 from ko-da-k/feature/impl-folder-permission
2 parents 93916ae + 8807066 commit c95b50a

File tree

2 files changed

+222
-0
lines changed

2 files changed

+222
-0
lines changed

folder_permissions.go

+88
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package gapi
2+
3+
import (
4+
"bytes"
5+
"encoding/json"
6+
"fmt"
7+
"io/ioutil"
8+
)
9+
10+
// FolderPermission has information such as a folder, user, team, role and permission.
11+
type FolderPermission struct {
12+
Id int64 `json:"id"`
13+
FolderUid string `json:"uid"`
14+
UserId int64 `json:"userId"`
15+
TeamId int64 `json:"teamId"`
16+
Role string `json:"role"`
17+
IsFolder bool `json:"isFolder"`
18+
19+
// Permission levels are
20+
// 1 = View
21+
// 2 = Edit
22+
// 4 = Admin
23+
Permission int64 `json:"permission"`
24+
PermissionName string `json:"permissionName"`
25+
26+
// optional fields
27+
FolderId int64 `json:"folderId,omitempty"`
28+
DashboardId int64 `json:"dashboardId,omitempty"`
29+
}
30+
31+
type PermissionItems struct {
32+
Items []*PermissionItem `json:"items"`
33+
}
34+
35+
type PermissionItem struct {
36+
// As you can see the docs, each item has a pair of [Role|TeamId|UserId] and Permission.
37+
// unnecessary fields are omitted.
38+
Role string `json:"role,omitempty"`
39+
TeamId int64 `json:"teamId,omitempty"`
40+
UserId int64 `json:"userId,omitempty"`
41+
Permission int64 `json:"permission"`
42+
}
43+
44+
func (c *Client) FolderPermissions(fid string) ([]*FolderPermission, error) {
45+
permissions := make([]*FolderPermission, 0)
46+
47+
req, err := c.newRequest("GET", fmt.Sprintf("/api/folders/%s/permissions", fid), nil, nil)
48+
if err != nil {
49+
return permissions, err
50+
}
51+
resp, err := c.Do(req)
52+
if err != nil {
53+
return permissions, err
54+
}
55+
if resp.StatusCode != 200 {
56+
return permissions, fmt.Errorf(resp.Status)
57+
}
58+
data, err := ioutil.ReadAll(resp.Body)
59+
if err != nil {
60+
return permissions, err
61+
}
62+
if err := json.Unmarshal(data, &permissions); err != nil {
63+
return permissions, err
64+
}
65+
return permissions, nil
66+
}
67+
68+
// UpdateFolderPermissions remove existing permissions if items are not included in the request.
69+
func (c *Client) UpdateFolderPermissions(fid string, items *PermissionItems) error {
70+
path := fmt.Sprintf("/api/folders/%s/permissions", fid)
71+
data, err := json.Marshal(items)
72+
if err != nil {
73+
return err
74+
}
75+
req, err := c.newRequest("POST", path, nil, bytes.NewBuffer(data))
76+
if err != nil {
77+
return err
78+
}
79+
80+
resp, err := c.Do(req)
81+
if err != nil {
82+
return err
83+
}
84+
if resp.StatusCode != 200 {
85+
return fmt.Errorf(resp.Status)
86+
}
87+
return nil
88+
}

folder_permissions_test.go

+134
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
package gapi
2+
3+
import (
4+
"github.com/gobs/pretty"
5+
"testing"
6+
)
7+
8+
const (
9+
getFolderPermissionsJSON = `
10+
[
11+
{
12+
"id": 1,
13+
"folderId": -1,
14+
"created": "2017-06-20T02:00:00+02:00",
15+
"updated": "2017-06-20T02:00:00+02:00",
16+
"userId": 0,
17+
"userLogin": "",
18+
"userEmail": "",
19+
"teamId": 0,
20+
"team": "",
21+
"role": "Viewer",
22+
"permission": 1,
23+
"permissionName": "View",
24+
"uid": "nErXDvCkzz",
25+
"title": "",
26+
"slug": "",
27+
"isFolder": false,
28+
"url": ""
29+
},
30+
{
31+
"id": 2,
32+
"dashboardId": -1,
33+
"created": "2017-06-20T02:00:00+02:00",
34+
"updated": "2017-06-20T02:00:00+02:00",
35+
"userId": 0,
36+
"userLogin": "",
37+
"userEmail": "",
38+
"teamId": 0,
39+
"team": "",
40+
"role": "Editor",
41+
"permission": 2,
42+
"permissionName": "Edit",
43+
"uid": "",
44+
"title": "",
45+
"slug": "",
46+
"isFolder": false,
47+
"url": ""
48+
}
49+
]
50+
`
51+
updateFolderPermissionsJSON = `
52+
{
53+
"message": "Folder permissions updated"
54+
}
55+
`
56+
)
57+
58+
func TestFolderPermissions(t *testing.T) {
59+
server, client := gapiTestTools(200, getFolderPermissionsJSON)
60+
defer server.Close()
61+
62+
fid := "nErXDvCkzz"
63+
resp, err := client.FolderPermissions(fid)
64+
if err != nil {
65+
t.Error(err)
66+
}
67+
68+
t.Log(pretty.PrettyFormat(resp))
69+
70+
expects := []*FolderPermission{
71+
{
72+
Id: 1,
73+
FolderUid: "nErXDvCkzz",
74+
UserId: 0,
75+
TeamId: 0,
76+
Role: "Viewer",
77+
IsFolder: false,
78+
Permission: 1,
79+
PermissionName: "View",
80+
FolderId: -1,
81+
DashboardId: 0,
82+
},
83+
{
84+
Id: 2,
85+
FolderUid: "",
86+
UserId: 0,
87+
TeamId: 0,
88+
Role: "Editor",
89+
IsFolder: false,
90+
Permission: 2,
91+
PermissionName: "Edit",
92+
FolderId: 0,
93+
DashboardId: -1,
94+
},
95+
}
96+
97+
for i, expect := range expects {
98+
t.Run("check data", func(t *testing.T) {
99+
if resp[i].Id != expect.Id || resp[i].Role != expect.Role {
100+
t.Error("Not correctly data")
101+
}
102+
})
103+
}
104+
}
105+
106+
func TestUpdateFolderPermissions(t *testing.T) {
107+
server, client := gapiTestTools(200, updateFolderPermissionsJSON)
108+
defer server.Close()
109+
110+
items := &PermissionItems{
111+
Items: []*PermissionItem{
112+
{
113+
Role: "viewer",
114+
Permission: 1,
115+
},
116+
{
117+
Role: "Editor",
118+
Permission: 2,
119+
},
120+
{
121+
TeamId: 1,
122+
Permission: 1,
123+
},
124+
{
125+
UserId: 11,
126+
Permission: 4,
127+
},
128+
},
129+
}
130+
err := client.UpdateFolderPermissions("nErXDvCkzz", items)
131+
if err != nil {
132+
t.Error(err)
133+
}
134+
}

0 commit comments

Comments
 (0)