1package gitlab
2
3import (
4 "fmt"
5 "time"
6)
7
8// AccessRequest represents a access request for a group or project.
9//
10// GitLab API docs:
11// https://docs.gitlab.com/ce/api/access_requests.html
12type AccessRequest struct {
13 ID int `json:"id"`
14 Username string `json:"username"`
15 Name string `json:"name"`
16 State string `json:"state"`
17 CreatedAt *time.Time `json:"created_at"`
18 RequestedAt *time.Time `json:"requested_at"`
19 AccessLevel AccessLevelValue `json:"access_level"`
20}
21
22// AccessRequestsService handles communication with the project/group
23// access requests related methods of the GitLab API.
24//
25// GitLab API docs: https://docs.gitlab.com/ce/api/access_requests.html
26type AccessRequestsService struct {
27 client *Client
28}
29
30// ListAccessRequestsOptions represents the available
31// ListProjectAccessRequests() or ListGroupAccessRequests() options.
32//
33// GitLab API docs:
34// https://docs.gitlab.com/ce/api/access_requests.html#list-access-requests-for-a-group-or-project
35type ListAccessRequestsOptions ListOptions
36
37// ListProjectAccessRequests gets a list of access requests
38// viewable by the authenticated user.
39//
40// GitLab API docs:
41// https://docs.gitlab.com/ce/api/access_requests.html#list-access-requests-for-a-group-or-project
42func (s *AccessRequestsService) ListProjectAccessRequests(pid interface{}, opt *ListAccessRequestsOptions, options ...OptionFunc) ([]*AccessRequest, *Response, error) {
43 project, err := parseID(pid)
44 if err != nil {
45 return nil, nil, err
46 }
47 u := fmt.Sprintf("projects/%s/access_requests", pathEscape(project))
48
49 req, err := s.client.NewRequest("GET", u, opt, options)
50 if err != nil {
51 return nil, nil, err
52 }
53
54 var ars []*AccessRequest
55 resp, err := s.client.Do(req, &ars)
56 if err != nil {
57 return nil, resp, err
58 }
59
60 return ars, resp, err
61}
62
63// ListGroupAccessRequests gets a list of access requests
64// viewable by the authenticated user.
65//
66// GitLab API docs:
67// https://docs.gitlab.com/ce/api/access_requests.html#list-access-requests-for-a-group-or-project
68func (s *AccessRequestsService) ListGroupAccessRequests(gid interface{}, opt *ListAccessRequestsOptions, options ...OptionFunc) ([]*AccessRequest, *Response, error) {
69 group, err := parseID(gid)
70 if err != nil {
71 return nil, nil, err
72 }
73 u := fmt.Sprintf("groups/%s/access_requests", pathEscape(group))
74
75 req, err := s.client.NewRequest("GET", u, opt, options)
76 if err != nil {
77 return nil, nil, err
78 }
79
80 var ars []*AccessRequest
81 resp, err := s.client.Do(req, &ars)
82 if err != nil {
83 return nil, resp, err
84 }
85
86 return ars, resp, err
87}
88
89// RequestProjectAccess requests access for the authenticated user
90// to a group or project.
91//
92// GitLab API docs:
93// https://docs.gitlab.com/ce/api/access_requests.html#request-access-to-a-group-or-project
94func (s *AccessRequestsService) RequestProjectAccess(pid interface{}, options ...OptionFunc) (*AccessRequest, *Response, error) {
95 project, err := parseID(pid)
96 if err != nil {
97 return nil, nil, err
98 }
99 u := fmt.Sprintf("projects/%s/access_requests", pathEscape(project))
100
101 req, err := s.client.NewRequest("POST", u, nil, options)
102 if err != nil {
103 return nil, nil, err
104 }
105
106 ar := new(AccessRequest)
107 resp, err := s.client.Do(req, ar)
108 if err != nil {
109 return nil, resp, err
110 }
111
112 return ar, resp, err
113}
114
115// RequestGroupAccess requests access for the authenticated user
116// to a group or project.
117//
118// GitLab API docs:
119// https://docs.gitlab.com/ce/api/access_requests.html#request-access-to-a-group-or-project
120func (s *AccessRequestsService) RequestGroupAccess(gid interface{}, options ...OptionFunc) (*AccessRequest, *Response, error) {
121 group, err := parseID(gid)
122 if err != nil {
123 return nil, nil, err
124 }
125 u := fmt.Sprintf("groups/%s/access_requests", pathEscape(group))
126
127 req, err := s.client.NewRequest("POST", u, nil, options)
128 if err != nil {
129 return nil, nil, err
130 }
131
132 ar := new(AccessRequest)
133 resp, err := s.client.Do(req, ar)
134 if err != nil {
135 return nil, resp, err
136 }
137
138 return ar, resp, err
139}
140
141// ApproveAccessRequestOptions represents the available
142// ApproveProjectAccessRequest() and ApproveGroupAccessRequest() options.
143//
144// GitLab API docs:
145// https://docs.gitlab.com/ce/api/access_requests.html#approve-an-access-request
146type ApproveAccessRequestOptions struct {
147 AccessLevel *AccessLevelValue `url:"access_level,omitempty" json:"access_level,omitempty"`
148}
149
150// ApproveProjectAccessRequest approves an access request for the given user.
151//
152// GitLab API docs:
153// https://docs.gitlab.com/ce/api/access_requests.html#approve-an-access-request
154func (s *AccessRequestsService) ApproveProjectAccessRequest(pid interface{}, user int, opt *ApproveAccessRequestOptions, options ...OptionFunc) (*AccessRequest, *Response, error) {
155 project, err := parseID(pid)
156 if err != nil {
157 return nil, nil, err
158 }
159 u := fmt.Sprintf("projects/%s/access_requests/%d/approve", pathEscape(project), user)
160
161 req, err := s.client.NewRequest("PUT", u, opt, options)
162 if err != nil {
163 return nil, nil, err
164 }
165
166 ar := new(AccessRequest)
167 resp, err := s.client.Do(req, ar)
168 if err != nil {
169 return nil, resp, err
170 }
171
172 return ar, resp, err
173}
174
175// ApproveGroupAccessRequest approves an access request for the given user.
176//
177// GitLab API docs:
178// https://docs.gitlab.com/ce/api/access_requests.html#approve-an-access-request
179func (s *AccessRequestsService) ApproveGroupAccessRequest(gid interface{}, user int, opt *ApproveAccessRequestOptions, options ...OptionFunc) (*AccessRequest, *Response, error) {
180 group, err := parseID(gid)
181 if err != nil {
182 return nil, nil, err
183 }
184 u := fmt.Sprintf("groups/%s/access_requests/%d/approve", pathEscape(group), user)
185
186 req, err := s.client.NewRequest("PUT", u, opt, options)
187 if err != nil {
188 return nil, nil, err
189 }
190
191 ar := new(AccessRequest)
192 resp, err := s.client.Do(req, ar)
193 if err != nil {
194 return nil, resp, err
195 }
196
197 return ar, resp, err
198}
199
200// DenyProjectAccessRequest denies an access request for the given user.
201//
202// GitLab API docs:
203// https://docs.gitlab.com/ce/api/access_requests.html#deny-an-access-request
204func (s *AccessRequestsService) DenyProjectAccessRequest(pid interface{}, user int, options ...OptionFunc) (*Response, error) {
205 project, err := parseID(pid)
206 if err != nil {
207 return nil, err
208 }
209 u := fmt.Sprintf("projects/%s/access_requests/%d", pathEscape(project), user)
210
211 req, err := s.client.NewRequest("DELETE", u, nil, options)
212 if err != nil {
213 return nil, err
214 }
215
216 return s.client.Do(req, nil)
217}
218
219// DenyGroupAccessRequest denies an access request for the given user.
220//
221// GitLab API docs:
222// https://docs.gitlab.com/ce/api/access_requests.html#deny-an-access-request
223func (s *AccessRequestsService) DenyGroupAccessRequest(gid interface{}, user int, options ...OptionFunc) (*Response, error) {
224 group, err := parseID(gid)
225 if err != nil {
226 return nil, err
227 }
228 u := fmt.Sprintf("groups/%s/access_requests/%d", pathEscape(group), user)
229
230 req, err := s.client.NewRequest("DELETE", u, nil, options)
231 if err != nil {
232 return nil, err
233 }
234
235 return s.client.Do(req, nil)
236}