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

Implementation of Folder Permissions API #36

Merged
merged 5 commits into from
Jun 3, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 88 additions & 0 deletions folder_permissions.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package gapi

import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
)

// FolderPermission has information such as a folder, user, team, role and permission.
type FolderPermission struct {
Id int64 `json:"id"`
FolderUid string `json:"uid"`
UserId int64 `json:"userId"`
TeamId int64 `json:"teamId"`
Role string `json:"role"`
IsFolder bool `json:"isFolder"`

// Permission levels are
// 1 = View
// 2 = Edit
// 4 = Admin
Permission int64 `json:"permission"`
PermissionName string `json:"permissionName"`

// optional fields
FolderId int64 `json:"folderId,omitempty"`
DashboardId int64 `json:"dashboardId,omitempty"`
}

type PermissionItems struct {
Items []*PermissionItem `json:"items"`
}

type PermissionItem struct {
// As you can see the docs, each item has a pair of [Role|TeamId|UserId] and Permission.
// unnecessary fields are omitted.
Role string `json:"role,omitempty"`
TeamId int64 `json:"teamId,omitempty"`
UserId int64 `json:"userId,omitempty"`
Permission int64 `json:"permission"`
}

func (c *Client) FolderPermissions(fid string) ([]*FolderPermission, error) {
permissions := make([]*FolderPermission, 0)

req, err := c.newRequest("GET", fmt.Sprintf("/api/folders/%s/permissions", fid), nil, nil)
if err != nil {
return permissions, err
}
resp, err := c.Do(req)
if err != nil {
return permissions, err
}
if resp.StatusCode != 200 {
return permissions, fmt.Errorf(resp.Status)
}
data, err := ioutil.ReadAll(resp.Body)
if err != nil {
return permissions, err
}
if err := json.Unmarshal(data, &permissions); err != nil {
return permissions, err
}
return permissions, nil
}

// UpdateFolderPermissions remove existing permissions if items are not included in the request.
func (c *Client) UpdateFolderPermissions(fid string, items *PermissionItems) error {
path := fmt.Sprintf("/api/folders/%s/permissions", fid)
data, err := json.Marshal(items)
if err != nil {
return err
}
req, err := c.newRequest("POST", path, nil, bytes.NewBuffer(data))
if err != nil {
return err
}

resp, err := c.Do(req)
if err != nil {
return err
}
if resp.StatusCode != 200 {
return fmt.Errorf(resp.Status)
}
return nil
}
134 changes: 134 additions & 0 deletions folder_permissions_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
package gapi

import (
"github.com/gobs/pretty"
"testing"
)

const (
getFolderPermissionsJSON = `
[
{
"id": 1,
"folderId": -1,
"created": "2017-06-20T02:00:00+02:00",
"updated": "2017-06-20T02:00:00+02:00",
"userId": 0,
"userLogin": "",
"userEmail": "",
"teamId": 0,
"team": "",
"role": "Viewer",
"permission": 1,
"permissionName": "View",
"uid": "nErXDvCkzz",
"title": "",
"slug": "",
"isFolder": false,
"url": ""
},
{
"id": 2,
"dashboardId": -1,
"created": "2017-06-20T02:00:00+02:00",
"updated": "2017-06-20T02:00:00+02:00",
"userId": 0,
"userLogin": "",
"userEmail": "",
"teamId": 0,
"team": "",
"role": "Editor",
"permission": 2,
"permissionName": "Edit",
"uid": "",
"title": "",
"slug": "",
"isFolder": false,
"url": ""
}
]
`
updateFolderPermissionsJSON = `
{
"message": "Folder permissions updated"
}
`
)

func TestFolderPermissions(t *testing.T) {
server, client := gapiTestTools(200, getFolderPermissionsJSON)
defer server.Close()

fid := "nErXDvCkzz"
resp, err := client.FolderPermissions(fid)
if err != nil {
t.Error(err)
}

t.Log(pretty.PrettyFormat(resp))

expects := []*FolderPermission{
{
Id: 1,
FolderUid: "nErXDvCkzz",
UserId: 0,
TeamId: 0,
Role: "Viewer",
IsFolder: false,
Permission: 1,
PermissionName: "View",
FolderId: -1,
DashboardId: 0,
},
{
Id: 2,
FolderUid: "",
UserId: 0,
TeamId: 0,
Role: "Editor",
IsFolder: false,
Permission: 2,
PermissionName: "Edit",
FolderId: 0,
DashboardId: -1,
},
}

for i, expect := range expects {
t.Run("check data", func(t *testing.T) {
if resp[i].Id != expect.Id || resp[i].Role != expect.Role {
t.Error("Not correctly data")
}
})
}
}

func TestUpdateFolderPermissions(t *testing.T) {
server, client := gapiTestTools(200, updateFolderPermissionsJSON)
defer server.Close()

items := &PermissionItems{
Items: []*PermissionItem{
{
Role: "viewer",
Permission: 1,
},
{
Role: "Editor",
Permission: 2,
},
{
TeamId: 1,
Permission: 1,
},
{
UserId: 11,
Permission: 4,
},
},
}
err := client.UpdateFolderPermissions("nErXDvCkzz", items)
if err != nil {
t.Error(err)
}
}