project_members.go 6.3 KB

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