group_members.go

  1//
  2// Copyright 2017, Sander van Harmelen
  3//
  4// Licensed under the Apache License, Version 2.0 (the "License");
  5// you may not use this file except in compliance with the License.
  6// You may obtain a copy of the License at
  7//
  8//     http://www.apache.org/licenses/LICENSE-2.0
  9//
 10// Unless required by applicable law or agreed to in writing, software
 11// distributed under the License is distributed on an "AS IS" BASIS,
 12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 13// See the License for the specific language governing permissions and
 14// limitations under the License.
 15//
 16
 17package gitlab
 18
 19import (
 20	"fmt"
 21)
 22
 23// GroupMembersService handles communication with the group members
 24// related methods of the GitLab API.
 25//
 26// GitLab API docs: https://docs.gitlab.com/ce/api/members.html
 27type GroupMembersService struct {
 28	client *Client
 29}
 30
 31// GroupMember represents a GitLab group member.
 32//
 33// GitLab API docs: https://docs.gitlab.com/ce/api/members.html
 34type GroupMember struct {
 35	ID          int              `json:"id"`
 36	Username    string           `json:"username"`
 37	Name        string           `json:"name"`
 38	State       string           `json:"state"`
 39	AvatarURL   string           `json:"avatar_url"`
 40	WebURL      string           `json:"web_url"`
 41	ExpiresAt   *ISOTime         `json:"expires_at"`
 42	AccessLevel AccessLevelValue `json:"access_level"`
 43}
 44
 45// ListGroupMembersOptions represents the available ListGroupMembers() and
 46// ListAllGroupMembers() options.
 47//
 48// GitLab API docs:
 49// https://docs.gitlab.com/ce/api/members.html#list-all-members-of-a-group-or-project
 50type ListGroupMembersOptions struct {
 51	ListOptions
 52	Query *string `url:"query,omitempty" json:"query,omitempty"`
 53}
 54
 55// ListGroupMembers get a list of group members viewable by the authenticated
 56// user. Inherited members through ancestor groups are not included.
 57//
 58// GitLab API docs:
 59// https://docs.gitlab.com/ce/api/members.html#list-all-members-of-a-group-or-project
 60func (s *GroupsService) ListGroupMembers(gid interface{}, opt *ListGroupMembersOptions, options ...OptionFunc) ([]*GroupMember, *Response, error) {
 61	group, err := parseID(gid)
 62	if err != nil {
 63		return nil, nil, err
 64	}
 65	u := fmt.Sprintf("groups/%s/members", pathEscape(group))
 66
 67	req, err := s.client.NewRequest("GET", u, opt, options)
 68	if err != nil {
 69		return nil, nil, err
 70	}
 71
 72	var gm []*GroupMember
 73	resp, err := s.client.Do(req, &gm)
 74	if err != nil {
 75		return nil, resp, err
 76	}
 77
 78	return gm, resp, err
 79}
 80
 81// ListAllGroupMembers get a list of group members viewable by the authenticated
 82// user. Returns a list including inherited members through ancestor groups.
 83//
 84// GitLab API docs:
 85// https://docs.gitlab.com/ce/api/members.html#list-all-members-of-a-group-or-project-including-inherited-members
 86func (s *GroupsService) ListAllGroupMembers(gid interface{}, opt *ListGroupMembersOptions, options ...OptionFunc) ([]*GroupMember, *Response, error) {
 87	group, err := parseID(gid)
 88	if err != nil {
 89		return nil, nil, err
 90	}
 91	u := fmt.Sprintf("groups/%s/members/all", pathEscape(group))
 92
 93	req, err := s.client.NewRequest("GET", u, opt, options)
 94	if err != nil {
 95		return nil, nil, err
 96	}
 97
 98	var gm []*GroupMember
 99	resp, err := s.client.Do(req, &gm)
100	if err != nil {
101		return nil, resp, err
102	}
103
104	return gm, resp, err
105}
106
107// AddGroupMemberOptions represents the available AddGroupMember() options.
108//
109// GitLab API docs:
110// https://docs.gitlab.com/ce/api/members.html#add-a-member-to-a-group-or-project
111type AddGroupMemberOptions struct {
112	UserID      *int              `url:"user_id,omitempty" json:"user_id,omitempty"`
113	AccessLevel *AccessLevelValue `url:"access_level,omitempty" json:"access_level,omitempty"`
114	ExpiresAt   *string           `url:"expires_at,omitempty" json:"expires_at"`
115}
116
117// GetGroupMember gets a member of a group.
118//
119// GitLab API docs:
120// https://docs.gitlab.com/ce/api/members.html#get-a-member-of-a-group-or-project
121func (s *GroupMembersService) GetGroupMember(gid interface{}, user int, options ...OptionFunc) (*GroupMember, *Response, error) {
122	group, err := parseID(gid)
123	if err != nil {
124		return nil, nil, err
125	}
126	u := fmt.Sprintf("groups/%s/members/%d", pathEscape(group), user)
127
128	req, err := s.client.NewRequest("GET", u, nil, options)
129	if err != nil {
130		return nil, nil, err
131	}
132
133	gm := new(GroupMember)
134	resp, err := s.client.Do(req, gm)
135	if err != nil {
136		return nil, resp, err
137	}
138
139	return gm, resp, err
140}
141
142// AddGroupMember adds a user to the list of group members.
143//
144// GitLab API docs:
145// https://docs.gitlab.com/ce/api/members.html#add-a-member-to-a-group-or-project
146func (s *GroupMembersService) AddGroupMember(gid interface{}, opt *AddGroupMemberOptions, options ...OptionFunc) (*GroupMember, *Response, error) {
147	group, err := parseID(gid)
148	if err != nil {
149		return nil, nil, err
150	}
151	u := fmt.Sprintf("groups/%s/members", pathEscape(group))
152
153	req, err := s.client.NewRequest("POST", u, opt, options)
154	if err != nil {
155		return nil, nil, err
156	}
157
158	gm := new(GroupMember)
159	resp, err := s.client.Do(req, gm)
160	if err != nil {
161		return nil, resp, err
162	}
163
164	return gm, resp, err
165}
166
167// EditGroupMemberOptions represents the available EditGroupMember()
168// options.
169//
170// GitLab API docs:
171// https://docs.gitlab.com/ce/api/members.html#edit-a-member-of-a-group-or-project
172type EditGroupMemberOptions struct {
173	AccessLevel *AccessLevelValue `url:"access_level,omitempty" json:"access_level,omitempty"`
174	ExpiresAt   *string           `url:"expires_at,omitempty" json:"expires_at"`
175}
176
177// EditGroupMember updates a member of a group.
178//
179// GitLab API docs:
180// https://docs.gitlab.com/ce/api/members.html#edit-a-member-of-a-group-or-project
181func (s *GroupMembersService) EditGroupMember(gid interface{}, user int, opt *EditGroupMemberOptions, options ...OptionFunc) (*GroupMember, *Response, error) {
182	group, err := parseID(gid)
183	if err != nil {
184		return nil, nil, err
185	}
186	u := fmt.Sprintf("groups/%s/members/%d", pathEscape(group), user)
187
188	req, err := s.client.NewRequest("PUT", u, opt, options)
189	if err != nil {
190		return nil, nil, err
191	}
192
193	gm := new(GroupMember)
194	resp, err := s.client.Do(req, gm)
195	if err != nil {
196		return nil, resp, err
197	}
198
199	return gm, resp, err
200}
201
202// RemoveGroupMember removes user from user team.
203//
204// GitLab API docs:
205// https://docs.gitlab.com/ce/api/members.html#remove-a-member-from-a-group-or-project
206func (s *GroupMembersService) RemoveGroupMember(gid interface{}, user int, options ...OptionFunc) (*Response, error) {
207	group, err := parseID(gid)
208	if err != nil {
209		return nil, err
210	}
211	u := fmt.Sprintf("groups/%s/members/%d", pathEscape(group), user)
212
213	req, err := s.client.NewRequest("DELETE", u, nil, options)
214	if err != nil {
215		return nil, err
216	}
217
218	return s.client.Do(req, nil)
219}