diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliUrls.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliUrls.cs index 83ae5a9f73..35ae34b895 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliUrls.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliUrls.cs @@ -29,6 +29,11 @@ public static class CliUrls return $"{NuGetRootPath}{apiKey}/v3/package/{packageId}/index.json"; } + public static string GetNuGetPackageSearchUrl(string apiKey, string packageId) + { + return $"{NuGetRootPath}{apiKey}/v3/search?q={packageId}"; + } + public static string GetApiDefinitionUrl(string url, ApplicationApiDescriptionModelRequestDto model = null) { url = url.EnsureEndsWith('/'); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CommercialPackages.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CommercialPackages.cs index e99eddb499..7bfb578a2d 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CommercialPackages.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CommercialPackages.cs @@ -4,9 +4,9 @@ using System.Text; namespace Volo.Abp.Cli.Version; -internal static class CommercialPackages +static internal class CommercialPackages { - private static readonly HashSet Packages = new() + private readonly static HashSet Packages = new() { "volo.abp.suite" //other PRO packages can be added to this list... diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/PackageVersionCheckerService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/PackageVersionCheckerService.cs index 43ced1a1a1..de8511cdca 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/PackageVersionCheckerService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/PackageVersionCheckerService.cs @@ -109,20 +109,54 @@ public class PackageVersionCheckerService : ITransientDependency return await GetPackageVersionsFromMyGet(packageId); } - if (CommercialPackages.IsCommercial(packageId)) + if (await IsCommercialPackageAsync(packageId)) { return await GetPackageVersionsFromAbpCommercialNuGetAsync(packageId); } - else + + return await GetPackageVersionsFromNuGetOrgAsync(packageId) ?? new List(); + } + + private async Task IsCommercialPackageAsync(string packageId) + { + if (CommercialPackages.IsCommercial(packageId)) + { + return true; + } + + await SetApiKeyResultAsync(); + if (_apiKeyResult?.ApiKey == null) { - var packagesFromNugetOrg = await GetPackageVersionsFromNuGetOrgAsync(packageId); - if (packagesFromNugetOrg != null) + return false; + } + + var searchUrl = CliUrls.GetNuGetPackageSearchUrl(_apiKeyResult.ApiKey, packageId); + return await HasAnyPackageAsync(searchUrl); + } + + private async Task HasAnyPackageAsync(string url) + { + try + { + var client = _cliHttpClientFactory.CreateClient(needsAuthentication: false); + + using (var responseMessage = await client.GetHttpResponseMessageWithRetryAsync( + url, + cancellationToken: CancellationTokenProvider.Token, + logger: Logger + )) { - return packagesFromNugetOrg; + await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(responseMessage); + + var responseContent = await responseMessage.Content.ReadAsStringAsync(); + + return JsonSerializer.Deserialize(responseContent).TotalHits > 0; } } - - return await GetPackageVersionsFromAbpCommercialNuGetAsync(packageId); + catch (Exception) + { + return false; + } } private async Task> GetPackageVersionsFromAbpCommercialNuGetAsync(string packageId) @@ -175,19 +209,15 @@ public class PackageVersionCheckerService : ITransientDependency private async Task GetNuGetUrlForCommercialPackage(string packageId) { - if (_apiKeyResult == null) - { - _apiKeyResult = await _apiKeyService.GetApiKeyOrNullAsync(); - - if (_apiKeyResult == null) - { - return null; - } - } - + await SetApiKeyResultAsync(); return CliUrls.GetNuGetPackageInfoUrl(_apiKeyResult.ApiKey, packageId); } + private async Task SetApiKeyResultAsync() + { + _apiKeyResult ??= await _apiKeyService.GetApiKeyOrNullAsync(); + } + private async Task GetLatestStableVersionOrNullAsync() { try @@ -214,6 +244,12 @@ public class PackageVersionCheckerService : ITransientDependency } } + public class NuGetSearchResultDto + { + [JsonProperty("totalHits")] + public int TotalHits { get; set; } + } + public class NuGetVersionResultDto { [JsonProperty("versions")]