releaselinks.go

  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}