Skip to content

Commit 62ad1b3

Browse files
Added team REST (#196)
* Added team REST * Fixed failing tests * Use new query parameter pattern and refactored GetTeamByName * Fixed failing integration tests * Dont return team as pointer for GetTeamByName * Update team.go Co-authored-by: Giedrius Statkevičius <[email protected]> * Added team not found error message * Update rest-team.go Co-authored-by: Giedrius Statkevičius <[email protected]>
1 parent 736d67d commit 62ad1b3

File tree

3 files changed

+509
-0
lines changed

3 files changed

+509
-0
lines changed

rest-team.go

Lines changed: 299 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,299 @@
1+
package sdk
2+
3+
/*
4+
Copyright 2016 Alexander I.Grafov <[email protected]>
5+
Copyright 2016-2022 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+
"bytes"
24+
"context"
25+
"encoding/json"
26+
"fmt"
27+
"net/url"
28+
"strconv"
29+
)
30+
31+
// SearchTeams search teams with optional parameters.
32+
// Reflects GET /api/teams/search API call.
33+
func (r *Client) SearchTeams(ctx context.Context, params ...SearchTeamParams) (PageTeams, error) {
34+
var (
35+
raw []byte
36+
pageTeams PageTeams
37+
code int
38+
err error
39+
requestParams = make(url.Values)
40+
)
41+
42+
for _, p := range params {
43+
p(requestParams)
44+
}
45+
46+
if raw, code, err = r.get(ctx, "api/teams/search", requestParams); err != nil {
47+
return pageTeams, err
48+
}
49+
if code != 200 {
50+
return pageTeams, fmt.Errorf("HTTP error %d: returns %s", code, raw)
51+
}
52+
dec := json.NewDecoder(bytes.NewReader(raw))
53+
dec.UseNumber()
54+
if err := dec.Decode(&pageTeams); err != nil {
55+
return pageTeams, fmt.Errorf("unmarshal teams: %s\n%s", err, raw)
56+
}
57+
return pageTeams, err
58+
}
59+
60+
func (r *Client) GetTeamByName(ctx context.Context, name string) (Team, error) {
61+
var (
62+
team Team
63+
err error
64+
)
65+
search, err := r.SearchTeams(ctx, WithTeam(name))
66+
if err != nil {
67+
return team, err
68+
}
69+
if len(search.Teams) == 0 {
70+
return Team{}, TeamNotFound
71+
}
72+
73+
return search.Teams[0], nil
74+
}
75+
76+
// GetTeam gets an team by ID.
77+
// Reflects GET /api/teams/:id API call.
78+
func (r *Client) GetTeam(ctx context.Context, id uint) (Team, error) {
79+
var (
80+
raw []byte
81+
team Team
82+
code int
83+
err error
84+
)
85+
if raw, code, err = r.get(ctx, fmt.Sprintf("api/teams/%d", id), nil); err != nil {
86+
return team, err
87+
}
88+
if code != 200 {
89+
return team, fmt.Errorf("HTTP error %d: returns %s", code, raw)
90+
}
91+
dec := json.NewDecoder(bytes.NewReader(raw))
92+
dec.UseNumber()
93+
if err := dec.Decode(&team); err != nil {
94+
return team, fmt.Errorf("unmarshal team: %s\n%s", err, raw)
95+
}
96+
return team, err
97+
}
98+
99+
// CreateTeam creates a new team.
100+
// Reflects POST /api/teams API call.
101+
func (r *Client) CreateTeam(ctx context.Context, t Team) (StatusMessage, error) {
102+
var (
103+
raw []byte
104+
resp StatusMessage
105+
err error
106+
)
107+
if raw, err = json.Marshal(t); err != nil {
108+
return StatusMessage{}, err
109+
}
110+
if raw, _, err = r.post(ctx, "api/teams", nil, raw); err != nil {
111+
return StatusMessage{}, err
112+
}
113+
if err = json.Unmarshal(raw, &resp); err != nil {
114+
return StatusMessage{}, err
115+
}
116+
return resp, nil
117+
}
118+
119+
// UpdateTeam updates a team.
120+
// Reflects PUT /api/teams/:id API call.
121+
func (r *Client) UpdateTeam(ctx context.Context, id uint, t Team) (StatusMessage, error) {
122+
var (
123+
raw []byte
124+
resp StatusMessage
125+
err error
126+
)
127+
if raw, err = json.Marshal(t); err != nil {
128+
return StatusMessage{}, err
129+
}
130+
if raw, _, err = r.put(ctx, fmt.Sprintf("api/teams/%d", id), nil, raw); err != nil {
131+
return StatusMessage{}, err
132+
}
133+
if err = json.Unmarshal(raw, &resp); err != nil {
134+
return StatusMessage{}, err
135+
}
136+
return resp, nil
137+
}
138+
139+
// DeleteTeam deletes a team.
140+
// Reflects DELETE /api/teams/:id API call.
141+
func (r *Client) DeleteTeam(ctx context.Context, id uint) (StatusMessage, error) {
142+
var (
143+
raw []byte
144+
resp StatusMessage
145+
err error
146+
)
147+
if raw, _, err = r.delete(ctx, fmt.Sprintf("api/teams/%d", id)); err != nil {
148+
return StatusMessage{}, err
149+
}
150+
if err = json.Unmarshal(raw, &resp); err != nil {
151+
return StatusMessage{}, err
152+
}
153+
return resp, nil
154+
}
155+
156+
// GetTeamMembers gets the members of a team by id.
157+
// Reflects GET /api/teams/:teamId/members API call.
158+
func (r *Client) GetTeamMembers(ctx context.Context, teamId uint) ([]TeamMember, error) {
159+
var (
160+
raw []byte
161+
teamMembers []TeamMember
162+
code int
163+
err error
164+
)
165+
if raw, code, err = r.get(ctx, fmt.Sprintf("api/teams/%d/members", teamId), nil); err != nil {
166+
return teamMembers, err
167+
}
168+
if code != 200 {
169+
return teamMembers, fmt.Errorf("HTTP error %d: returns %s", code, raw)
170+
}
171+
dec := json.NewDecoder(bytes.NewReader(raw))
172+
dec.UseNumber()
173+
if err := dec.Decode(&teamMembers); err != nil {
174+
return teamMembers, fmt.Errorf("unmarshal team: %s\n%s", err, raw)
175+
}
176+
return teamMembers, err
177+
}
178+
179+
// AddTeamMember adds a member to a team.
180+
// Reflects POST /api/teams/:teamId/members API call.
181+
func (r *Client) AddTeamMember(ctx context.Context, teamId uint, userId uint) (StatusMessage, error) {
182+
var (
183+
raw []byte
184+
resp StatusMessage
185+
err error
186+
)
187+
if raw, err = json.Marshal(struct {
188+
UserId uint `json:"userId"`
189+
}{
190+
UserId: userId,
191+
}); err != nil {
192+
return StatusMessage{}, err
193+
}
194+
if raw, _, err = r.post(ctx, fmt.Sprintf("api/teams/%d/members", teamId), nil, raw); err != nil {
195+
return StatusMessage{}, err
196+
}
197+
if err = json.Unmarshal(raw, &resp); err != nil {
198+
return StatusMessage{}, err
199+
}
200+
return resp, nil
201+
}
202+
203+
// DeleteTeamMember removes a ream member from a team by id.
204+
// Reflects DELETE /api/teams/:teamId/:userId API call.
205+
func (r *Client) DeleteTeamMember(ctx context.Context, teamId uint, userId uint) (StatusMessage, error) {
206+
var (
207+
raw []byte
208+
resp StatusMessage
209+
err error
210+
)
211+
if raw, _, err = r.delete(ctx, fmt.Sprintf("api/teams/%d/members/%d", teamId, userId)); err != nil {
212+
return StatusMessage{}, err
213+
}
214+
if err = json.Unmarshal(raw, &resp); err != nil {
215+
return StatusMessage{}, err
216+
}
217+
return resp, nil
218+
}
219+
220+
// GetTeamPreferences gets the preferences for a team by id.
221+
// Reflects GET /api/teams/:teamId/preferences API call.
222+
func (r *Client) GetTeamPreferences(ctx context.Context, teamId uint) (TeamPreferences, error) {
223+
var (
224+
raw []byte
225+
teamPreferences TeamPreferences
226+
code int
227+
err error
228+
)
229+
if raw, code, err = r.get(ctx, fmt.Sprintf("api/teams/%d/preferences", teamId), nil); err != nil {
230+
return teamPreferences, err
231+
}
232+
if code != 200 {
233+
return teamPreferences, fmt.Errorf("HTTP error %d: returns %s", code, raw)
234+
}
235+
dec := json.NewDecoder(bytes.NewReader(raw))
236+
dec.UseNumber()
237+
if err := dec.Decode(&teamPreferences); err != nil {
238+
return teamPreferences, fmt.Errorf("unmarshal team: %s\n%s", err, raw)
239+
}
240+
return teamPreferences, err
241+
}
242+
243+
// UpdateTeamPreferences updates the preferences for a team by id.
244+
// Reflects PUT /api/teams/:teamId/preferences API call.
245+
func (r *Client) UpdateTeamPreferences(ctx context.Context, teamId uint, tp TeamPreferences) (StatusMessage, error) {
246+
var (
247+
raw []byte
248+
resp StatusMessage
249+
err error
250+
)
251+
if raw, err = json.Marshal(tp); err != nil {
252+
return StatusMessage{}, err
253+
}
254+
if raw, _, err = r.put(ctx, fmt.Sprintf("api/teams/%d/preferences", teamId), nil, raw); err != nil {
255+
return StatusMessage{}, err
256+
}
257+
if err = json.Unmarshal(raw, &resp); err != nil {
258+
return StatusMessage{}, err
259+
}
260+
return resp, nil
261+
}
262+
263+
// TeamNotFound is an error returned if the given team was not found.
264+
var TeamNotFound = fmt.Errorf("team not found")
265+
266+
// SearchTeamParams is the type for all options implementing query parameters
267+
// perpage optional. default 1000
268+
// page optional. default 1
269+
// http://docs.grafana.org/http_api/team/#search-teams
270+
// http://docs.grafana.org/http_api/team/#search-teams-with-paging
271+
type SearchTeamParams func(values url.Values)
272+
273+
// WithQuery adds a query parameter
274+
func WithQuery(query string) SearchTeamParams {
275+
return func(v url.Values) {
276+
v.Set("query", query)
277+
}
278+
}
279+
280+
// WithPagesize adds a page size query parameter
281+
func WithPagesize(size uint) SearchTeamParams {
282+
return func(v url.Values) {
283+
v.Set("perpage", strconv.FormatUint(uint64(size),10))
284+
}
285+
}
286+
287+
// WithPage adds a page number query parameter
288+
func WithPage(page uint) SearchTeamParams {
289+
return func(v url.Values) {
290+
v.Set("page", strconv.FormatUint(uint64(page),10))
291+
}
292+
}
293+
294+
// WithTeam adds a query parameter
295+
func WithTeam(team string) SearchTeamParams {
296+
return func(v url.Values) {
297+
v.Set("team", team)
298+
}
299+
}

0 commit comments

Comments
 (0)