Skip to content

Commit 03e16e4

Browse files
author
Scott Bommarito
authored
Add feature flag for deprecating a package with many versions (#7285)
1 parent 3ab980e commit 03e16e4

8 files changed

Lines changed: 218 additions & 102 deletions

File tree

src/NuGetGallery/Controllers/ManageDeprecationJsonApiController.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,6 @@ public virtual async Task<JsonResult> Deprecate(
8181
status |= PackageDeprecationStatus.Other;
8282
}
8383

84-
var currentUser = GetCurrentUser();
85-
if (!_featureFlagService.IsManageDeprecationEnabled(GetCurrentUser()))
86-
{
87-
return DeprecateErrorResponse(HttpStatusCode.Forbidden, Strings.DeprecatePackage_Forbidden);
88-
}
89-
9084
if (versions == null || !versions.Any())
9185
{
9286
return DeprecateErrorResponse(HttpStatusCode.BadRequest, Strings.DeprecatePackage_NoVersions);
@@ -102,6 +96,12 @@ public virtual async Task<JsonResult> Deprecate(
10296
string.Format(Strings.DeprecatePackage_MissingRegistration, id));
10397
}
10498

99+
var currentUser = GetCurrentUser();
100+
if (!_featureFlagService.IsManageDeprecationEnabled(GetCurrentUser(), registration))
101+
{
102+
return DeprecateErrorResponse(HttpStatusCode.Forbidden, Strings.DeprecatePackage_Forbidden);
103+
}
104+
105105
if (ActionsRequiringPermissions.DeprecatePackage.CheckPermissionsOnBehalfOfAnyAccount(currentUser, registration) != PermissionsCheckResult.Allowed)
106106
{
107107
return DeprecateErrorResponse(HttpStatusCode.Forbidden, Strings.DeprecatePackage_Forbidden);

src/NuGetGallery/Controllers/PackagesController.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -751,7 +751,7 @@ public virtual async Task<ActionResult> DisplayPackage(string id, string version
751751
model.SymbolsPackageValidationIssues = _validationService.GetLatestPackageValidationIssues(model.LatestSymbolsPackage);
752752
model.IsCertificatesUIEnabled = _contentObjectService.CertificatesConfiguration?.IsUIEnabledForUser(currentUser) ?? false;
753753
model.IsAtomFeedEnabled = _featureFlagService.IsPackagesAtomFeedEnabled();
754-
model.IsPackageDeprecationEnabled = _featureFlagService.IsManageDeprecationEnabled(currentUser);
754+
model.IsPackageDeprecationEnabled = _featureFlagService.IsManageDeprecationEnabled(currentUser, package.PackageRegistration);
755755

756756
if(model.IsGitHubUsageEnabled = _featureFlagService.IsGitHubUsageEnabled(currentUser))
757757
{
@@ -1467,6 +1467,7 @@ public virtual async Task<ActionResult> Manage(string id, string version = null)
14671467
// Load all versions of the package.
14681468
var packages = _packageService.FindPackagesById(
14691469
id, PackageDeprecationFieldsToInclude.DeprecationAndRelationships);
1470+
14701471
if (version != null)
14711472
{
14721473
// Try to find the exact version if it was specified.
@@ -1492,7 +1493,7 @@ public virtual async Task<ActionResult> Manage(string id, string version = null)
14921493
ReportMyPackageReasons,
14931494
Url,
14941495
await _readMeService.GetReadMeMdAsync(package),
1495-
_featureFlagService.IsManageDeprecationEnabled(currentUser));
1496+
_featureFlagService.IsManageDeprecationEnabled(currentUser, package.PackageRegistration));
14961497

14971498
if (!model.CanEdit && !model.CanManageOwners && !model.CanUnlistOrRelist)
14981499
{

src/NuGetGallery/Services/FeatureFlagService.cs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33

44
using System;
5+
using System.Linq;
56
using NuGet.Services.Entities;
67
using NuGet.Services.FeatureFlags;
78
using NuGetGallery.Features;
@@ -22,6 +23,7 @@ public class FeatureFlagService : IFeatureFlagService
2223
private const string PackagesAtomFeedFeatureName = GalleryPrefix + "PackagesAtomFeed";
2324

2425
private const string ManageDeprecationFeatureName = GalleryPrefix + "ManageDeprecation";
26+
private const string ManageDeprecationForManyVersionsFeatureName = GalleryPrefix + "ManageDeprecationMany";
2527
private const string ODataReadOnlyDatabaseFeatureName = GalleryPrefix + "ODataReadOnlyDatabase";
2628

2729
private readonly IFeatureFlagClient _client;
@@ -46,9 +48,20 @@ public bool IsPackagesAtomFeedEnabled()
4648
return _client.IsEnabled(PackagesAtomFeedFeatureName, defaultValue: false);
4749
}
4850

49-
public bool IsManageDeprecationEnabled(User user)
51+
/// <summary>
52+
/// The number of versions a package needs to have before it should be flighted using <see cref="ManageDeprecationForManyVersionsFeatureName"/> instead of <see cref="ManageDeprecationFeatureName"/>.
53+
/// </summary>
54+
private const int _manageDeprecationForManyVersionsThreshold = 500;
55+
56+
public bool IsManageDeprecationEnabled(User user, PackageRegistration registration)
5057
{
51-
return _client.IsEnabled(ManageDeprecationFeatureName, user, defaultValue: false);
58+
if (!_client.IsEnabled(ManageDeprecationFeatureName, user, defaultValue: false))
59+
{
60+
return false;
61+
}
62+
63+
return registration.Packages.Count() < _manageDeprecationForManyVersionsThreshold
64+
|| _client.IsEnabled(ManageDeprecationForManyVersionsFeatureName, user, defaultValue: true);
5265
}
5366

5467
public bool AreEmbeddedIconsEnabled(User user)

src/NuGetGallery/Services/IFeatureFlagService.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,7 @@ public interface IFeatureFlagService
3333
/// Whether or not users can manage their package's deprecation state.
3434
/// If disabled,
3535
/// </summary>
36-
/// <param name="user"></param>
37-
/// <returns></returns>
38-
bool IsManageDeprecationEnabled(User user);
36+
bool IsManageDeprecationEnabled(User user, PackageRegistration registration);
3937

4038
/// <summary>
4139
/// Whether the user is allowed to publish packages with an embedded icon.

0 commit comments

Comments
 (0)