1 package gitlab
2
3 import (
4 "fmt"
5 "net/http"
6 "time"
7 )
8
9
10
11
12
13 type ProjectFeatureFlagService struct {
14 client *Client
15 }
16
17
18
19
20 type ProjectFeatureFlag struct {
21 Name string `json:"name"`
22 Description string `json:"description"`
23 Active bool `json:"active"`
24 Version string `json:"version"`
25 CreatedAt *time.Time `json:"created_at"`
26 UpdatedAt *time.Time `json:"updated_at"`
27 Scopes []*ProjectFeatureFlagScope `json:"scopes"`
28 Strategies []*ProjectFeatureFlagStrategy `json:"strategies"`
29 }
30
31
32
33
34 type ProjectFeatureFlagScope struct {
35 ID int `json:"id"`
36 EnvironmentScope string `json:"environment_scope"`
37 }
38
39
40
41
42 type ProjectFeatureFlagStrategy struct {
43 ID int `json:"id"`
44 Name string `json:"name"`
45 Parameters *ProjectFeatureFlagStrategyParameter `json:"parameters"`
46 Scopes []*ProjectFeatureFlagScope `json:"scopes"`
47 }
48
49
50
51
52 type ProjectFeatureFlagStrategyParameter struct {
53 GroupID string `json:"groupId,omitempty"`
54 UserIDs string `json:"userIds,omitempty"`
55 Percentage string `json:"percentage,omitempty"`
56
57
58
59
60 Rollout string `json:"rollout,omitempty"`
61 Stickiness string `json:"stickiness,omitempty"`
62 }
63
64 func (i ProjectFeatureFlag) String() string {
65 return Stringify(i)
66 }
67
68
69
70
71
72 type ListProjectFeatureFlagOptions struct {
73 ListOptions
74 Scope *string `url:"scope,omitempty" json:"scope,omitempty"`
75 }
76
77
78
79
80
81 func (s *ProjectFeatureFlagService) ListProjectFeatureFlags(pid interface{}, opt *ListProjectFeatureFlagOptions, options ...RequestOptionFunc) ([]*ProjectFeatureFlag, *Response, error) {
82 project, err := parseID(pid)
83 if err != nil {
84 return nil, nil, err
85 }
86 u := fmt.Sprintf("projects/%s/feature_flags", PathEscape(project))
87
88 req, err := s.client.NewRequest(http.MethodGet, u, opt, options)
89 if err != nil {
90 return nil, nil, err
91 }
92
93 var pffs []*ProjectFeatureFlag
94 resp, err := s.client.Do(req, &pffs)
95 if err != nil {
96 return nil, resp, err
97 }
98
99 return pffs, resp, nil
100 }
101
102
103
104
105
106 func (s *ProjectFeatureFlagService) GetProjectFeatureFlag(pid interface{}, name string, options ...RequestOptionFunc) (*ProjectFeatureFlag, *Response, error) {
107 project, err := parseID(pid)
108 if err != nil {
109 return nil, nil, err
110 }
111 u := fmt.Sprintf("projects/%s/feature_flags/%s", PathEscape(project), name)
112
113 req, err := s.client.NewRequest(http.MethodGet, u, nil, options)
114 if err != nil {
115 return nil, nil, err
116 }
117
118 flag := new(ProjectFeatureFlag)
119 resp, err := s.client.Do(req, flag)
120 if err != nil {
121 return nil, resp, err
122 }
123
124 return flag, resp, nil
125 }
126
127
128
129
130
131
132 type CreateProjectFeatureFlagOptions struct {
133 Name *string `url:"name,omitempty" json:"name,omitempty"`
134 Description *string `url:"description,omitempty" json:"description,omitempty"`
135 Version *string `url:"version,omitempty" json:"version,omitempty"`
136 Active *bool `url:"active,omitempty" json:"active,omitempty"`
137 Strategies *[]*FeatureFlagStrategyOptions `url:"strategies,omitempty" json:"strategies,omitempty"`
138 }
139
140
141
142
143
144
145 type FeatureFlagStrategyOptions struct {
146 ID *int `url:"id,omitempty" json:"id,omitempty"`
147 Name *string `url:"name,omitempty" json:"name,omitempty"`
148 Parameters *ProjectFeatureFlagStrategyParameter `url:"parameters,omitempty" json:"parameters,omitempty"`
149 Scopes *[]*ProjectFeatureFlagScope `url:"scopes,omitempty" json:"scopes,omitempty"`
150 }
151
152
153
154
155
156
157 type ProjectFeatureFlagScopeOptions struct {
158 ID *int `url:"id,omitempty" json:"id,omitempty"`
159 EnvironmentScope *string `url:"id,omitempty" json:"environment_scope,omitempty"`
160 }
161
162
163
164
165
166 func (s *ProjectFeatureFlagService) CreateProjectFeatureFlag(pid interface{}, opt *CreateProjectFeatureFlagOptions, options ...RequestOptionFunc) (*ProjectFeatureFlag, *Response, error) {
167 project, err := parseID(pid)
168 if err != nil {
169 return nil, nil, err
170 }
171 u := fmt.Sprintf("projects/%s/feature_flags",
172 PathEscape(project),
173 )
174
175 req, err := s.client.NewRequest(http.MethodPost, u, opt, options)
176 if err != nil {
177 return nil, nil, err
178 }
179
180 flag := new(ProjectFeatureFlag)
181 resp, err := s.client.Do(req, flag)
182 if err != nil {
183 return flag, resp, err
184 }
185
186 return flag, resp, nil
187 }
188
189
190
191
192
193
194 type UpdateProjectFeatureFlagOptions struct {
195 Name *string `url:"name,omitempty" json:"name,omitempty"`
196 Description *string `url:"description,omitempty" json:"description,omitempty"`
197 Active *bool `url:"active,omitempty" json:"active,omitempty"`
198 Strategies *[]*FeatureFlagStrategyOptions `url:"strategies,omitempty" json:"strategies,omitempty"`
199 }
200
201
202
203
204
205 func (s *ProjectFeatureFlagService) UpdateProjectFeatureFlag(pid interface{}, name string, opt *UpdateProjectFeatureFlagOptions, options ...RequestOptionFunc) (*ProjectFeatureFlag, *Response, error) {
206 group, err := parseID(pid)
207 if err != nil {
208 return nil, nil, err
209 }
210 u := fmt.Sprintf("projects/%s/feature_flags/%s",
211 PathEscape(group),
212 name,
213 )
214
215 req, err := s.client.NewRequest(http.MethodPut, u, opt, options)
216 if err != nil {
217 return nil, nil, err
218 }
219
220 flag := new(ProjectFeatureFlag)
221 resp, err := s.client.Do(req, flag)
222 if err != nil {
223 return flag, resp, err
224 }
225
226 return flag, resp, nil
227 }
228
229
230
231
232
233 func (s *ProjectFeatureFlagService) DeleteProjectFeatureFlag(pid interface{}, name string, options ...RequestOptionFunc) (*Response, error) {
234 project, err := parseID(pid)
235 if err != nil {
236 return nil, err
237 }
238 u := fmt.Sprintf("projects/%s/feature_flags/%s", PathEscape(project), name)
239
240 req, err := s.client.NewRequest(http.MethodDelete, u, nil, options)
241 if err != nil {
242 return nil, err
243 }
244
245 return s.client.Do(req, nil)
246 }
247
View as plain text