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// ProjectMembersService handles communication with the project members
24// related methods of the GitLab API.
25//
26// GitLab API docs: https://docs.gitlab.com/ce/api/members.html
27type ProjectMembersService struct {
28 client *Client
29}
30
31// ListProjectMembersOptions represents the available ListProjectMembers() and
32// ListAllProjectMembers() options.
33//
34// GitLab API docs:
35// https://docs.gitlab.com/ce/api/members.html#list-all-members-of-a-group-or-project
36type ListProjectMembersOptions struct {
37 ListOptions
38 Query *string `url:"query,omitempty" json:"query,omitempty"`
39}
40
41// ListProjectMembers gets a list of a project's team members viewable by the
42// authenticated user. Returns only direct members and not inherited members
43// through ancestors groups.
44//
45// GitLab API docs:
46// https://docs.gitlab.com/ce/api/members.html#list-all-members-of-a-group-or-project
47func (s *ProjectMembersService) ListProjectMembers(pid interface{}, opt *ListProjectMembersOptions, options ...OptionFunc) ([]*ProjectMember, *Response, error) {
48 project, err := parseID(pid)
49 if err != nil {
50 return nil, nil, err
51 }
52 u := fmt.Sprintf("projects/%s/members", pathEscape(project))
53
54 req, err := s.client.NewRequest("GET", u, opt, options)
55 if err != nil {
56 return nil, nil, err
57 }
58
59 var pm []*ProjectMember
60 resp, err := s.client.Do(req, &pm)
61 if err != nil {
62 return nil, resp, err
63 }
64
65 return pm, resp, err
66}
67
68// ListAllProjectMembers gets a list of a project's team members viewable by the
69// authenticated user. Returns a list including inherited members through
70// ancestor groups.
71//
72// GitLab API docs:
73// https://docs.gitlab.com/ce/api/members.html#list-all-members-of-a-group-or-project-including-inherited-members
74func (s *ProjectMembersService) ListAllProjectMembers(pid interface{}, opt *ListProjectMembersOptions, options ...OptionFunc) ([]*ProjectMember, *Response, error) {
75 project, err := parseID(pid)
76 if err != nil {
77 return nil, nil, err
78 }
79 u := fmt.Sprintf("projects/%s/members/all", pathEscape(project))
80
81 req, err := s.client.NewRequest("GET", u, opt, options)
82 if err != nil {
83 return nil, nil, err
84 }
85
86 var pm []*ProjectMember
87 resp, err := s.client.Do(req, &pm)
88 if err != nil {
89 return nil, resp, err
90 }
91
92 return pm, resp, err
93}
94
95// GetProjectMember gets a project team member.
96//
97// GitLab API docs:
98// https://docs.gitlab.com/ce/api/members.html#get-a-member-of-a-group-or-project
99func (s *ProjectMembersService) GetProjectMember(pid interface{}, user int, options ...OptionFunc) (*ProjectMember, *Response, error) {
100 project, err := parseID(pid)
101 if err != nil {
102 return nil, nil, err
103 }
104 u := fmt.Sprintf("projects/%s/members/%d", pathEscape(project), user)
105
106 req, err := s.client.NewRequest("GET", u, nil, options)
107 if err != nil {
108 return nil, nil, err
109 }
110
111 pm := new(ProjectMember)
112 resp, err := s.client.Do(req, pm)
113 if err != nil {
114 return nil, resp, err
115 }
116
117 return pm, resp, err
118}
119
120// AddProjectMemberOptions represents the available AddProjectMember() options.
121//
122// GitLab API docs:
123// https://docs.gitlab.com/ce/api/members.html#add-a-member-to-a-group-or-project
124type AddProjectMemberOptions struct {
125 UserID *int `url:"user_id,omitempty" json:"user_id,omitempty"`
126 AccessLevel *AccessLevelValue `url:"access_level,omitempty" json:"access_level,omitempty"`
127}
128
129// AddProjectMember adds a user to a project team. This is an idempotent
130// method and can be called multiple times with the same parameters. Adding
131// team membership to a user that is already a member does not affect the
132// existing membership.
133//
134// GitLab API docs:
135// https://docs.gitlab.com/ce/api/members.html#add-a-member-to-a-group-or-project
136func (s *ProjectMembersService) AddProjectMember(pid interface{}, opt *AddProjectMemberOptions, options ...OptionFunc) (*ProjectMember, *Response, error) {
137 project, err := parseID(pid)
138 if err != nil {
139 return nil, nil, err
140 }
141 u := fmt.Sprintf("projects/%s/members", pathEscape(project))
142
143 req, err := s.client.NewRequest("POST", u, opt, options)
144 if err != nil {
145 return nil, nil, err
146 }
147
148 pm := new(ProjectMember)
149 resp, err := s.client.Do(req, pm)
150 if err != nil {
151 return nil, resp, err
152 }
153
154 return pm, resp, err
155}
156
157// EditProjectMemberOptions represents the available EditProjectMember() options.
158//
159// GitLab API docs:
160// https://docs.gitlab.com/ce/api/members.html#edit-a-member-of-a-group-or-project
161type EditProjectMemberOptions struct {
162 AccessLevel *AccessLevelValue `url:"access_level,omitempty" json:"access_level,omitempty"`
163}
164
165// EditProjectMember updates a project team member to a specified access level..
166//
167// GitLab API docs:
168// https://docs.gitlab.com/ce/api/members.html#edit-a-member-of-a-group-or-project
169func (s *ProjectMembersService) EditProjectMember(pid interface{}, user int, opt *EditProjectMemberOptions, options ...OptionFunc) (*ProjectMember, *Response, error) {
170 project, err := parseID(pid)
171 if err != nil {
172 return nil, nil, err
173 }
174 u := fmt.Sprintf("projects/%s/members/%d", pathEscape(project), user)
175
176 req, err := s.client.NewRequest("PUT", u, opt, options)
177 if err != nil {
178 return nil, nil, err
179 }
180
181 pm := new(ProjectMember)
182 resp, err := s.client.Do(req, pm)
183 if err != nil {
184 return nil, resp, err
185 }
186
187 return pm, resp, err
188}
189
190// DeleteProjectMember removes a user from a project team.
191//
192// GitLab API docs:
193// https://docs.gitlab.com/ce/api/members.html#remove-a-member-from-a-group-or-project
194func (s *ProjectMembersService) DeleteProjectMember(pid interface{}, user int, options ...OptionFunc) (*Response, error) {
195 project, err := parseID(pid)
196 if err != nil {
197 return nil, err
198 }
199 u := fmt.Sprintf("projects/%s/members/%d", pathEscape(project), user)
200
201 req, err := s.client.NewRequest("DELETE", u, nil, options)
202 if err != nil {
203 return nil, err
204 }
205
206 return s.client.Do(req, nil)
207}