From f5d0d2549a2f5ea7e43d5cd25e582cbfbad3ca03 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Thu, 3 Dec 2020 17:38:58 +0300 Subject: [PATCH 1/2] ABP CLI: Use app-pro template by default if developer has an active license related https://github.com/volosoft/volo/issues/4193 --- .../Volo/Abp/Cli/Commands/NewCommand.cs | 9 ++- .../ProjectBuilding/ITemplateInfoProvider.cs | 5 +- .../ProjectBuilding/TemplateInfoProvider.cs | 61 ++++++++++++++++++- .../ProjectBuilding/TemplateProjectBuilder.cs | 6 +- 4 files changed, 72 insertions(+), 9 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs index 01807bc0ff..75d2651cbc 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs @@ -3,18 +3,22 @@ using System.Diagnostics; using System.IO; using System.Runtime.InteropServices; using System.Text; +using System.Text.Json; using System.Threading.Tasks; using ICSharpCode.SharpZipLib.Core; using ICSharpCode.SharpZipLib.Zip; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Volo.Abp.Cli.Args; +using Volo.Abp.Cli.Auth; +using Volo.Abp.Cli.Http; using Volo.Abp.Cli.ProjectBuilding; using Volo.Abp.Cli.ProjectBuilding.Building; using Volo.Abp.Cli.ProjectBuilding.Templates.App; using Volo.Abp.Cli.ProjectBuilding.Templates.Console; using Volo.Abp.Cli.Utils; using Volo.Abp.DependencyInjection; +using Volo.Abp.Threading; namespace Volo.Abp.Cli.Commands { @@ -25,7 +29,8 @@ namespace Volo.Abp.Cli.Commands protected TemplateProjectBuilder TemplateProjectBuilder { get; } public ITemplateInfoProvider TemplateInfoProvider { get; } - public NewCommand(TemplateProjectBuilder templateProjectBuilder, ITemplateInfoProvider templateInfoProvider) + public NewCommand(TemplateProjectBuilder templateProjectBuilder + , ITemplateInfoProvider templateInfoProvider) { TemplateProjectBuilder = templateProjectBuilder; TemplateInfoProvider = templateInfoProvider; @@ -193,7 +198,7 @@ namespace Volo.Abp.Cli.Commands Logger.LogInformation($"'{projectName}' has been successfully created to '{outputFolder}'"); - if (AppTemplateBase.IsAppTemplate(template ?? TemplateInfoProvider.GetDefault().Name)) + if (AppTemplateBase.IsAppTemplate(template ?? (await TemplateInfoProvider.GetDefaultAsync()).Name)) { var isCommercial = template == AppProTemplate.TemplateName; OpenThanksPage(uiFramework, databaseProvider, isTiered || commandLineArgs.Options.ContainsKey("separate-identity-server"), isCommercial); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ITemplateInfoProvider.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ITemplateInfoProvider.cs index 5330bc9962..55db4cd11a 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ITemplateInfoProvider.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ITemplateInfoProvider.cs @@ -1,10 +1,11 @@ -using Volo.Abp.Cli.ProjectBuilding.Building; +using System.Threading.Tasks; +using Volo.Abp.Cli.ProjectBuilding.Building; namespace Volo.Abp.Cli.ProjectBuilding { public interface ITemplateInfoProvider { - TemplateInfo GetDefault(); + Task GetDefaultAsync(); TemplateInfo Get(string name); } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateInfoProvider.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateInfoProvider.cs index 7a4df335fe..269795d4a4 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateInfoProvider.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateInfoProvider.cs @@ -1,18 +1,44 @@ using System; +using System.Text.Json; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Volo.Abp.Cli.Auth; +using Volo.Abp.Cli.Http; using Volo.Abp.Cli.ProjectBuilding.Building; using Volo.Abp.Cli.ProjectBuilding.Templates.App; using Volo.Abp.Cli.ProjectBuilding.Templates.Console; using Volo.Abp.Cli.ProjectBuilding.Templates.MvcModule; using Volo.Abp.Cli.ProjectBuilding.Templates.Wpf; using Volo.Abp.DependencyInjection; +using Volo.Abp.Threading; namespace Volo.Abp.Cli.ProjectBuilding { public class TemplateInfoProvider : ITemplateInfoProvider, ITransientDependency { - public TemplateInfo GetDefault() + public ILogger Logger { get; set; } + + public ICancellationTokenProvider CancellationTokenProvider { get; } + public IRemoteServiceExceptionHandler RemoteServiceExceptionHandler { get; } + public AuthService AuthService { get; } + + public TemplateInfoProvider(ICancellationTokenProvider cancellationTokenProvider, + IRemoteServiceExceptionHandler remoteServiceExceptionHandler, + AuthService authService) { - return Get(AppTemplate.TemplateName); + CancellationTokenProvider = cancellationTokenProvider; + RemoteServiceExceptionHandler = remoteServiceExceptionHandler; + AuthService = authService; + + Logger = NullLogger.Instance; + } + + public async Task GetDefaultAsync() + { + var defaultTemplateName = await CheckProLicenseAsync() ? AppProTemplate.TemplateName : AppTemplate.TemplateName; + + return Get(defaultTemplateName); } public TemplateInfo Get(string name) @@ -35,5 +61,36 @@ namespace Volo.Abp.Cli.ProjectBuilding throw new Exception("There is no template found with given name: " + name); } } + + + private async Task CheckProLicenseAsync() + { + if (!AuthService.IsLoggedIn()) + { + return false; + } + + var url = $"{CliUrls.WwwAbpIo}api/license/check-user"; + + using (var client = new CliHttpClient()) + { + var response = await client.GetHttpResponseMessageWithRetryAsync( + url, + CancellationTokenProvider.Token, + Logger); + + if (!response.IsSuccessStatusCode) + { + throw new Exception($"ERROR: Remote server returns '{response.StatusCode}'"); + } + + await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(response); + + var responseContent = await response.Content.ReadAsStringAsync(); + var result = JsonSerializer.Deserialize(responseContent); + + return result; + } + } } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateProjectBuilder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateProjectBuilder.cs index 02b26eba39..cbbb094d11 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateProjectBuilder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateProjectBuilder.cs @@ -49,7 +49,7 @@ namespace Volo.Abp.Cli.ProjectBuilding public async Task BuildAsync(ProjectBuildArgs args) { - var templateInfo = GetTemplateInfo(args); + var templateInfo = await GetTemplateInfoAsync(args); NormalizeArgs(args, templateInfo); @@ -175,11 +175,11 @@ namespace Volo.Abp.Cli.ProjectBuilding } } - private TemplateInfo GetTemplateInfo(ProjectBuildArgs args) + private async Task GetTemplateInfoAsync(ProjectBuildArgs args) { if (args.TemplateName.IsNullOrWhiteSpace()) { - return TemplateInfoProvider.GetDefault(); + return await TemplateInfoProvider.GetDefaultAsync(); } else { From c45dc236c341c41152cc7e3047d25db35bf8e22b Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Fri, 4 Dec 2020 10:00:44 +0300 Subject: [PATCH 2/2] cli TemplateInfoProvider added try-catch --- .../ProjectBuilding/TemplateInfoProvider.cs | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateInfoProvider.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateInfoProvider.cs index 269795d4a4..b69e898068 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateInfoProvider.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateInfoProvider.cs @@ -70,26 +70,33 @@ namespace Volo.Abp.Cli.ProjectBuilding return false; } - var url = $"{CliUrls.WwwAbpIo}api/license/check-user"; - - using (var client = new CliHttpClient()) + try { - var response = await client.GetHttpResponseMessageWithRetryAsync( - url, - CancellationTokenProvider.Token, - Logger); + var url = $"{CliUrls.WwwAbpIo}api/license/check-user"; - if (!response.IsSuccessStatusCode) + using (var client = new CliHttpClient()) { - throw new Exception($"ERROR: Remote server returns '{response.StatusCode}'"); - } + var response = await client.GetHttpResponseMessageWithRetryAsync( + url, + CancellationTokenProvider.Token, + Logger); - await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(response); + if (!response.IsSuccessStatusCode) + { + throw new Exception($"ERROR: Remote server returns '{response.StatusCode}'"); + } - var responseContent = await response.Content.ReadAsStringAsync(); - var result = JsonSerializer.Deserialize(responseContent); + await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(response); - return result; + var responseContent = await response.Content.ReadAsStringAsync(); + var result = JsonSerializer.Deserialize(responseContent); + + return result; + } + } + catch (Exception) + { + return false; } } }