1//
2// Copyright 2017, Arkbriar
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 "time"
22)
23
24// AwardEmojiService handles communication with the emoji awards related methods
25// of the GitLab API.
26//
27// GitLab API docs: https://docs.gitlab.com/ce/api/award_emoji.html
28type AwardEmojiService struct {
29 client *Client
30}
31
32// AwardEmoji represents a GitLab Award Emoji.
33//
34// GitLab API docs: https://docs.gitlab.com/ce/api/award_emoji.html
35type AwardEmoji struct {
36 ID int `json:"id"`
37 Name string `json:"name"`
38 User struct {
39 Name string `json:"name"`
40 Username string `json:"username"`
41 ID int `json:"id"`
42 State string `json:"state"`
43 AvatarURL string `json:"avatar_url"`
44 WebURL string `json:"web_url"`
45 } `json:"user"`
46 CreatedAt *time.Time `json:"created_at"`
47 UpdatedAt *time.Time `json:"updated_at"`
48 AwardableID int `json:"awardable_id"`
49 AwardableType string `json:"awardable_type"`
50}
51
52const (
53 awardMergeRequest = "merge_requests"
54 awardIssue = "issues"
55 awardSnippets = "snippets"
56)
57
58// ListAwardEmojiOptions represents the available options for listing emoji
59// for each resources
60//
61// GitLab API docs:
62// https://docs.gitlab.com/ce/api/award_emoji.html
63type ListAwardEmojiOptions ListOptions
64
65// ListMergeRequestAwardEmoji gets a list of all award emoji on the merge request.
66//
67// GitLab API docs:
68// https://docs.gitlab.com/ce/api/award_emoji.html#list-an-awardable-39-s-award-emoji
69func (s *AwardEmojiService) ListMergeRequestAwardEmoji(pid interface{}, mergeRequestIID int, opt *ListAwardEmojiOptions, options ...OptionFunc) ([]*AwardEmoji, *Response, error) {
70 return s.listAwardEmoji(pid, awardMergeRequest, mergeRequestIID, opt, options...)
71}
72
73// ListIssueAwardEmoji gets a list of all award emoji on the issue.
74//
75// GitLab API docs:
76// https://docs.gitlab.com/ce/api/award_emoji.html#list-an-awardable-39-s-award-emoji
77func (s *AwardEmojiService) ListIssueAwardEmoji(pid interface{}, issueIID int, opt *ListAwardEmojiOptions, options ...OptionFunc) ([]*AwardEmoji, *Response, error) {
78 return s.listAwardEmoji(pid, awardIssue, issueIID, opt, options...)
79}
80
81// ListSnippetAwardEmoji gets a list of all award emoji on the snippet.
82//
83// GitLab API docs:
84// https://docs.gitlab.com/ce/api/award_emoji.html#list-an-awardable-39-s-award-emoji
85func (s *AwardEmojiService) ListSnippetAwardEmoji(pid interface{}, snippetID int, opt *ListAwardEmojiOptions, options ...OptionFunc) ([]*AwardEmoji, *Response, error) {
86 return s.listAwardEmoji(pid, awardSnippets, snippetID, opt, options...)
87}
88
89func (s *AwardEmojiService) listAwardEmoji(pid interface{}, resource string, resourceID int, opt *ListAwardEmojiOptions, options ...OptionFunc) ([]*AwardEmoji, *Response, error) {
90 project, err := parseID(pid)
91 if err != nil {
92 return nil, nil, err
93 }
94 u := fmt.Sprintf("projects/%s/%s/%d/award_emoji",
95 pathEscape(project),
96 resource,
97 resourceID,
98 )
99
100 req, err := s.client.NewRequest("GET", u, opt, options)
101 if err != nil {
102 return nil, nil, err
103 }
104
105 var as []*AwardEmoji
106 resp, err := s.client.Do(req, &as)
107 if err != nil {
108 return nil, resp, err
109 }
110
111 return as, resp, err
112}
113
114// GetMergeRequestAwardEmoji get an award emoji from merge request.
115//
116// GitLab API docs:
117// https://docs.gitlab.com/ce/api/award_emoji.html#list-an-awardable-39-s-award-emoji
118func (s *AwardEmojiService) GetMergeRequestAwardEmoji(pid interface{}, mergeRequestIID, awardID int, options ...OptionFunc) (*AwardEmoji, *Response, error) {
119 return s.getAwardEmoji(pid, awardMergeRequest, mergeRequestIID, awardID, options...)
120}
121
122// GetIssueAwardEmoji get an award emoji from issue.
123//
124// GitLab API docs:
125// https://docs.gitlab.com/ce/api/award_emoji.html#list-an-awardable-39-s-award-emoji
126func (s *AwardEmojiService) GetIssueAwardEmoji(pid interface{}, issueIID, awardID int, options ...OptionFunc) (*AwardEmoji, *Response, error) {
127 return s.getAwardEmoji(pid, awardIssue, issueIID, awardID, options...)
128}
129
130// GetSnippetAwardEmoji get an award emoji from snippet.
131//
132// GitLab API docs:
133// https://docs.gitlab.com/ce/api/award_emoji.html#list-an-awardable-39-s-award-emoji
134func (s *AwardEmojiService) GetSnippetAwardEmoji(pid interface{}, snippetID, awardID int, options ...OptionFunc) (*AwardEmoji, *Response, error) {
135 return s.getAwardEmoji(pid, awardSnippets, snippetID, awardID, options...)
136}
137
138func (s *AwardEmojiService) getAwardEmoji(pid interface{}, resource string, resourceID, awardID int, options ...OptionFunc) (*AwardEmoji, *Response, error) {
139 project, err := parseID(pid)
140 if err != nil {
141 return nil, nil, err
142 }
143 u := fmt.Sprintf("projects/%s/%s/%d/award_emoji/%d",
144 pathEscape(project),
145 resource,
146 resourceID,
147 awardID,
148 )
149
150 req, err := s.client.NewRequest("GET", u, nil, options)
151 if err != nil {
152 return nil, nil, err
153 }
154
155 a := new(AwardEmoji)
156 resp, err := s.client.Do(req, &a)
157 if err != nil {
158 return nil, resp, err
159 }
160
161 return a, resp, err
162}
163
164// CreateAwardEmojiOptions represents the available options for awarding emoji
165// for a resource
166//
167// GitLab API docs:
168// https://docs.gitlab.com/ce/api/award_emoji.html#award-a-new-emoji
169type CreateAwardEmojiOptions struct {
170 Name string `json:"name"`
171}
172
173// CreateMergeRequestAwardEmoji get an award emoji from merge request.
174//
175// GitLab API docs:
176// https://docs.gitlab.com/ce/api/award_emoji.html#award-a-new-emoji
177func (s *AwardEmojiService) CreateMergeRequestAwardEmoji(pid interface{}, mergeRequestIID int, opt *CreateAwardEmojiOptions, options ...OptionFunc) (*AwardEmoji, *Response, error) {
178 return s.createAwardEmoji(pid, awardMergeRequest, mergeRequestIID, opt, options...)
179}
180
181// CreateIssueAwardEmoji get an award emoji from issue.
182//
183// GitLab API docs:
184// https://docs.gitlab.com/ce/api/award_emoji.html#award-a-new-emoji
185func (s *AwardEmojiService) CreateIssueAwardEmoji(pid interface{}, issueIID int, opt *CreateAwardEmojiOptions, options ...OptionFunc) (*AwardEmoji, *Response, error) {
186 return s.createAwardEmoji(pid, awardIssue, issueIID, opt, options...)
187}
188
189// CreateSnippetAwardEmoji get an award emoji from snippet.
190//
191// GitLab API docs:
192// https://docs.gitlab.com/ce/api/award_emoji.html#award-a-new-emoji
193func (s *AwardEmojiService) CreateSnippetAwardEmoji(pid interface{}, snippetID int, opt *CreateAwardEmojiOptions, options ...OptionFunc) (*AwardEmoji, *Response, error) {
194 return s.createAwardEmoji(pid, awardSnippets, snippetID, opt, options...)
195}
196
197func (s *AwardEmojiService) createAwardEmoji(pid interface{}, resource string, resourceID int, opt *CreateAwardEmojiOptions, options ...OptionFunc) (*AwardEmoji, *Response, error) {
198 project, err := parseID(pid)
199 if err != nil {
200 return nil, nil, err
201 }
202 u := fmt.Sprintf("projects/%s/%s/%d/award_emoji",
203 pathEscape(project),
204 resource,
205 resourceID,
206 )
207
208 req, err := s.client.NewRequest("POST", u, opt, options)
209 if err != nil {
210 return nil, nil, err
211 }
212
213 a := new(AwardEmoji)
214 resp, err := s.client.Do(req, &a)
215 if err != nil {
216 return nil, resp, err
217 }
218
219 return a, resp, err
220}
221
222// DeleteIssueAwardEmoji delete award emoji on an issue.
223//
224// GitLab API docs:
225// https://docs.gitlab.com/ce/api/award_emoji.html#award-a-new-emoji-on-a-note
226func (s *AwardEmojiService) DeleteIssueAwardEmoji(pid interface{}, issueIID, awardID int, options ...OptionFunc) (*Response, error) {
227 return s.deleteAwardEmoji(pid, awardMergeRequest, issueIID, awardID, options...)
228}
229
230// DeleteMergeRequestAwardEmoji delete award emoji on a merge request.
231//
232// GitLab API docs:
233// https://docs.gitlab.com/ce/api/award_emoji.html#award-a-new-emoji-on-a-note
234func (s *AwardEmojiService) DeleteMergeRequestAwardEmoji(pid interface{}, mergeRequestIID, awardID int, options ...OptionFunc) (*Response, error) {
235 return s.deleteAwardEmoji(pid, awardMergeRequest, mergeRequestIID, awardID, options...)
236}
237
238// DeleteSnippetAwardEmoji delete award emoji on a snippet.
239//
240// GitLab API docs:
241// https://docs.gitlab.com/ce/api/award_emoji.html#award-a-new-emoji-on-a-note
242func (s *AwardEmojiService) DeleteSnippetAwardEmoji(pid interface{}, snippetID, awardID int, options ...OptionFunc) (*Response, error) {
243 return s.deleteAwardEmoji(pid, awardMergeRequest, snippetID, awardID, options...)
244}
245
246// DeleteAwardEmoji Delete an award emoji on the specified resource.
247//
248// GitLab API docs:
249// https://docs.gitlab.com/ce/api/award_emoji.html#delete-an-award-emoji
250func (s *AwardEmojiService) deleteAwardEmoji(pid interface{}, resource string, resourceID, awardID int, options ...OptionFunc) (*Response, error) {
251 project, err := parseID(pid)
252 if err != nil {
253 return nil, err
254 }
255 u := fmt.Sprintf("projects/%s/%s/%d/award_emoji/%d", pathEscape(project), resource,
256 resourceID, awardID)
257
258 req, err := s.client.NewRequest("DELETE", u, nil, options)
259 if err != nil {
260 return nil, err
261 }
262 return s.client.Do(req, nil)
263}
264
265// ListIssuesAwardEmojiOnNote gets a list of all award emoji on a note from the
266// issue.
267//
268// GitLab API docs:
269// https://docs.gitlab.com/ce/api/award_emoji.html#award-emoji-on-notes
270func (s *AwardEmojiService) ListIssuesAwardEmojiOnNote(pid interface{}, issueID, noteID int, opt *ListAwardEmojiOptions, options ...OptionFunc) ([]*AwardEmoji, *Response, error) {
271 return s.listAwardEmojiOnNote(pid, awardIssue, issueID, noteID, opt, options...)
272}
273
274// ListMergeRequestAwardEmojiOnNote gets a list of all award emoji on a note
275// from the merge request.
276//
277// GitLab API docs:
278// https://docs.gitlab.com/ce/api/award_emoji.html#award-emoji-on-notes
279func (s *AwardEmojiService) ListMergeRequestAwardEmojiOnNote(pid interface{}, mergeRequestIID, noteID int, opt *ListAwardEmojiOptions, options ...OptionFunc) ([]*AwardEmoji, *Response, error) {
280 return s.listAwardEmojiOnNote(pid, awardMergeRequest, mergeRequestIID, noteID, opt, options...)
281}
282
283// ListSnippetAwardEmojiOnNote gets a list of all award emoji on a note from the
284// snippet.
285//
286// GitLab API docs:
287// https://docs.gitlab.com/ce/api/award_emoji.html#award-emoji-on-notes
288func (s *AwardEmojiService) ListSnippetAwardEmojiOnNote(pid interface{}, snippetIID, noteID int, opt *ListAwardEmojiOptions, options ...OptionFunc) ([]*AwardEmoji, *Response, error) {
289 return s.listAwardEmojiOnNote(pid, awardSnippets, snippetIID, noteID, opt, options...)
290}
291
292func (s *AwardEmojiService) listAwardEmojiOnNote(pid interface{}, resources string, ressourceID, noteID int, opt *ListAwardEmojiOptions, options ...OptionFunc) ([]*AwardEmoji, *Response, error) {
293 project, err := parseID(pid)
294 if err != nil {
295 return nil, nil, err
296 }
297 u := fmt.Sprintf("projects/%s/%s/%d/notes/%d/award_emoji", pathEscape(project), resources,
298 ressourceID, noteID)
299
300 req, err := s.client.NewRequest("GET", u, opt, options)
301 if err != nil {
302 return nil, nil, err
303 }
304
305 var as []*AwardEmoji
306 resp, err := s.client.Do(req, &as)
307 if err != nil {
308 return nil, resp, err
309 }
310
311 return as, resp, err
312}
313
314// GetIssuesAwardEmojiOnNote gets an award emoji on a note from an issue.
315//
316// GitLab API docs:
317// https://docs.gitlab.com/ce/api/award_emoji.html#award-emoji-on-notes
318func (s *AwardEmojiService) GetIssuesAwardEmojiOnNote(pid interface{}, issueID, noteID, awardID int, options ...OptionFunc) (*AwardEmoji, *Response, error) {
319 return s.getSingleNoteAwardEmoji(pid, awardIssue, issueID, noteID, awardID, options...)
320}
321
322// GetMergeRequestAwardEmojiOnNote gets an award emoji on a note from a
323// merge request.
324//
325// GitLab API docs:
326// https://docs.gitlab.com/ce/api/award_emoji.html#award-emoji-on-notes
327func (s *AwardEmojiService) GetMergeRequestAwardEmojiOnNote(pid interface{}, mergeRequestIID, noteID, awardID int, options ...OptionFunc) (*AwardEmoji, *Response, error) {
328 return s.getSingleNoteAwardEmoji(pid, awardMergeRequest, mergeRequestIID, noteID, awardID,
329 options...)
330}
331
332// GetSnippetAwardEmojiOnNote gets an award emoji on a note from a snippet.
333//
334// GitLab API docs:
335// https://docs.gitlab.com/ce/api/award_emoji.html#award-emoji-on-notes
336func (s *AwardEmojiService) GetSnippetAwardEmojiOnNote(pid interface{}, snippetIID, noteID, awardID int, options ...OptionFunc) (*AwardEmoji, *Response, error) {
337 return s.getSingleNoteAwardEmoji(pid, awardSnippets, snippetIID, noteID, awardID, options...)
338}
339
340func (s *AwardEmojiService) getSingleNoteAwardEmoji(pid interface{}, ressource string, resourceID, noteID, awardID int, options ...OptionFunc) (*AwardEmoji, *Response, error) {
341 project, err := parseID(pid)
342 if err != nil {
343 return nil, nil, err
344 }
345 u := fmt.Sprintf("projects/%s/%s/%d/notes/%d/award_emoji/%d",
346 pathEscape(project),
347 ressource,
348 resourceID,
349 noteID,
350 awardID,
351 )
352
353 req, err := s.client.NewRequest("GET", u, nil, options)
354 if err != nil {
355 return nil, nil, err
356 }
357
358 a := new(AwardEmoji)
359 resp, err := s.client.Do(req, &a)
360 if err != nil {
361 return nil, resp, err
362 }
363
364 return a, resp, err
365}
366
367// CreateIssuesAwardEmojiOnNote gets an award emoji on a note from an issue.
368//
369// GitLab API docs:
370// https://docs.gitlab.com/ce/api/award_emoji.html#award-emoji-on-notes
371func (s *AwardEmojiService) CreateIssuesAwardEmojiOnNote(pid interface{}, issueID, noteID int, opt *CreateAwardEmojiOptions, options ...OptionFunc) (*AwardEmoji, *Response, error) {
372 return s.createAwardEmojiOnNote(pid, awardIssue, issueID, noteID, opt, options...)
373}
374
375// CreateMergeRequestAwardEmojiOnNote gets an award emoji on a note from a
376// merge request.
377//
378// GitLab API docs:
379// https://docs.gitlab.com/ce/api/award_emoji.html#award-emoji-on-notes
380func (s *AwardEmojiService) CreateMergeRequestAwardEmojiOnNote(pid interface{}, mergeRequestIID, noteID int, opt *CreateAwardEmojiOptions, options ...OptionFunc) (*AwardEmoji, *Response, error) {
381 return s.createAwardEmojiOnNote(pid, awardMergeRequest, mergeRequestIID, noteID, opt, options...)
382}
383
384// CreateSnippetAwardEmojiOnNote gets an award emoji on a note from a snippet.
385//
386// GitLab API docs:
387// https://docs.gitlab.com/ce/api/award_emoji.html#award-emoji-on-notes
388func (s *AwardEmojiService) CreateSnippetAwardEmojiOnNote(pid interface{}, snippetIID, noteID int, opt *CreateAwardEmojiOptions, options ...OptionFunc) (*AwardEmoji, *Response, error) {
389 return s.createAwardEmojiOnNote(pid, awardSnippets, snippetIID, noteID, opt, options...)
390}
391
392// CreateAwardEmojiOnNote award emoji on a note.
393//
394// GitLab API docs:
395// https://docs.gitlab.com/ce/api/award_emoji.html#award-a-new-emoji-on-a-note
396func (s *AwardEmojiService) createAwardEmojiOnNote(pid interface{}, resource string, resourceID, noteID int, opt *CreateAwardEmojiOptions, options ...OptionFunc) (*AwardEmoji, *Response, error) {
397 project, err := parseID(pid)
398 if err != nil {
399 return nil, nil, err
400 }
401 u := fmt.Sprintf("projects/%s/%s/%d/notes/%d/award_emoji",
402 pathEscape(project),
403 resource,
404 resourceID,
405 noteID,
406 )
407
408 req, err := s.client.NewRequest("POST", u, nil, options)
409 if err != nil {
410 return nil, nil, err
411 }
412
413 a := new(AwardEmoji)
414 resp, err := s.client.Do(req, &a)
415 if err != nil {
416 return nil, resp, err
417 }
418
419 return a, resp, err
420}
421
422// DeleteIssuesAwardEmojiOnNote deletes an award emoji on a note from an issue.
423//
424// GitLab API docs:
425// https://docs.gitlab.com/ce/api/award_emoji.html#award-emoji-on-notes
426func (s *AwardEmojiService) DeleteIssuesAwardEmojiOnNote(pid interface{}, issueID, noteID, awardID int, options ...OptionFunc) (*Response, error) {
427 return s.deleteAwardEmojiOnNote(pid, awardIssue, issueID, noteID, awardID, options...)
428}
429
430// DeleteMergeRequestAwardEmojiOnNote deletes an award emoji on a note from a
431// merge request.
432//
433// GitLab API docs:
434// https://docs.gitlab.com/ce/api/award_emoji.html#award-emoji-on-notes
435func (s *AwardEmojiService) DeleteMergeRequestAwardEmojiOnNote(pid interface{}, mergeRequestIID, noteID, awardID int, options ...OptionFunc) (*Response, error) {
436 return s.deleteAwardEmojiOnNote(pid, awardMergeRequest, mergeRequestIID, noteID, awardID,
437 options...)
438}
439
440// DeleteSnippetAwardEmojiOnNote deletes an award emoji on a note from a snippet.
441//
442// GitLab API docs:
443// https://docs.gitlab.com/ce/api/award_emoji.html#award-emoji-on-notes
444func (s *AwardEmojiService) DeleteSnippetAwardEmojiOnNote(pid interface{}, snippetIID, noteID, awardID int, options ...OptionFunc) (*Response, error) {
445 return s.deleteAwardEmojiOnNote(pid, awardSnippets, snippetIID, noteID, awardID, options...)
446}
447
448func (s *AwardEmojiService) deleteAwardEmojiOnNote(pid interface{}, resource string, resourceID, noteID, awardID int, options ...OptionFunc) (*Response, error) {
449 project, err := parseID(pid)
450 if err != nil {
451 return nil, err
452 }
453 u := fmt.Sprintf("projects/%s/%s/%d/notes/%d/award_emoji/%d",
454 pathEscape(project),
455 resource,
456 resourceID,
457 noteID,
458 awardID,
459 )
460
461 req, err := s.client.NewRequest("DELETE", u, nil, options)
462 if err != nil {
463 return nil, err
464 }
465
466 return s.client.Do(req, nil)
467}