1package gitlab
2
3import (
4 "fmt"
5)
6
7// ReleaseLinksService handles communication with the release link methods
8// of the GitLab API.
9//
10// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html
11type ReleaseLinksService struct {
12 client *Client
13}
14
15// ReleaseLink represents a release link.
16//
17// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html
18type ReleaseLink struct {
19 ID int `json:"id"`
20 Name string `json:"name"`
21 URL string `json:"url"`
22 External bool `json:"external"`
23}
24
25// ListReleaseLinksOptions represents ListReleaseLinks() options.
26//
27// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html#get-links
28type ListReleaseLinksOptions ListOptions
29
30// ListReleaseLinks gets assets as links from a Release.
31//
32// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html#get-links
33func (s *ReleaseLinksService) ListReleaseLinks(pid interface{}, tagName string, opt *ListReleaseLinksOptions, options ...OptionFunc) ([]*ReleaseLink, *Response, error) {
34 project, err := parseID(pid)
35 if err != nil {
36 return nil, nil, err
37 }
38 u := fmt.Sprintf("projects/%s/releases/%s/assets/links", pathEscape(project), tagName)
39
40 req, err := s.client.NewRequest("GET", u, opt, options)
41 if err != nil {
42 return nil, nil, err
43 }
44
45 var rls []*ReleaseLink
46 resp, err := s.client.Do(req, &rls)
47 if err != nil {
48 return nil, resp, err
49 }
50
51 return rls, resp, err
52}
53
54// GetReleaseLink returns a link from release assets.
55//
56// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html#get-a-link
57func (s *ReleaseLinksService) GetReleaseLink(pid interface{}, tagName string, link int, options ...OptionFunc) (*ReleaseLink, *Response, error) {
58 project, err := parseID(pid)
59 if err != nil {
60 return nil, nil, err
61 }
62 u := fmt.Sprintf("projects/%s/releases/%s/assets/links/%d",
63 pathEscape(project),
64 tagName,
65 link)
66
67 req, err := s.client.NewRequest("GET", u, nil, options)
68 if err != nil {
69 return nil, nil, err
70 }
71
72 rl := new(ReleaseLink)
73 resp, err := s.client.Do(req, rl)
74 if err != nil {
75 return nil, resp, err
76 }
77
78 return rl, resp, err
79}
80
81// CreateReleaseLinkOptions represents CreateReleaseLink() options.
82//
83// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html#create-a-link
84type CreateReleaseLinkOptions struct {
85 Name *string `url:"name" json:"name"`
86 URL *string `url:"url" json:"url"`
87}
88
89// CreateReleaseLink creates a link.
90//
91// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html#create-a-link
92func (s *ReleaseLinksService) CreateReleaseLink(pid interface{}, tagName string, opt *CreateReleaseLinkOptions, options ...OptionFunc) (*ReleaseLink, *Response, error) {
93 project, err := parseID(pid)
94 if err != nil {
95 return nil, nil, err
96 }
97 u := fmt.Sprintf("projects/%s/releases/%s/assets/links", pathEscape(project), tagName)
98
99 req, err := s.client.NewRequest("POST", u, opt, options)
100 if err != nil {
101 return nil, nil, err
102 }
103
104 rl := new(ReleaseLink)
105 resp, err := s.client.Do(req, rl)
106 if err != nil {
107 return nil, resp, err
108 }
109
110 return rl, resp, err
111}
112
113// UpdateReleaseLinkOptions represents UpdateReleaseLink() options.
114//
115// You have to specify at least one of Name of URL.
116//
117// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html#update-a-link
118type UpdateReleaseLinkOptions struct {
119 Name *string `url:"name,omitempty" json:"name,omitempty"`
120 URL *string `url:"url,omitempty" json:"url,omitempty"`
121}
122
123// UpdateReleaseLink updates an asset link.
124//
125// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html#update-a-link
126func (s *ReleaseLinksService) UpdateReleaseLink(pid interface{}, tagName string, link int, opt *UpdateReleaseLinkOptions, options ...OptionFunc) (*ReleaseLink, *Response, error) {
127 project, err := parseID(pid)
128 if err != nil {
129 return nil, nil, err
130 }
131 u := fmt.Sprintf("projects/%s/releases/%s/assets/links/%d",
132 pathEscape(project),
133 tagName,
134 link)
135
136 req, err := s.client.NewRequest("PUT", u, opt, options)
137 if err != nil {
138 return nil, nil, err
139 }
140
141 rl := new(ReleaseLink)
142 resp, err := s.client.Do(req, rl)
143 if err != nil {
144 return nil, resp, err
145 }
146
147 return rl, resp, err
148}
149
150// DeleteReleaseLink deletes a link from release.
151//
152// GitLab API docs: https://docs.gitlab.com/ee/api/releases/links.html#delete-a-link
153func (s *ReleaseLinksService) DeleteReleaseLink(pid interface{}, tagName string, link int, options ...OptionFunc) (*ReleaseLink, *Response, error) {
154 project, err := parseID(pid)
155 if err != nil {
156 return nil, nil, err
157 }
158 u := fmt.Sprintf("projects/%s/releases/%s/assets/links/%d",
159 pathEscape(project),
160 tagName,
161 link,
162 )
163
164 req, err := s.client.NewRequest("DELETE", u, nil, options)
165 if err != nil {
166 return nil, nil, err
167 }
168
169 rl := new(ReleaseLink)
170 resp, err := s.client.Do(req, rl)
171 if err != nil {
172 return nil, resp, err
173 }
174
175 return rl, resp, err
176}