1package pagerduty
2
3import (
4	"fmt"
5	"net/http"
6
7	"github.com/google/go-querystring/query"
8)
9
10// Team is a collection of users and escalation policies that represent a group of people within an organization.
11type Team struct {
12	APIObject
13	Name        string `json:"name,omitempty"`
14	Description string `json:"description,omitempty"`
15}
16
17// ListTeamResponse is the structure used when calling the ListTeams API endpoint.
18type ListTeamResponse struct {
19	APIListObject
20	Teams []Team
21}
22
23// ListTeamOptions are the input parameters used when calling the ListTeams API endpoint.
24type ListTeamOptions struct {
25	APIListObject
26	Query string `url:"query,omitempty"`
27}
28
29// ListTeams lists teams of your PagerDuty account, optionally filtered by a search query.
30func (c *Client) ListTeams(o ListTeamOptions) (*ListTeamResponse, error) {
31	v, err := query.Values(o)
32	if err != nil {
33		return nil, err
34	}
35
36	resp, err := c.get("/teams?" + v.Encode())
37	if err != nil {
38		return nil, err
39	}
40	var result ListTeamResponse
41	return &result, c.decodeJSON(resp, &result)
42}
43
44// CreateTeam creates a new team.
45func (c *Client) CreateTeam(t *Team) (*Team, error) {
46	resp, err := c.post("/teams", t, nil)
47	return getTeamFromResponse(c, resp, err)
48}
49
50// DeleteTeam removes an existing team.
51func (c *Client) DeleteTeam(id string) error {
52	_, err := c.delete("/teams/" + id)
53	return err
54}
55
56// GetTeam gets details about an existing team.
57func (c *Client) GetTeam(id string) (*Team, error) {
58	resp, err := c.get("/teams/" + id)
59	return getTeamFromResponse(c, resp, err)
60}
61
62// UpdateTeam updates an existing team.
63func (c *Client) UpdateTeam(id string, t *Team) (*Team, error) {
64	resp, err := c.put("/teams/"+id, t, nil)
65	return getTeamFromResponse(c, resp, err)
66}
67
68// RemoveEscalationPolicyFromTeam removes an escalation policy from a team.
69func (c *Client) RemoveEscalationPolicyFromTeam(teamID, epID string) error {
70	_, err := c.delete("/teams/" + teamID + "/escalation_policies/" + epID)
71	return err
72}
73
74// AddEscalationPolicyToTeam adds an escalation policy to a team.
75func (c *Client) AddEscalationPolicyToTeam(teamID, epID string) error {
76	_, err := c.put("/teams/"+teamID+"/escalation_policies/"+epID, nil, nil)
77	return err
78}
79
80// RemoveUserFromTeam removes a user from a team.
81func (c *Client) RemoveUserFromTeam(teamID, userID string) error {
82	_, err := c.delete("/teams/" + teamID + "/users/" + userID)
83	return err
84}
85
86// AddUserToTeam adds a user to a team.
87func (c *Client) AddUserToTeam(teamID, userID string) error {
88	_, err := c.put("/teams/"+teamID+"/users/"+userID, nil, nil)
89	return err
90}
91
92func getTeamFromResponse(c *Client, resp *http.Response, err error) (*Team, error) {
93	if err != nil {
94		return nil, err
95	}
96	var target map[string]Team
97	if dErr := c.decodeJSON(resp, &target); dErr != nil {
98		return nil, fmt.Errorf("Could not decode JSON response: %v", dErr)
99	}
100	rootNode := "team"
101	t, nodeOK := target[rootNode]
102	if !nodeOK {
103		return nil, fmt.Errorf("JSON response does not have %s field", rootNode)
104	}
105	return &t, nil
106}
107