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}