-
Notifications
You must be signed in to change notification settings - Fork 645
/
Copy pathFeatureFlagService.cs
300 lines (247 loc) · 12.9 KB
/
FeatureFlagService.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.Linq;
using NuGet.Services.Entities;
using NuGet.Services.FeatureFlags;
using NuGetGallery.Features;
namespace NuGetGallery
{
public class FeatureFlagService : IFeatureFlagService
{
private const string GalleryPrefix = "NuGetGallery.";
private const string ABTestingFlightName = GalleryPrefix + "ABTesting";
private const string AsyncAccountDeleteFeatureName = GalleryPrefix + "AsyncAccountDelete";
private const string SelfServiceAccountDeleteFeatureName = GalleryPrefix + "SelfServiceAccountDelete";
private const string EmbeddedIconFlightName = GalleryPrefix + "EmbeddedIcons";
private const string ForceFlatContainerIconsFeatureName = GalleryPrefix + "ForceFlatContainerIcons";
private const string GitHubUsageFlightName = GalleryPrefix + "GitHubUsage";
private const string AdvancedSearchFlightName = GalleryPrefix + "AdvancedSearch";
private const string PackageDependentsFlightName = GalleryPrefix + "PackageDependents";
private const string ManageDeprecationFeatureName = GalleryPrefix + "ManageDeprecation";
private const string ManageDeprecationForManyVersionsFeatureName = GalleryPrefix + "ManageDeprecationMany";
private const string ManageDeprecationApiFeatureName = GalleryPrefix + "ManageDeprecationApi";
private const string ODataReadOnlyDatabaseFeatureName = GalleryPrefix + "ODataReadOnlyDatabase";
private const string PackagesAtomFeedFeatureName = GalleryPrefix + "PackagesAtomFeed";
private const string SearchSideBySideFlightName = GalleryPrefix + "SearchSideBySide";
private const string TyposquattingFeatureName = GalleryPrefix + "Typosquatting";
private const string TyposquattingFlightName = GalleryPrefix + "TyposquattingFlight";
private const string PreviewHijackFeatureName = GalleryPrefix + "PreviewHijack";
private const string GravatarProxyFeatureName = GalleryPrefix + "GravatarProxy";
private const string GravatarProxyEnSubdomainFeatureName = GalleryPrefix + "GravatarProxyEnSubdomain";
private const string ODataCacheDurationsFeatureName = GalleryPrefix + "ODataCacheDurations";
private const string ShowEnable2FADialog = GalleryPrefix + "ShowEnable2FADialog";
private const string Get2FADismissFeedback = GalleryPrefix + "Get2FADismissFeedback";
private const string UsabillaOnEveryPageFeatureName = GalleryPrefix + "UsabillaEveryPage";
private const string PackageRenamesFeatureName = GalleryPrefix + "PackageRenames";
private const string EmbeddedReadmeFlightName = GalleryPrefix + "EmbeddedReadmes";
private const string LicenseMdRenderingFlightName = GalleryPrefix + "LicenseMdRendering";
private const string MarkdigMdRenderingFlightName = GalleryPrefix + "MarkdigMdRendering";
private const string DeletePackageApiFlightName = GalleryPrefix + "DeletePackageApi";
private const string ODataV1GetAllNonHijackedFeatureName = GalleryPrefix + "ODataV1GetAllNonHijacked";
private const string ODataV1GetAllCountNonHijackedFeatureName = GalleryPrefix + "ODataV1GetAllCountNonHijacked";
private const string ODataV1GetSpecificNonHijackedFeatureName = GalleryPrefix + "ODataV1GetSpecificNonHijacked";
private const string ODataV1FindPackagesByIdNonHijackedFeatureName = GalleryPrefix + "ODataV1FindPackagesByIdNonHijacked";
private const string ODataV1FindPackagesByIdCountNonHijackedFeatureName = GalleryPrefix + "ODataV1FindPackagesByIdCountNonHijacked";
private const string ODataV1SearchNonHijackedFeatureName = GalleryPrefix + "ODataV1SearchNonHijacked";
private const string ODataV1SearchCountNonHijackedFeatureName = GalleryPrefix + "ODataV1SearchCountNonHijacked";
private const string ODataV2GetAllNonHijackedFeatureName = GalleryPrefix + "ODataV2GetAllNonHijacked";
private const string ODataV2GetAllCountNonHijackedFeatureName = GalleryPrefix + "ODataV2GetAllCountNonHijacked";
private const string ODataV2GetSpecificNonHijackedFeatureName = GalleryPrefix + "ODataV2GetSpecificNonHijacked";
private const string ODataV2FindPackagesByIdNonHijackedFeatureName = GalleryPrefix + "ODataV2FindPackagesByIdNonHijacked";
private const string ODataV2FindPackagesByIdCountNonHijackedFeatureName = GalleryPrefix + "ODataV2FindPackagesByIdCountNonHijacked";
private const string ODataV2SearchNonHijackedFeatureName = GalleryPrefix + "ODataV2SearchNonHijacked";
private const string ODataV2SearchCountNonHijackedFeatureName = GalleryPrefix + "ODataV2SearchCountNonHijacked";
private readonly IFeatureFlagClient _client;
public FeatureFlagService(IFeatureFlagClient client)
{
_client = client ?? throw new ArgumentNullException(nameof(client));
}
public bool IsAsyncAccountDeleteEnabled()
{
return _client.IsEnabled(AsyncAccountDeleteFeatureName, defaultValue: false);
}
public bool IsSelfServiceAccountDeleteEnabled()
{
return _client.IsEnabled(SelfServiceAccountDeleteFeatureName, defaultValue: false);
}
public bool IsTyposquattingEnabled()
{
return _client.IsEnabled(TyposquattingFeatureName, defaultValue: false);
}
public bool IsTyposquattingEnabled(User user)
{
return _client.IsEnabled(TyposquattingFlightName, user, defaultValue: false);
}
public bool IsPackagesAtomFeedEnabled()
{
return _client.IsEnabled(PackagesAtomFeedFeatureName, defaultValue: false);
}
/// <summary>
/// The number of versions a package needs to have before it should be flighted using <see cref="ManageDeprecationForManyVersionsFeatureName"/> instead of <see cref="ManageDeprecationFeatureName"/>.
/// </summary>
private const int _manageDeprecationForManyVersionsThreshold = 500;
public bool IsManageDeprecationEnabled(User user, PackageRegistration registration)
{
if (registration == null)
{
throw new ArgumentNullException(nameof(registration));
}
return IsManageDeprecationEnabled(user, registration.Packages);
}
public bool IsManageDeprecationEnabled(User user, IEnumerable<Package> allVersions)
{
if (allVersions == null)
{
throw new ArgumentNullException(nameof(allVersions));
}
if (!_client.IsEnabled(ManageDeprecationFeatureName, user, defaultValue: false))
{
return false;
}
return allVersions.Count() < _manageDeprecationForManyVersionsThreshold
|| _client.IsEnabled(ManageDeprecationForManyVersionsFeatureName, user, defaultValue: true);
}
public bool IsManageDeprecationApiEnabled(User user)
{
return _client.IsEnabled(ManageDeprecationApiFeatureName, user, defaultValue: false);
}
public bool AreEmbeddedIconsEnabled(User user)
{
return _client.IsEnabled(EmbeddedIconFlightName, user, defaultValue: false);
}
public bool IsForceFlatContainerIconsEnabled()
{
return _client.IsEnabled(ForceFlatContainerIconsFeatureName, defaultValue: false);
}
public bool IsODataDatabaseReadOnlyEnabled()
{
return _client.IsEnabled(ODataReadOnlyDatabaseFeatureName, defaultValue: false);
}
public bool IsSearchSideBySideEnabled(User user)
{
return _client.IsEnabled(SearchSideBySideFlightName, user, defaultValue: false);
}
public bool IsGitHubUsageEnabled(User user)
{
return _client.IsEnabled(GitHubUsageFlightName, user, defaultValue: false);
}
public bool IsAdvancedSearchEnabled(User user)
{
return _client.IsEnabled(AdvancedSearchFlightName, user, defaultValue: false);
}
public bool IsPackageDependentsEnabled(User user)
{
return _client.IsEnabled(PackageDependentsFlightName, user, defaultValue: false);
}
public bool IsABTestingEnabled(User user)
{
return _client.IsEnabled(ABTestingFlightName, user, defaultValue: false);
}
public bool IsPreviewHijackEnabled()
{
return _client.IsEnabled(PreviewHijackFeatureName, defaultValue: false);
}
public bool IsGravatarProxyEnabled()
{
return _client.IsEnabled(GravatarProxyFeatureName, defaultValue: false);
}
public bool ProxyGravatarEnSubdomain()
{
return _client.IsEnabled(GravatarProxyEnSubdomainFeatureName, defaultValue: false);
}
public bool AreDynamicODataCacheDurationsEnabled()
{
return _client.IsEnabled(ODataCacheDurationsFeatureName, defaultValue: false);
}
public bool IsShowEnable2FADialogEnabled()
{
return _client.IsEnabled(ShowEnable2FADialog, defaultValue: false);
}
public bool IsGet2FADismissFeedbackEnabled()
{
return _client.IsEnabled(Get2FADismissFeedback, defaultValue: false);
}
public bool IsUsabillaButtonEnabledOnEveryPage()
{
return _client.IsEnabled(UsabillaOnEveryPageFeatureName, defaultValue: false);
}
public bool IsPackageRenamesEnabled(User user)
{
return _client.IsEnabled(PackageRenamesFeatureName, user, defaultValue: false);
}
public bool AreEmbeddedReadmesEnabled(User user)
{
return _client.IsEnabled(EmbeddedReadmeFlightName, user, defaultValue: false);
}
public bool IsODataV1GetAllEnabled()
{
return _client.IsEnabled(ODataV1GetAllNonHijackedFeatureName, defaultValue: true);
}
public bool IsODataV1GetAllCountEnabled()
{
return _client.IsEnabled(ODataV1GetAllCountNonHijackedFeatureName, defaultValue: true);
}
public bool IsODataV1GetSpecificNonHijackedEnabled()
{
return _client.IsEnabled(ODataV1GetSpecificNonHijackedFeatureName, defaultValue: true);
}
public bool IsODataV1FindPackagesByIdNonHijackedEnabled()
{
return _client.IsEnabled(ODataV1FindPackagesByIdNonHijackedFeatureName, defaultValue: true);
}
public bool IsODataV1FindPackagesByIdCountNonHijackedEnabled()
{
return _client.IsEnabled(ODataV1FindPackagesByIdCountNonHijackedFeatureName, defaultValue: true);
}
public bool IsODataV1SearchNonHijackedEnabled()
{
return _client.IsEnabled(ODataV1SearchNonHijackedFeatureName, defaultValue: true);
}
public bool IsODataV1SearchCountNonHijackedEnabled()
{
return _client.IsEnabled(ODataV1SearchCountNonHijackedFeatureName, defaultValue: true);
}
public bool IsODataV2GetAllNonHijackedEnabled()
{
return _client.IsEnabled(ODataV2GetAllNonHijackedFeatureName, defaultValue: true);
}
public bool IsODataV2GetAllCountNonHijackedEnabled()
{
return _client.IsEnabled(ODataV2GetAllCountNonHijackedFeatureName, defaultValue: true);
}
public bool IsODataV2GetSpecificNonHijackedEnabled()
{
return _client.IsEnabled(ODataV2GetSpecificNonHijackedFeatureName, defaultValue: true);
}
public bool IsODataV2FindPackagesByIdNonHijackedEnabled()
{
return _client.IsEnabled(ODataV2FindPackagesByIdNonHijackedFeatureName, defaultValue: true);
}
public bool IsODataV2FindPackagesByIdCountNonHijackedEnabled()
{
return _client.IsEnabled(ODataV2FindPackagesByIdCountNonHijackedFeatureName, defaultValue: true);
}
public bool IsODataV2SearchNonHijackedEnabled()
{
return _client.IsEnabled(ODataV2SearchNonHijackedFeatureName, defaultValue: true);
}
public bool IsLicenseMdRenderingEnabled(User user)
{
return _client.IsEnabled(LicenseMdRenderingFlightName, user, defaultValue: false);
}
public bool IsODataV2SearchCountNonHijackedEnabled()
{
return _client.IsEnabled(ODataV2SearchCountNonHijackedFeatureName, defaultValue: true);
}
public bool IsMarkdigMdRenderingEnabled()
{
return _client.IsEnabled(MarkdigMdRenderingFlightName, defaultValue: false);
}
public bool IsDeletePackageApiEnabled(User user)
{
return _client.IsEnabled(DeletePackageApiFlightName, user, defaultValue: false);
}
}
}