1package gitlab
2
3import (
4 "fmt"
5)
6
7// ProjectBadge represents a project badge.
8//
9// GitLab API docs:
10// https://docs.gitlab.com/ee/api/project_badges.html#list-all-badges-of-a-project
11type ProjectBadge struct {
12 ID int `json:"id"`
13 LinkURL string `json:"link_url"`
14 ImageURL string `json:"image_url"`
15 RenderedLinkURL string `json:"rendered_link_url"`
16 RenderedImageURL string `json:"rendered_image_url"`
17 // Kind represents a project badge kind. Can be empty, when used PreviewProjectBadge().
18 Kind string `json:"kind"`
19}
20
21// ProjectBadgesService handles communication with the project badges
22// related methods of the GitLab API.
23//
24// GitLab API docs: https://docs.gitlab.com/ee/api/project_badges.html
25type ProjectBadgesService struct {
26 client *Client
27}
28
29// ListProjectBadgesOptions represents the available ListProjectBadges()
30// options.
31//
32// GitLab API docs:
33// https://docs.gitlab.com/ee/api/project_badges.html#list-all-badges-of-a-project
34type ListProjectBadgesOptions ListOptions
35
36// ListProjectBadges gets a list of a project's badges and its group badges.
37//
38// GitLab API docs:
39// https://docs.gitlab.com/ee/api/project_badges.html#list-all-badges-of-a-project
40func (s *ProjectBadgesService) ListProjectBadges(pid interface{}, opt *ListProjectBadgesOptions, options ...OptionFunc) ([]*ProjectBadge, *Response, error) {
41 project, err := parseID(pid)
42 if err != nil {
43 return nil, nil, err
44 }
45 u := fmt.Sprintf("projects/%s/badges", pathEscape(project))
46
47 req, err := s.client.NewRequest("GET", u, opt, options)
48 if err != nil {
49 return nil, nil, err
50 }
51
52 var pb []*ProjectBadge
53 resp, err := s.client.Do(req, &pb)
54 if err != nil {
55 return nil, resp, err
56 }
57
58 return pb, resp, err
59}
60
61// GetProjectBadge gets a project badge.
62//
63// GitLab API docs:
64// https://docs.gitlab.com/ee/api/project_badges.html#get-a-badge-of-a-project
65func (s *ProjectBadgesService) GetProjectBadge(pid interface{}, badge int, options ...OptionFunc) (*ProjectBadge, *Response, error) {
66 project, err := parseID(pid)
67 if err != nil {
68 return nil, nil, err
69 }
70 u := fmt.Sprintf("projects/%s/badges/%d", pathEscape(project), badge)
71
72 req, err := s.client.NewRequest("GET", u, nil, options)
73 if err != nil {
74 return nil, nil, err
75 }
76
77 pb := new(ProjectBadge)
78 resp, err := s.client.Do(req, pb)
79 if err != nil {
80 return nil, resp, err
81 }
82
83 return pb, resp, err
84}
85
86// AddProjectBadgeOptions represents the available AddProjectBadge() options.
87//
88// GitLab API docs:
89// https://docs.gitlab.com/ee/api/project_badges.html#add-a-badge-to-a-project
90type AddProjectBadgeOptions struct {
91 LinkURL *string `url:"link_url,omitempty" json:"link_url,omitempty"`
92 ImageURL *string `url:"image_url,omitempty" json:"image_url,omitempty"`
93}
94
95// AddProjectBadge adds a badge to a project.
96//
97// GitLab API docs:
98// https://docs.gitlab.com/ee/api/project_badges.html#add-a-badge-to-a-project
99func (s *ProjectBadgesService) AddProjectBadge(pid interface{}, opt *AddProjectBadgeOptions, options ...OptionFunc) (*ProjectBadge, *Response, error) {
100 project, err := parseID(pid)
101 if err != nil {
102 return nil, nil, err
103 }
104 u := fmt.Sprintf("projects/%s/badges", pathEscape(project))
105
106 req, err := s.client.NewRequest("POST", u, opt, options)
107 if err != nil {
108 return nil, nil, err
109 }
110
111 pb := new(ProjectBadge)
112 resp, err := s.client.Do(req, pb)
113 if err != nil {
114 return nil, resp, err
115 }
116
117 return pb, resp, err
118}
119
120// EditProjectBadgeOptions represents the available EditProjectBadge() options.
121//
122// GitLab API docs:
123// https://docs.gitlab.com/ee/api/project_badges.html#edit-a-badge-of-a-project
124type EditProjectBadgeOptions struct {
125 LinkURL *string `url:"link_url,omitempty" json:"link_url,omitempty"`
126 ImageURL *string `url:"image_url,omitempty" json:"image_url,omitempty"`
127}
128
129// EditProjectBadge updates a badge of a project.
130//
131// GitLab API docs:
132// https://docs.gitlab.com/ee/api/project_badges.html#edit-a-badge-of-a-project
133func (s *ProjectBadgesService) EditProjectBadge(pid interface{}, badge int, opt *EditProjectBadgeOptions, options ...OptionFunc) (*ProjectBadge, *Response, error) {
134 project, err := parseID(pid)
135 if err != nil {
136 return nil, nil, err
137 }
138 u := fmt.Sprintf("projects/%s/badges/%d", pathEscape(project), badge)
139
140 req, err := s.client.NewRequest("PUT", u, opt, options)
141 if err != nil {
142 return nil, nil, err
143 }
144
145 pb := new(ProjectBadge)
146 resp, err := s.client.Do(req, pb)
147 if err != nil {
148 return nil, resp, err
149 }
150
151 return pb, resp, err
152}
153
154// DeleteProjectBadge removes a badge from a project. Only project's
155// badges will be removed by using this endpoint.
156//
157// GitLab API docs:
158// https://docs.gitlab.com/ee/api/project_badges.html#remove-a-badge-from-a-project
159func (s *ProjectBadgesService) DeleteProjectBadge(pid interface{}, badge int, options ...OptionFunc) (*Response, error) {
160 project, err := parseID(pid)
161 if err != nil {
162 return nil, err
163 }
164 u := fmt.Sprintf("projects/%s/badges/%d", pathEscape(project), badge)
165
166 req, err := s.client.NewRequest("DELETE", u, nil, options)
167 if err != nil {
168 return nil, err
169 }
170
171 return s.client.Do(req, nil)
172}
173
174// ProjectBadgePreviewOptions represents the available PreviewProjectBadge() options.
175//
176// GitLab API docs:
177// https://docs.gitlab.com/ee/api/project_badges.html#preview-a-badge-from-a-project
178type ProjectBadgePreviewOptions struct {
179 LinkURL *string `url:"link_url,omitempty" json:"link_url,omitempty"`
180 ImageURL *string `url:"image_url,omitempty" json:"image_url,omitempty"`
181}
182
183// PreviewProjectBadge returns how the link_url and image_url final URLs would be after
184// resolving the placeholder interpolation.
185//
186// GitLab API docs:
187// https://docs.gitlab.com/ee/api/project_badges.html#preview-a-badge-from-a-project
188func (s *ProjectBadgesService) PreviewProjectBadge(pid interface{}, opt *ProjectBadgePreviewOptions, options ...OptionFunc) (*ProjectBadge, *Response, error) {
189 project, err := parseID(pid)
190 if err != nil {
191 return nil, nil, err
192 }
193 u := fmt.Sprintf("projects/%s/badges/render", pathEscape(project))
194
195 req, err := s.client.NewRequest("GET", u, opt, options)
196 if err != nil {
197 return nil, nil, err
198 }
199
200 pb := new(ProjectBadge)
201 resp, err := s.client.Do(req, &pb)
202 if err != nil {
203 return nil, resp, err
204 }
205
206 return pb, resp, err
207}