From f5d0d2549a2f5ea7e43d5cd25e582cbfbad3ca03 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Thu, 3 Dec 2020 17:38:58 +0300 Subject: [PATCH] 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 {