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 ExpiresAt *string `url:"expires_at,omitempty" json:"expires_at"`
128}
129
130// AddProjectMember adds a user to a project team. This is an idempotent
131// method and can be called multiple times with the same parameters. Adding
132// team membership to a user that is already a member does not affect the
133// existing membership.
134//
135// GitLab API docs:
136// https://docs.gitlab.com/ce/api/members.html#add-a-member-to-a-group-or-project
137func (s *ProjectMembersService) AddProjectMember(pid interface{}, opt *AddProjectMemberOptions, options ...OptionFunc) (*ProjectMember, *Response, error) {
138 project, err := parseID(pid)
139 if err != nil {
140 return nil, nil, err
141 }
142 u := fmt.Sprintf("projects/%s/members", pathEscape(project))
143
144 req, err := s.client.NewRequest("POST", u, opt, options)
145 if err != nil {
146 return nil, nil, err
147 }
148
149 pm := new(ProjectMember)
150 resp, err := s.client.Do(req, pm)
151 if err != nil {
152 return nil, resp, err
153 }
154
155 return pm, resp, err
156}
157
158// EditProjectMemberOptions represents the available EditProjectMember() options.
159//
160// GitLab API docs:
161// https://docs.gitlab.com/ce/api/members.html#edit-a-member-of-a-group-or-project
162type EditProjectMemberOptions struct {
163 AccessLevel *AccessLevelValue `url:"access_level,omitempty" json:"access_level,omitempty"`
164 ExpiresAt *string `url:"expires_at,omitempty" json:"expires_at"`
165}
166
167// EditProjectMember updates a project team member to a specified access level..
168//
169// GitLab API docs:
170// https://docs.gitlab.com/ce/api/members.html#edit-a-member-of-a-group-or-project
171func (s *ProjectMembersService) EditProjectMember(pid interface{}, user int, opt *EditProjectMemberOptions, options ...OptionFunc) (*ProjectMember, *Response, error) {
172 project, err := parseID(pid)
173 if err != nil {
174 return nil, nil, err
175 }
176 u := fmt.Sprintf("projects/%s/members/%d", pathEscape(project), user)
177
178 req, err := s.client.NewRequest("PUT", u, opt, options)
179 if err != nil {
180 return nil, nil, err
181 }
182
183 pm := new(ProjectMember)
184 resp, err := s.client.Do(req, pm)
185 if err != nil {
186 return nil, resp, err
187 }
188
189 return pm, resp, err
190}
191
192// DeleteProjectMember removes a user from a project team.
193//
194// GitLab API docs:
195// https://docs.gitlab.com/ce/api/members.html#remove-a-member-from-a-group-or-project
196func (s *ProjectMembersService) DeleteProjectMember(pid interface{}, user int, options ...OptionFunc) (*Response, error) {
197 project, err := parseID(pid)
198 if err != nil {
199 return nil, err
200 }
201 u := fmt.Sprintf("projects/%s/members/%d", pathEscape(project), user)
202
203 req, err := s.client.NewRequest("DELETE", u, nil, options)
204 if err != nil {
205 return nil, err
206 }
207
208 return s.client.Do(req, nil)
209}