project_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// 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}