From 1f7ebb721e568d8137329136d5ba965fb18131b4 Mon Sep 17 00:00:00 2001 From: mircotamburini Date: Wed, 8 Mar 2023 21:56:50 +0100 Subject: [PATCH 1/2] Implement Customize SqlClientFactory with discovery database types --- .../SqlCommand/ExecuteSqlCommand.cs | 29 +++++++++++++++++-- .../Activities/SqlQuery/ExecuteSqlQuery.cs | 29 +++++++++++++++---- .../Extensions/ServiceCollectionExtensions.cs | 10 +++++-- .../Factory/ISqlClientFactory.cs | 3 ++ .../Factory/SqlClientFactory.cs | 3 ++ 5 files changed, 64 insertions(+), 10 deletions(-) diff --git a/src/activities/Elsa.Activities.Sql/Activities/SqlCommand/ExecuteSqlCommand.cs b/src/activities/Elsa.Activities.Sql/Activities/SqlCommand/ExecuteSqlCommand.cs index 6bc6430509..25feb7553a 100644 --- a/src/activities/Elsa.Activities.Sql/Activities/SqlCommand/ExecuteSqlCommand.cs +++ b/src/activities/Elsa.Activities.Sql/Activities/SqlCommand/ExecuteSqlCommand.cs @@ -4,8 +4,15 @@ using Elsa.Attributes; using Elsa.Design; using Elsa.Expressions; +using Elsa.Metadata; using Elsa.Services; using Elsa.Services.Models; +using MediatR; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Threading; +using System.Threading.Tasks; namespace Elsa.Activities.Sql.Activities { @@ -18,7 +25,7 @@ namespace Elsa.Activities.Sql.Activities Description = "Execute given SQL command and returned number of rows affected", Outcomes = new[] { OutcomeNames.Done } )] - public class ExecuteSqlCommand : Activity + public class ExecuteSqlCommand : Activity, IActivityPropertyOptionsProvider, IRuntimeSelectListProvider { /// /// Allowed databases to run SQL @@ -26,11 +33,25 @@ public class ExecuteSqlCommand : Activity [ActivityInput( UIHint = ActivityInputUIHints.Dropdown, Hint = "Allowed databases to run SQL.", - Options = new[] { "", "MSSQL Server", "PostgreSql" }, - SupportedSyntaxes = new[] { SyntaxNames.JavaScript, SyntaxNames.Liquid } + Options = typeof(ExecuteSqlCommand), + DefaultSyntax = SyntaxNames.Literal, + SupportedSyntaxes = new[] { SyntaxNames.Literal, SyntaxNames.JavaScript, SyntaxNames.Liquid } )] public string? Database { get; set; } + /// + /// Return options to be used by the designer. The designer will pass back whatever context is provided here. + /// + public object GetOptions(PropertyInfo property) => new RuntimeSelectListProviderSettings(GetType(), this._sqlClientFactory.Databases); + + + public ValueTask GetSelectListAsync(object? context = null, CancellationToken cancellationToken = default) + { + var tList = (List)context!; + var items = tList.Select(x => new SelectListItem(x)).ToList(); + return new ValueTask(new SelectList(items)); + } + /// /// SQl script to execute /// @@ -62,5 +83,7 @@ private IActivityExecutionResult ExecuteCommand() return Done(); } + + } } diff --git a/src/activities/Elsa.Activities.Sql/Activities/SqlQuery/ExecuteSqlQuery.cs b/src/activities/Elsa.Activities.Sql/Activities/SqlQuery/ExecuteSqlQuery.cs index 6676bc1d5a..6bd91821e3 100644 --- a/src/activities/Elsa.Activities.Sql/Activities/SqlQuery/ExecuteSqlQuery.cs +++ b/src/activities/Elsa.Activities.Sql/Activities/SqlQuery/ExecuteSqlQuery.cs @@ -1,13 +1,19 @@ +using System.Collections.Generic; using System.Data; +using System.Reflection; +using System.Threading.Tasks; +using System.Threading; using Elsa.Activities.Sql.Factory; using Elsa.Activities.Sql.Models; using Elsa.ActivityResults; using Elsa.Attributes; using Elsa.Design; using Elsa.Expressions; +using Elsa.Metadata; using Elsa.Providers.WorkflowStorage; using Elsa.Services; using Elsa.Services.Models; +using System.Linq; namespace Elsa.Activities.Sql.Activities { @@ -20,7 +26,7 @@ namespace Elsa.Activities.Sql.Activities Description = "Execute given SQL query and returned execution result", Outcomes = new[] { OutcomeNames.Done } )] - public class ExecuteSqlQuery : Activity + public class ExecuteSqlQuery : Activity , IActivityPropertyOptionsProvider, IRuntimeSelectListProvider { /// /// Allowed databases to run SQL @@ -28,11 +34,24 @@ public class ExecuteSqlQuery : Activity [ActivityInput( UIHint = ActivityInputUIHints.Dropdown, Hint = "Allowed databases to run SQL.", - Options = new[] { "MSSQL Server", "PostgreSql" }, - DefaultValue = "MSSQL Server", - SupportedSyntaxes = new[] { SyntaxNames.JavaScript, SyntaxNames.Liquid } + Options = typeof(ExecuteSqlQuery), + DefaultSyntax = SyntaxNames.Literal, + SupportedSyntaxes = new[] { SyntaxNames.Literal, SyntaxNames.JavaScript, SyntaxNames.Liquid } )] - public string? Database { get; set; } = "MSSQL Server"; + public string? Database { get; set; } + + /// + /// Return options to be used by the designer. The designer will pass back whatever context is provided here. + /// + public object GetOptions(PropertyInfo property) => new RuntimeSelectListProviderSettings(GetType(), this._sqlClientFactory.Databases); + + + public ValueTask GetSelectListAsync(object? context = null, CancellationToken cancellationToken = default) + { + var tList = (List)context!; + var items = tList.Select(x => new SelectListItem(x)).ToList(); + return new ValueTask(new SelectList(items)); + } /// /// SQl script to execute diff --git a/src/activities/Elsa.Activities.Sql/Extensions/ServiceCollectionExtensions.cs b/src/activities/Elsa.Activities.Sql/Extensions/ServiceCollectionExtensions.cs index fe5789ea3e..8edfcf8767 100644 --- a/src/activities/Elsa.Activities.Sql/Extensions/ServiceCollectionExtensions.cs +++ b/src/activities/Elsa.Activities.Sql/Extensions/ServiceCollectionExtensions.cs @@ -1,14 +1,20 @@ using Elsa.Activities.Sql.Factory; using Elsa.Options; using Microsoft.Extensions.DependencyInjection; +using System.Runtime.CompilerServices; namespace Elsa.Activities.Sql.Extensions { public static class ServiceCollectionExtensions { - public static ElsaOptionsBuilder AddSqlServerActivities(this ElsaOptionsBuilder elsa) + public static ElsaOptionsBuilder AddSqlServerActivities(this ElsaOptionsBuilder elsa ) { - elsa.Services.AddSingleton(); + return AddSqlServerActivities(elsa); + } + + public static ElsaOptionsBuilder AddSqlServerActivities(this ElsaOptionsBuilder elsa) where T : class, ISqlClientFactory + { + elsa.Services.AddSingleton(); elsa.AddActivity(); elsa.AddActivity(); diff --git a/src/activities/Elsa.Activities.Sql/Factory/ISqlClientFactory.cs b/src/activities/Elsa.Activities.Sql/Factory/ISqlClientFactory.cs index 051c27acde..2cf0122344 100644 --- a/src/activities/Elsa.Activities.Sql/Factory/ISqlClientFactory.cs +++ b/src/activities/Elsa.Activities.Sql/Factory/ISqlClientFactory.cs @@ -1,10 +1,13 @@ using Elsa.Activities.Sql.Client; using Elsa.Activities.Sql.Models; +using System.Collections.Generic; namespace Elsa.Activities.Sql.Factory { public interface ISqlClientFactory { + List Databases { get; } + ISqlClient CreateClient(CreateSqlClientModel createSqlClient); } } diff --git a/src/activities/Elsa.Activities.Sql/Factory/SqlClientFactory.cs b/src/activities/Elsa.Activities.Sql/Factory/SqlClientFactory.cs index f27b4c9286..8946f73fe3 100644 --- a/src/activities/Elsa.Activities.Sql/Factory/SqlClientFactory.cs +++ b/src/activities/Elsa.Activities.Sql/Factory/SqlClientFactory.cs @@ -2,11 +2,14 @@ using Elsa.Activities.Sql.Client.PostgreSqlClient; using Elsa.Activities.Sql.Models; using System; +using System.Collections.Generic; namespace Elsa.Activities.Sql.Factory { public class SqlClientFactory : ISqlClientFactory { + public List Databases => new List() { "MSSQLServer", "MSSQL Server", "PostgreSql" }; + public ISqlClient CreateClient(CreateSqlClientModel createSqlClient) { return createSqlClient.Database switch From bdc97afa5a40dff3904c500c91ef408ebfca6f64 Mon Sep 17 00:00:00 2001 From: mircotamburini Date: Fri, 10 Mar 2023 09:18:01 +0100 Subject: [PATCH 2/2] Order usings --- .../Activities/SqlCommand/ExecuteSqlCommand.cs | 3 +-- .../Activities/SqlQuery/ExecuteSqlQuery.cs | 14 +++++++------- .../Extensions/ServiceCollectionExtensions.cs | 3 +-- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/activities/Elsa.Activities.Sql/Activities/SqlCommand/ExecuteSqlCommand.cs b/src/activities/Elsa.Activities.Sql/Activities/SqlCommand/ExecuteSqlCommand.cs index 25feb7553a..d2b973f1ec 100644 --- a/src/activities/Elsa.Activities.Sql/Activities/SqlCommand/ExecuteSqlCommand.cs +++ b/src/activities/Elsa.Activities.Sql/Activities/SqlCommand/ExecuteSqlCommand.cs @@ -7,7 +7,6 @@ using Elsa.Metadata; using Elsa.Services; using Elsa.Services.Models; -using MediatR; using System.Collections.Generic; using System.Linq; using System.Reflection; @@ -84,6 +83,6 @@ private IActivityExecutionResult ExecuteCommand() return Done(); } - + } } diff --git a/src/activities/Elsa.Activities.Sql/Activities/SqlQuery/ExecuteSqlQuery.cs b/src/activities/Elsa.Activities.Sql/Activities/SqlQuery/ExecuteSqlQuery.cs index 6bd91821e3..dfbd207dba 100644 --- a/src/activities/Elsa.Activities.Sql/Activities/SqlQuery/ExecuteSqlQuery.cs +++ b/src/activities/Elsa.Activities.Sql/Activities/SqlQuery/ExecuteSqlQuery.cs @@ -1,8 +1,3 @@ -using System.Collections.Generic; -using System.Data; -using System.Reflection; -using System.Threading.Tasks; -using System.Threading; using Elsa.Activities.Sql.Factory; using Elsa.Activities.Sql.Models; using Elsa.ActivityResults; @@ -13,7 +8,12 @@ using Elsa.Providers.WorkflowStorage; using Elsa.Services; using Elsa.Services.Models; +using System.Collections.Generic; +using System.Data; using System.Linq; +using System.Reflection; +using System.Threading; +using System.Threading.Tasks; namespace Elsa.Activities.Sql.Activities { @@ -26,7 +26,7 @@ namespace Elsa.Activities.Sql.Activities Description = "Execute given SQL query and returned execution result", Outcomes = new[] { OutcomeNames.Done } )] - public class ExecuteSqlQuery : Activity , IActivityPropertyOptionsProvider, IRuntimeSelectListProvider + public class ExecuteSqlQuery : Activity, IActivityPropertyOptionsProvider, IRuntimeSelectListProvider { /// /// Allowed databases to run SQL @@ -77,7 +77,7 @@ public ValueTask GetSelectListAsync(object? context = null, Cancella private readonly ISqlClientFactory _sqlClientFactory; - public ExecuteSqlQuery(ISqlClientFactory sqlClientFactory) => _sqlClientFactory = sqlClientFactory; + public ExecuteSqlQuery(ISqlClientFactory sqlClientFactory) => _sqlClientFactory = sqlClientFactory; protected override IActivityExecutionResult OnExecute(ActivityExecutionContext context) => ExecuteQuery(); diff --git a/src/activities/Elsa.Activities.Sql/Extensions/ServiceCollectionExtensions.cs b/src/activities/Elsa.Activities.Sql/Extensions/ServiceCollectionExtensions.cs index 8edfcf8767..3f502d5f0d 100644 --- a/src/activities/Elsa.Activities.Sql/Extensions/ServiceCollectionExtensions.cs +++ b/src/activities/Elsa.Activities.Sql/Extensions/ServiceCollectionExtensions.cs @@ -1,13 +1,12 @@ using Elsa.Activities.Sql.Factory; using Elsa.Options; using Microsoft.Extensions.DependencyInjection; -using System.Runtime.CompilerServices; namespace Elsa.Activities.Sql.Extensions { public static class ServiceCollectionExtensions { - public static ElsaOptionsBuilder AddSqlServerActivities(this ElsaOptionsBuilder elsa ) + public static ElsaOptionsBuilder AddSqlServerActivities(this ElsaOptionsBuilder elsa) { return AddSqlServerActivities(elsa); }