Skip to content

Commit

Permalink
add support for new team membership API
Browse files Browse the repository at this point in the history
  • Loading branch information
willnorris committed Aug 25, 2014
1 parent 32d2b56 commit 7610669
Show file tree
Hide file tree
Showing 3 changed files with 149 additions and 0 deletions.
5 changes: 5 additions & 0 deletions github/github.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,11 @@ const (

mediaTypeV3 = "application/vnd.github.v3+json"
defaultMediaType = "application/octet-stream"

// Media Type values to access preview APIs

// https://developer.github.com/changes/2014-08-05-team-memberships-api/
mediaTypeTeamMembershipPreview = "application/vnd.github.the-wasp-preview+json"
)

// A Client manages communication with the GitHub API.
Expand Down
86 changes: 86 additions & 0 deletions github/orgs_teams.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,17 @@ func (t Team) String() string {
return Stringify(t)
}

// TeamMembership represents the status an a user's membership in a team.
type TeamMembership struct {
URL *string `json:"url,omitempty"`
// Status is the user's status within the team. Possible values are: "active", "pending"
Status *string `json:"status,omitempty"`
}

func (t TeamMembership) String() string {
return Stringify(t)
}

// ListTeams lists all of the teams for an organization.
//
// GitHub API docs: http://developer.github.com/v3/orgs/teams/#list-teams
Expand Down Expand Up @@ -251,3 +262,78 @@ func (s *OrganizationsService) RemoveTeamRepo(team int, owner string, repo strin

return s.client.Do(req, nil)
}

// GetTeamMembership returns the membership status for a user in a team.
//
// GitHub API docs: https://developer.github.com/v3/orgs/teams/#get-team-membership
func (s *OrganizationsService) GetTeamMembership(team int, user string) (*TeamMembership, *Response, error) {
u := fmt.Sprintf("teams/%v/memberships/%v", team, user)
req, err := s.client.NewRequest("GET", u, nil)
if err != nil {
return nil, nil, err
}

// TODO: remove custom Accept header when this API fully launches
req.Header.Set("Accept", mediaTypeTeamMembershipPreview)

t := new(TeamMembership)
resp, err := s.client.Do(req, t)
if err != nil {
return nil, resp, err
}

return t, resp, err
}

// AddTeamMembership adds or invites a user to a team.
//
// In order to add a membership between a user and a team, the authenticated
// user must have 'admin' permissions to the team or be an owner of the
// organization that the team is associated with.
//
// If the user is already a part of the team's organization (meaning they're on
// at least one other team in the organization), this endpoint will add the
// user to the team.
//
// If the user is completely unaffiliated with the team's organization (meaning
// they're on none of the organization's teams), this endpoint will send an
// invitation to the user via email. This newly-created membership will be in
// the "pending" state until the user accepts the invitation, at which point
// the membership will transition to the "active" state and the user will be
// added as a member of the team.
//
// GitHub API docs: https://developer.github.com/v3/orgs/teams/#add-team-membership
func (s *OrganizationsService) AddTeamMembership(team int, user string) (*TeamMembership, *Response, error) {
u := fmt.Sprintf("teams/%v/memberships/%v", team, user)
req, err := s.client.NewRequest("PUT", u, nil)
if err != nil {
return nil, nil, err
}

// TODO: remove custom Accept header when this API fully launches
req.Header.Set("Accept", mediaTypeTeamMembershipPreview)

t := new(TeamMembership)
resp, err := s.client.Do(req, t)
if err != nil {
return nil, resp, err
}

return t, resp, err
}

// RemoveTeamMembership removes a user from a team.
//
// GitHub API docs: https://developer.github.com/v3/orgs/teams/#remove-team-membership
func (s *OrganizationsService) RemoveTeamMembership(team int, user string) (*Response, error) {
u := fmt.Sprintf("teams/%v/memberships/%v", team, user)
req, err := s.client.NewRequest("DELETE", u, nil)
if err != nil {
return nil, err
}

// TODO: remove custom Accept header when this API fully launches
req.Header.Set("Accept", mediaTypeTeamMembershipPreview)

return s.client.Do(req, nil)
}
58 changes: 58 additions & 0 deletions github/orgs_teams_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -435,3 +435,61 @@ func TestOrganizationsService_RemoveTeamRepo_invalidOwner(t *testing.T) {
_, err := client.Organizations.RemoveTeamRepo(1, "%", "r")
testURLParseError(t, err)
}

func TestOrganizationsService_GetTeamMembership(t *testing.T) {
setup()
defer teardown()

mux.HandleFunc("/teams/1/memberships/u", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "GET")
testHeader(t, r, "Accept", mediaTypeTeamMembershipPreview)
fmt.Fprint(w, `{"url":"u", "status":"active"}`)
})

membership, _, err := client.Organizations.GetTeamMembership(1, "u")
if err != nil {
t.Errorf("Organizations.GetTeamMembership returned error: %v", err)
}

want := &TeamMembership{URL: String("u"), Status: String("active")}
if !reflect.DeepEqual(membership, want) {
t.Errorf("Organizations.GetTeamMembership returned %+v, want %+v", membership, want)
}
}

func TestOrganizationsService_AddTeamMembership(t *testing.T) {
setup()
defer teardown()

mux.HandleFunc("/teams/1/memberships/u", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "PUT")
testHeader(t, r, "Accept", mediaTypeTeamMembershipPreview)
fmt.Fprint(w, `{"url":"u", "status":"pending"}`)
})

membership, _, err := client.Organizations.AddTeamMembership(1, "u")
if err != nil {
t.Errorf("Organizations.AddTeamMembership returned error: %v", err)
}

want := &TeamMembership{URL: String("u"), Status: String("pending")}
if !reflect.DeepEqual(membership, want) {
t.Errorf("Organizations.AddTeamMembership returned %+v, want %+v", membership, want)
}
}

func TestOrganizationsService_RemoveTeamMembership(t *testing.T) {
setup()
defer teardown()

mux.HandleFunc("/teams/1/memberships/u", func(w http.ResponseWriter, r *http.Request) {
testMethod(t, r, "DELETE")
testHeader(t, r, "Accept", mediaTypeTeamMembershipPreview)
w.WriteHeader(http.StatusNoContent)
})

_, err := client.Organizations.RemoveTeamMembership(1, "u")
if err != nil {
t.Errorf("Organizations.RemoveTeamMembership returned error: %v", err)
}
}

0 comments on commit 7610669

Please sign in to comment.