From 322ffb30b8ba8ec7bb7205c74bcb6a91bf03d3bb Mon Sep 17 00:00:00 2001 From: Loic Sharma Date: Mon, 26 Jul 2021 16:08:40 -0700 Subject: [PATCH] Add preview banner --- src/AccountDeleter/EmptyFeatureFlagService.cs | 5 +++ .../Fakes/FakeFeatureFlagService.cs | 5 +++ .../Configuration/FeatureFlagService.cs | 6 +++ .../Configuration/IFeatureFlagService.cs | 5 +++ .../App_Data/Files/Content/flags.json | 6 +++ .../Controllers/PackagesController.cs | 31 +++++++++++-- src/NuGetGallery/UrlHelperExtensions.cs | 18 +++++--- .../Views/Shared/Gallery/Header.cshtml | 31 ++++++++++++- .../Fakes/FakeFeatureFlagService.cs | 5 +++ .../Controllers/PackagesControllerFacts.cs | 43 +++++++++++++++---- .../UrlHelperExtensionsFacts.cs | 16 ++++--- 11 files changed, 147 insertions(+), 24 deletions(-) diff --git a/src/AccountDeleter/EmptyFeatureFlagService.cs b/src/AccountDeleter/EmptyFeatureFlagService.cs index 06ba5815e8..ba6778a17c 100644 --- a/src/AccountDeleter/EmptyFeatureFlagService.cs +++ b/src/AccountDeleter/EmptyFeatureFlagService.cs @@ -76,6 +76,11 @@ public bool IsDisplayPackagePageV2Enabled(User user) throw new NotImplementedException(); } + public bool IsDisplayPackagePageV2PreviewEnabled(User user) + { + throw new NotImplementedException(); + } + public bool IsDisplayVulnerabilitiesEnabled() { throw new NotImplementedException(); diff --git a/src/GitHubVulnerabilities2Db/Fakes/FakeFeatureFlagService.cs b/src/GitHubVulnerabilities2Db/Fakes/FakeFeatureFlagService.cs index f8fb740c96..997479b329 100644 --- a/src/GitHubVulnerabilities2Db/Fakes/FakeFeatureFlagService.cs +++ b/src/GitHubVulnerabilities2Db/Fakes/FakeFeatureFlagService.cs @@ -264,5 +264,10 @@ public bool IsDisplayNuGetPackageExplorerLinkEnabled() { throw new NotImplementedException(); } + + public bool IsDisplayPackagePageV2PreviewEnabled(User user) + { + throw new NotImplementedException(); + } } } \ No newline at end of file diff --git a/src/NuGetGallery.Services/Configuration/FeatureFlagService.cs b/src/NuGetGallery.Services/Configuration/FeatureFlagService.cs index 1ed101e7e0..36dded6f6d 100644 --- a/src/NuGetGallery.Services/Configuration/FeatureFlagService.cs +++ b/src/NuGetGallery.Services/Configuration/FeatureFlagService.cs @@ -49,6 +49,7 @@ public class FeatureFlagService : IFeatureFlagService private const string DeletePackageApiFlightName = GalleryPrefix + "DeletePackageApi"; private const string ImageAllowlistFlightName = GalleryPrefix + "ImageAllowlist"; private const string DisplayBannerFlightName = GalleryPrefix + "Banner"; + private const string DisplayPackagePageV2PreviewFeatureName = GalleryPrefix + "DisplayPackagePageV2Preview"; private const string DisplayPackagePageV2FeatureName = GalleryPrefix + "DisplayPackagePageV2"; private const string ShowReportAbuseSafetyChanges = GalleryPrefix + "ShowReportAbuseSafetyChanges"; @@ -246,6 +247,11 @@ public bool AreEmbeddedReadmesEnabled(User user) return _client.IsEnabled(EmbeddedReadmeFlightName, user, defaultValue: false); } + public bool IsDisplayPackagePageV2PreviewEnabled(User user) + { + return _client.IsEnabled(DisplayPackagePageV2PreviewFeatureName, user, defaultValue: false); + } + public bool IsDisplayPackagePageV2Enabled(User user) { return _client.IsEnabled(DisplayPackagePageV2FeatureName, user, defaultValue: false); diff --git a/src/NuGetGallery.Services/Configuration/IFeatureFlagService.cs b/src/NuGetGallery.Services/Configuration/IFeatureFlagService.cs index b599317175..697121bc2e 100644 --- a/src/NuGetGallery.Services/Configuration/IFeatureFlagService.cs +++ b/src/NuGetGallery.Services/Configuration/IFeatureFlagService.cs @@ -178,6 +178,11 @@ public interface IFeatureFlagService /// bool AreEmbeddedReadmesEnabled(User user); + /// + /// Whether the preview of the new design of the display package page is enabled. + /// + bool IsDisplayPackagePageV2PreviewEnabled(User user); + /// /// Whether the new design of the display package page is enabled. /// diff --git a/src/NuGetGallery/App_Data/Files/Content/flags.json b/src/NuGetGallery/App_Data/Files/Content/flags.json index c10b2fe873..a07f6e37c1 100644 --- a/src/NuGetGallery/App_Data/Files/Content/flags.json +++ b/src/NuGetGallery/App_Data/Files/Content/flags.json @@ -103,6 +103,12 @@ "SiteAdmins": false, "Accounts": [], "Domains": [] + }, + "NuGetGallery.DisplayPackagePageV2Preview": { + "All": true, + "SiteAdmins": false, + "Accounts": [], + "Domains": [] } } } \ No newline at end of file diff --git a/src/NuGetGallery/Controllers/PackagesController.cs b/src/NuGetGallery/Controllers/PackagesController.cs index 76e285933d..9a8d655292 100644 --- a/src/NuGetGallery/Controllers/PackagesController.cs +++ b/src/NuGetGallery/Controllers/PackagesController.cs @@ -872,7 +872,7 @@ public HttpStatusCodeResult DisplayPackage() => new HttpStatusCodeWithHeadersResult(HttpStatusCode.MethodNotAllowed, new NameValueCollection() { { "allow", "GET" } }); [HttpGet] - public virtual async Task DisplayPackage(string id, string version) + public virtual async Task DisplayPackage(string id, string version, string preview = null) { // Attempt to normalize the version but allow version strings that are not actually SemVer strings. For // example, "absoluteLatest" is allowed as the version string as a reference to the absolute latest version @@ -1034,7 +1034,28 @@ public virtual async Task DisplayPackage(string id, string version } ViewBag.FacebookAppID = _config.FacebookAppId; - if (_featureFlagService.IsDisplayPackagePageV2Enabled(GetCurrentUser())) + var enableRedesign = _featureFlagService.IsDisplayPackagePageV2Enabled(currentUser); + + if (_featureFlagService.IsDisplayPackagePageV2PreviewEnabled(currentUser)) + { + if (!string.IsNullOrEmpty(preview)) + { + enableRedesign = true; + } + + // If the user is on the current design, show the banner to preview the redesign. + // If the user is on the preview design, show the banner that links to the feedback survey. + ViewBag.ShowRedesignPreviewBanner = !enableRedesign; + ViewBag.ShowRedesignSurveyBanner = enableRedesign; + ViewBag.ShowRedesignUrl = Url.Package(package, preview: true); + } + else + { + ViewBag.ShowRedesignPreviewBanner = false; + ViewBag.ShowRedesignSurveyBanner = false; + } + + if (enableRedesign) { return View("DisplayPackageV2", model); } @@ -2986,7 +3007,11 @@ public virtual async Task GetReadMeMd(string id, string version) [ValidateAntiForgeryToken] public virtual async Task SetLicenseReportVisibility(string id, string version, bool visible) { - return await SetLicenseReportVisibility(id, version, visible, Url.Package); + return await SetLicenseReportVisibility( + id, + version, + visible, + (package, relativeUrl) => Url.Package(package, relativeUrl)); } internal virtual async Task SetLicenseReportVisibility(string id, string version, bool visible, Func urlFactory) diff --git a/src/NuGetGallery/UrlHelperExtensions.cs b/src/NuGetGallery/UrlHelperExtensions.cs index e903bef40d..9b6fdf6bdc 100644 --- a/src/NuGetGallery/UrlHelperExtensions.cs +++ b/src/NuGetGallery/UrlHelperExtensions.cs @@ -225,27 +225,33 @@ public static string Package( this UrlHelper url, string id, string version, - bool relativeUrl = true) + bool relativeUrl = true, + bool preview = false) { - string normalized = (version != null) ? NuGetVersionFormatter.Normalize(version) : version; + var normalized = (version != null) ? NuGetVersionFormatter.Normalize(version) : version; - string result = GetRouteLink( + var result = GetRouteLink( url, RouteName.DisplayPackage, relativeUrl, routeValues: new RouteValueDictionary { { "id", id }, - { "version", normalized } + { "version", normalized }, + { "preview", preview ? "1" : null } }); // Ensure trailing slashes for versionless package URLs, as a fix for package filenames that look like known file extensions return version == null ? EnsureTrailingSlash(result) : result; } - public static string Package(this UrlHelper url, Package package, bool relativeUrl = true) + public static string Package( + this UrlHelper url, + Package package, + bool relativeUrl = true, + bool preview = false) { - return url.Package(package.PackageRegistration.Id, package.NormalizedVersion, relativeUrl); + return url.Package(package.PackageRegistration.Id, package.NormalizedVersion, relativeUrl, preview); } public static string Package(this UrlHelper url, IPackageVersionModel package, bool relativeUrl = true) diff --git a/src/NuGetGallery/Views/Shared/Gallery/Header.cshtml b/src/NuGetGallery/Views/Shared/Gallery/Header.cshtml index e5814935a5..acfb43b185 100644 --- a/src/NuGetGallery/Views/Shared/Gallery/Header.cshtml +++ b/src/NuGetGallery/Views/Shared/Gallery/Header.cshtml @@ -22,7 +22,7 @@ } -@if (ViewBag.DisplayBanner == true) +@if (ViewBag.DisplayBanner == true) {