1package gitlab
2
3import (
4 "fmt"
5 "time"
6)
7
8// PipelineTriggersService handles Project pipeline triggers.
9//
10// GitLab API docs:
11// https://docs.gitlab.com/ce/api/pipeline_triggers.html
12type PipelineTriggersService struct {
13 client *Client
14}
15
16// PipelineTrigger represents a project pipeline trigger.
17//
18// GitLab API docs:
19// https://docs.gitlab.com/ce/api/pipeline_triggers.html#pipeline-triggers
20type PipelineTrigger struct {
21 ID int `json:"id"`
22 Description string `json:"description"`
23 CreatedAt *time.Time `json:"created_at"`
24 DeletedAt *time.Time `json:"deleted_at"`
25 LastUsed *time.Time `json:"last_used"`
26 Token string `json:"token"`
27 UpdatedAt *time.Time `json:"updated_at"`
28 Owner *User `json:"owner"`
29}
30
31// ListPipelineTriggersOptions represents the available ListPipelineTriggers() options.
32//
33// GitLab API docs:
34// https://docs.gitlab.com/ce/api/pipeline_triggers.html#list-project-triggers
35type ListPipelineTriggersOptions ListOptions
36
37// ListPipelineTriggers gets a list of project triggers.
38//
39// GitLab API docs:
40// https://docs.gitlab.com/ce/api/pipeline_triggers.html#list-project-triggers
41func (s *PipelineTriggersService) ListPipelineTriggers(pid interface{}, opt *ListPipelineTriggersOptions, options ...OptionFunc) ([]*PipelineTrigger, *Response, error) {
42 project, err := parseID(pid)
43 if err != nil {
44 return nil, nil, err
45 }
46 u := fmt.Sprintf("projects/%s/triggers", pathEscape(project))
47
48 req, err := s.client.NewRequest("GET", u, opt, options)
49 if err != nil {
50 return nil, nil, err
51 }
52
53 var pt []*PipelineTrigger
54 resp, err := s.client.Do(req, &pt)
55 if err != nil {
56 return nil, resp, err
57 }
58
59 return pt, resp, err
60}
61
62// GetPipelineTrigger gets a specific pipeline trigger for a project.
63//
64// GitLab API docs:
65// https://docs.gitlab.com/ce/api/pipeline_triggers.html#get-trigger-details
66func (s *PipelineTriggersService) GetPipelineTrigger(pid interface{}, trigger int, options ...OptionFunc) (*PipelineTrigger, *Response, error) {
67 project, err := parseID(pid)
68 if err != nil {
69 return nil, nil, err
70 }
71 u := fmt.Sprintf("projects/%s/triggers/%d", pathEscape(project), trigger)
72
73 req, err := s.client.NewRequest("GET", u, nil, options)
74 if err != nil {
75 return nil, nil, err
76 }
77
78 pt := new(PipelineTrigger)
79 resp, err := s.client.Do(req, pt)
80 if err != nil {
81 return nil, resp, err
82 }
83
84 return pt, resp, err
85}
86
87// AddPipelineTriggerOptions represents the available AddPipelineTrigger() options.
88//
89// GitLab API docs:
90// https://docs.gitlab.com/ce/api/pipeline_triggers.html#create-a-project-trigger
91type AddPipelineTriggerOptions struct {
92 Description *string `url:"description,omitempty" json:"description,omitempty"`
93}
94
95// AddPipelineTrigger adds a pipeline trigger to a specified project.
96//
97// GitLab API docs:
98// https://docs.gitlab.com/ce/api/pipeline_triggers.html#create-a-project-trigger
99func (s *PipelineTriggersService) AddPipelineTrigger(pid interface{}, opt *AddPipelineTriggerOptions, options ...OptionFunc) (*PipelineTrigger, *Response, error) {
100 project, err := parseID(pid)
101 if err != nil {
102 return nil, nil, err
103 }
104 u := fmt.Sprintf("projects/%s/triggers", 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 pt := new(PipelineTrigger)
112 resp, err := s.client.Do(req, pt)
113 if err != nil {
114 return nil, resp, err
115 }
116
117 return pt, resp, err
118}
119
120// EditPipelineTriggerOptions represents the available EditPipelineTrigger() options.
121//
122// GitLab API docs:
123// https://docs.gitlab.com/ce/api/pipeline_triggers.html#update-a-project-trigger
124type EditPipelineTriggerOptions struct {
125 Description *string `url:"description,omitempty" json:"description,omitempty"`
126}
127
128// EditPipelineTrigger edits a trigger for a specified project.
129//
130// GitLab API docs:
131// https://docs.gitlab.com/ce/api/pipeline_triggers.html#update-a-project-trigger
132func (s *PipelineTriggersService) EditPipelineTrigger(pid interface{}, trigger int, opt *EditPipelineTriggerOptions, options ...OptionFunc) (*PipelineTrigger, *Response, error) {
133 project, err := parseID(pid)
134 if err != nil {
135 return nil, nil, err
136 }
137 u := fmt.Sprintf("projects/%s/triggers/%d", pathEscape(project), trigger)
138
139 req, err := s.client.NewRequest("PUT", u, opt, options)
140 if err != nil {
141 return nil, nil, err
142 }
143
144 pt := new(PipelineTrigger)
145 resp, err := s.client.Do(req, pt)
146 if err != nil {
147 return nil, resp, err
148 }
149
150 return pt, resp, err
151}
152
153// TakeOwnershipOfPipelineTrigger sets the owner of the specified
154// pipeline trigger to the user issuing the request.
155//
156// GitLab API docs:
157// https://docs.gitlab.com/ce/api/pipeline_triggers.html#take-ownership-of-a-project-trigger
158func (s *PipelineTriggersService) TakeOwnershipOfPipelineTrigger(pid interface{}, trigger int, options ...OptionFunc) (*PipelineTrigger, *Response, error) {
159 project, err := parseID(pid)
160 if err != nil {
161 return nil, nil, err
162 }
163 u := fmt.Sprintf("projects/%s/triggers/%d/take_ownership", pathEscape(project), trigger)
164
165 req, err := s.client.NewRequest("POST", u, nil, options)
166 if err != nil {
167 return nil, nil, err
168 }
169
170 pt := new(PipelineTrigger)
171 resp, err := s.client.Do(req, pt)
172 if err != nil {
173 return nil, resp, err
174 }
175
176 return pt, resp, err
177}
178
179// DeletePipelineTrigger removes a trigger from a project.
180//
181// GitLab API docs:
182// https://docs.gitlab.com/ce/api/pipeline_triggers.html#remove-a-project-trigger
183func (s *PipelineTriggersService) DeletePipelineTrigger(pid interface{}, trigger int, options ...OptionFunc) (*Response, error) {
184 project, err := parseID(pid)
185 if err != nil {
186 return nil, err
187 }
188 u := fmt.Sprintf("projects/%s/triggers/%d", pathEscape(project), trigger)
189
190 req, err := s.client.NewRequest("DELETE", u, nil, options)
191 if err != nil {
192 return nil, err
193 }
194
195 return s.client.Do(req, nil)
196}
197
198// RunPipelineTriggerOptions represents the available RunPipelineTrigger() options.
199//
200// GitLab API docs:
201// https://docs.gitlab.com/ce/ci/triggers/README.html#triggering-a-pipeline
202type RunPipelineTriggerOptions struct {
203 Ref *string `url:"ref" json:"ref"`
204 Token *string `url:"token" json:"token"`
205 Variables map[string]string `url:"variables,omitempty" json:"variables,omitempty"`
206}
207
208// RunPipelineTrigger starts a trigger from a project.
209//
210// GitLab API docs:
211// https://docs.gitlab.com/ce/ci/triggers/README.html#triggering-a-pipeline
212func (s *PipelineTriggersService) RunPipelineTrigger(pid interface{}, opt *RunPipelineTriggerOptions, options ...OptionFunc) (*Pipeline, *Response, error) {
213 project, err := parseID(pid)
214 if err != nil {
215 return nil, nil, err
216 }
217 u := fmt.Sprintf("projects/%s/trigger/pipeline", pathEscape(project))
218
219 req, err := s.client.NewRequest("POST", u, opt, options)
220 if err != nil {
221 return nil, nil, err
222 }
223
224 pt := new(Pipeline)
225 resp, err := s.client.Do(req, pt)
226 if err != nil {
227 return nil, resp, err
228 }
229
230 return pt, resp, err
231}