From 4a457c4137b4be9191b8d02aedecc1aaf9b95a68 Mon Sep 17 00:00:00 2001 From: Luke Cyca Date: Thu, 16 Jan 2020 12:08:55 -0800 Subject: [PATCH 1/4] Add endpoints for switch current org, change org preferences --- orgs.go | 22 ++++++++++++++++++++++ user.go | 18 ++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/orgs.go b/orgs.go index 2ef4e2d..0bf9496 100644 --- a/orgs.go +++ b/orgs.go @@ -142,3 +142,25 @@ func (c *Client) DeleteOrg(id int64) error { } return err } + +// UpdateCurrentOrgPreferences changes the preferences of the currently-selected organization +// https://grafana.com/docs/grafana/latest/http_api/preferences/#update-current-org-prefs +func (c *Client) UpdateCurrentOrgPreferences(prefs map[string]interface{}) error { + payload, err := json.Marshal(prefs) + if err != nil { + return err + } + + req, err := c.newRequest("PUT", "/api/org/preferences", nil, bytes.NewBuffer(payload)) + if err != nil { + return err + } + + response, err := c.Do(req) + if err != nil { + return err + } else if response.StatusCode != 200 { + return errors.New(response.Status) + } + return nil +} diff --git a/user.go b/user.go index 66f5634..2ecf426 100644 --- a/user.go +++ b/user.go @@ -3,6 +3,7 @@ package gapi import ( "encoding/json" "errors" + "fmt" "io/ioutil" "net/url" ) @@ -74,3 +75,20 @@ func (c *Client) UserByEmail(email string) (User, error) { user = User(tmp) return user, err } + +// SwitchUserOrganization changes the user's currently-selected organization +// https://grafana.com/docs/grafana/latest/http_api/user/#switch-user-context-for-a-specified-user +func (c *Client) SwitchUserOrganization(userID, orgID int64) error { + req, err := c.newRequest("POST", fmt.Sprintf("/api/users/%d/using/%d", userID, orgID), nil, nil) + if err != nil { + return err + } + + response, err := c.Do(req) + if err != nil { + return err + } else if response.StatusCode != 200 { + return errors.New(response.Status) + } + return nil +} From 97e7fee00881505d1ebab2577b1eecb4da1f9328 Mon Sep 17 00:00:00 2001 From: Luke Cyca Date: Thu, 16 Jan 2020 13:23:00 -0800 Subject: [PATCH 2/4] Create endpoints for actual user, and actual user orgs --- user.go | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/user.go b/user.go index 2ecf426..dbc285a 100644 --- a/user.go +++ b/user.go @@ -76,6 +76,65 @@ func (c *Client) UserByEmail(email string) (User, error) { return user, err } +// CurrentUser returns user info about the currently-logged-in user +// https://grafana.com/docs/grafana/latest/http_api/user/#actual-user +func (c *Client) CurrentUser() (User, error) { + user := User{} + req, err := c.newRequest("GET", "/api/user", nil, nil) + if err != nil { + return user, err + } + resp, err := c.Do(req) + if err != nil { + return user, err + } + if resp.StatusCode != 200 { + return user, errors.New(resp.Status) + } + data, err := ioutil.ReadAll(resp.Body) + if err != nil { + return user, err + } + tmp := struct { + Id int64 `json:"id,omitempty"` + Email string `json:"email,omitempty"` + Name string `json:"name,omitempty"` + Login string `json:"login,omitempty"` + Password string `json:"password,omitempty"` + IsAdmin bool `json:"isGrafanaAdmin,omitempty"` + }{} + err = json.Unmarshal(data, &tmp) + if err != nil { + return user, err + } + user = User(tmp) + return user, err +} + +// CurrentUserOrgs returns org membership for the currently-logged-in user +// https://grafana.com/docs/grafana/latest/http_api/user/#organizations-of-the-actual-user +func (c *Client) CurrentUserOrgs() ([]Org, error) { + orgs := make([]Org, 0) + + req, err := c.newRequest("GET", "/api/user/orgs/", nil, nil) + if err != nil { + return orgs, err + } + resp, err := c.Do(req) + if err != nil { + return orgs, err + } + if resp.StatusCode != 200 { + return orgs, errors.New(resp.Status) + } + data, err := ioutil.ReadAll(resp.Body) + if err != nil { + return orgs, err + } + err = json.Unmarshal(data, &orgs) + return orgs, err +} + // SwitchUserOrganization changes the user's currently-selected organization // https://grafana.com/docs/grafana/latest/http_api/user/#switch-user-context-for-a-specified-user func (c *Client) SwitchUserOrganization(userID, orgID int64) error { From af3616cc0626efa344eb955c9179a0444bafbcb8 Mon Sep 17 00:00:00 2001 From: Luke Cyca Date: Thu, 16 Jan 2020 13:37:27 -0800 Subject: [PATCH 3/4] Use OrgMembership struct so we can have access to the role --- user.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/user.go b/user.go index dbc285a..8188456 100644 --- a/user.go +++ b/user.go @@ -111,10 +111,16 @@ func (c *Client) CurrentUser() (User, error) { return user, err } +type OrgMembership struct { + Id int64 `json:"id"` + Name string `json:"name"` + Role string `json:"role"` +} + // CurrentUserOrgs returns org membership for the currently-logged-in user // https://grafana.com/docs/grafana/latest/http_api/user/#organizations-of-the-actual-user -func (c *Client) CurrentUserOrgs() ([]Org, error) { - orgs := make([]Org, 0) +func (c *Client) CurrentUserOrgs() ([]OrgMembership, error) { + orgs := make([]OrgMembership, 0) req, err := c.newRequest("GET", "/api/user/orgs/", nil, nil) if err != nil { From 2c324900401aaaf1318523c2d0715b140bfbf45e Mon Sep 17 00:00:00 2001 From: Luke Cyca Date: Wed, 25 Mar 2020 07:45:27 -0700 Subject: [PATCH 4/4] Fix key name for orgId --- user.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user.go b/user.go index 8188456..32c2e48 100644 --- a/user.go +++ b/user.go @@ -112,7 +112,7 @@ func (c *Client) CurrentUser() (User, error) { } type OrgMembership struct { - Id int64 `json:"id"` + Id int64 `json:"orgId"` Name string `json:"name"` Role string `json:"role"` }