From 480807560d17c96cf938dcc985b3b53b13a77c3d Mon Sep 17 00:00:00 2001 From: Phil Bastian Date: Tue, 9 Jun 2026 08:08:26 +0800 Subject: [PATCH 1/3] provide licensed endpoint information to SP --- src/Directory.Packages.props | 6 +++--- src/ServiceControl.LicenseManagement/LicenseDetails.cs | 2 ++ src/ServiceControl/Licensing/LicenseController.cs | 7 +++++++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index dc547f12b3..bc85572935 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -52,7 +52,7 @@ - + @@ -62,7 +62,7 @@ - + @@ -94,4 +94,4 @@ - + \ No newline at end of file diff --git a/src/ServiceControl.LicenseManagement/LicenseDetails.cs b/src/ServiceControl.LicenseManagement/LicenseDetails.cs index 64c68832ed..580fea21f6 100644 --- a/src/ServiceControl.LicenseManagement/LicenseDetails.cs +++ b/src/ServiceControl.LicenseManagement/LicenseDetails.cs @@ -24,6 +24,7 @@ public class LicenseDetails public bool WarnUserUpgradeProtectionIsExpiring { get; private init; } public bool WarnUserUpgradeProtectionHasExpired { get; private init; } public string Status { get; private init; } + public LicensedProduct[] Products { get; private init; } public static LicenseDetails TrialFromEndDate(DateOnly endDate) { @@ -64,6 +65,7 @@ internal static LicenseDetails FromLicense(License license) IsTrialLicense = license.IsTrialLicense, LicenseType = license.LicenseType, Edition = license.Edition, + Products = license.Products, ValidForServiceControl = license.ValidForApplication("ServiceControl"), DaysUntilSubscriptionExpires = license.GetDaysUntilLicenseExpires(), DaysUntilUpgradeProtectionExpires = license.GetDaysUntilUpgradeProtectionExpires(), diff --git a/src/ServiceControl/Licensing/LicenseController.cs b/src/ServiceControl/Licensing/LicenseController.cs index 15539d9db0..41ea837757 100644 --- a/src/ServiceControl/Licensing/LicenseController.cs +++ b/src/ServiceControl/Licensing/LicenseController.cs @@ -1,9 +1,12 @@ namespace ServiceControl.Licensing { + using System.Linq; + using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Monitoring.HeartbeatMonitoring; + using Particular.Licensing; using Particular.ServiceControl.Licensing; using ServiceBus.Management.Infrastructure.Settings; @@ -31,6 +34,8 @@ public async Task> License(bool refresh, string client LicenseType = activeLicense.Details.LicenseType ?? string.Empty, InstanceName = settings.InstanceName ?? string.Empty, LicenseStatus = activeLicense.Details.Status, + //strip any internal prefix from what gets displayed to the customer + Products = activeLicense.Details.Products?.Select(product => product with { Size = product.Size.EndsWith("U") ? "Unlimited" : Regex.Replace(product.Size, @"^\D*", "") }).ToArray(), LicenseExtensionUrl = connectorHeartbeatStatus.LastHeartbeat == null ? $"https://particular.net/extend-your-trial?p={clientName}" : $"https://particular.net/license/mt?p={clientName}&t={(activeLicense.IsEvaluation ? 0 : 1)}" @@ -53,6 +58,8 @@ public class LicenseInfo public string Status { get; set; } + public LicensedProduct[] Products { get; set; } + public string LicenseType { get; set; } public string InstanceName { get; set; } From 5bebc804b0485e0f7f3c3b783a9864f3d4e3712b Mon Sep 17 00:00:00 2001 From: Phil Bastian Date: Thu, 11 Jun 2026 10:48:25 +0800 Subject: [PATCH 2/3] update to released package with internal type --- src/Directory.Packages.props | 2 +- src/ServiceControl.LicenseManagement/LicenseDetails.cs | 7 ++++++- src/ServiceControl/Licensing/LicenseController.cs | 5 ++--- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index bc85572935..42c61c0a9e 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -62,7 +62,7 @@ - + diff --git a/src/ServiceControl.LicenseManagement/LicenseDetails.cs b/src/ServiceControl.LicenseManagement/LicenseDetails.cs index 580fea21f6..eab2cf5015 100644 --- a/src/ServiceControl.LicenseManagement/LicenseDetails.cs +++ b/src/ServiceControl.LicenseManagement/LicenseDetails.cs @@ -1,6 +1,8 @@ namespace ServiceControl.LicenseManagement { using System; + using System.Linq; + using System.Text.RegularExpressions; using Particular.Licensing; public class LicenseDetails @@ -65,7 +67,8 @@ internal static LicenseDetails FromLicense(License license) IsTrialLicense = license.IsTrialLicense, LicenseType = license.LicenseType, Edition = license.Edition, - Products = license.Products, + //strip any internal prefix from what gets displayed to the customer + Products = license.LicensedEndpoints?.Select(le => new LicensedProduct(le.Size.EndsWith("U") ? "Unlimited" : Regex.Replace(le.Size, @"^\D*", ""), le.Quantity)).ToArray(), ValidForServiceControl = license.ValidForApplication("ServiceControl"), DaysUntilSubscriptionExpires = license.GetDaysUntilLicenseExpires(), DaysUntilUpgradeProtectionExpires = license.GetDaysUntilUpgradeProtectionExpires(), @@ -97,4 +100,6 @@ static bool HasLicenseDateExpired(DateTime licenseDate) return oneDayGrace < DateTime.UtcNow.Date; } } + + public record LicensedProduct(string Name, int Quantity); } \ No newline at end of file diff --git a/src/ServiceControl/Licensing/LicenseController.cs b/src/ServiceControl/Licensing/LicenseController.cs index 41ea837757..c2dc497551 100644 --- a/src/ServiceControl/Licensing/LicenseController.cs +++ b/src/ServiceControl/Licensing/LicenseController.cs @@ -6,9 +6,9 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Monitoring.HeartbeatMonitoring; - using Particular.Licensing; using Particular.ServiceControl.Licensing; using ServiceBus.Management.Infrastructure.Settings; + using ServiceControl.LicenseManagement; [ApiController] [Route("api")] @@ -34,8 +34,7 @@ public async Task> License(bool refresh, string client LicenseType = activeLicense.Details.LicenseType ?? string.Empty, InstanceName = settings.InstanceName ?? string.Empty, LicenseStatus = activeLicense.Details.Status, - //strip any internal prefix from what gets displayed to the customer - Products = activeLicense.Details.Products?.Select(product => product with { Size = product.Size.EndsWith("U") ? "Unlimited" : Regex.Replace(product.Size, @"^\D*", "") }).ToArray(), + Products = activeLicense.Details.Products, LicenseExtensionUrl = connectorHeartbeatStatus.LastHeartbeat == null ? $"https://particular.net/extend-your-trial?p={clientName}" : $"https://particular.net/license/mt?p={clientName}&t={(activeLicense.IsEvaluation ? 0 : 1)}" From 373f3c3b0f683d73b77f842404b44139766530eb Mon Sep 17 00:00:00 2001 From: Phil Bastian Date: Thu, 11 Jun 2026 10:57:50 +0800 Subject: [PATCH 3/3] remove unnecessary usings --- src/ServiceControl/Licensing/LicenseController.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/ServiceControl/Licensing/LicenseController.cs b/src/ServiceControl/Licensing/LicenseController.cs index c2dc497551..05029db055 100644 --- a/src/ServiceControl/Licensing/LicenseController.cs +++ b/src/ServiceControl/Licensing/LicenseController.cs @@ -1,7 +1,5 @@ namespace ServiceControl.Licensing { - using System.Linq; - using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc;