diff --git a/Samples.sln b/Samples.sln index ae50bb915..5dab74820 100644 --- a/Samples.sln +++ b/Samples.sln @@ -87,6 +87,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Persistence.DocumentDb EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample16", "src\samples\Sample16\Sample16.csproj", "{DFE72CF4-C77C-4932-A00F-A8D325E603CE}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample17", "src\samples\Sample17\Sample17.csproj", "{8854DF17-D566-49C9-8210-68AB8F5659FA}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -221,6 +223,10 @@ Global {DFE72CF4-C77C-4932-A00F-A8D325E603CE}.Debug|Any CPU.Build.0 = Debug|Any CPU {DFE72CF4-C77C-4932-A00F-A8D325E603CE}.Release|Any CPU.ActiveCfg = Release|Any CPU {DFE72CF4-C77C-4932-A00F-A8D325E603CE}.Release|Any CPU.Build.0 = Release|Any CPU + {8854DF17-D566-49C9-8210-68AB8F5659FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8854DF17-D566-49C9-8210-68AB8F5659FA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8854DF17-D566-49C9-8210-68AB8F5659FA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8854DF17-D566-49C9-8210-68AB8F5659FA}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -263,6 +269,7 @@ Global {79E85459-EF54-44D6-9508-1E68B8238D00} = {B43B546E-23F3-46E8-ACB7-D04F05CDA180} {8C51A528-F9B5-464E-AAD1-1ADC44697085} = {600C4AE0-0585-4181-9CEC-2BB43430C713} {DFE72CF4-C77C-4932-A00F-A8D325E603CE} = {5E5E1E84-DDBC-40D6-B891-0D563A15A44A} + {8854DF17-D566-49C9-8210-68AB8F5659FA} = {5E5E1E84-DDBC-40D6-B891-0D563A15A44A} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {8B0975FD-7050-48B0-88C5-48C33378E158} diff --git a/src/activities/Elsa.Activities.Console/Activities/ReadLine.cs b/src/activities/Elsa.Activities.Console/Activities/ReadLine.cs index 9df718795..6bf1a7f43 100644 --- a/src/activities/Elsa.Activities.Console/Activities/ReadLine.cs +++ b/src/activities/Elsa.Activities.Console/Activities/ReadLine.cs @@ -24,7 +24,7 @@ namespace Elsa.Activities.Console.Activities { private readonly TextReader input; - public ReadLine() : this(System.Console.In) + public ReadLine() { } @@ -53,7 +53,7 @@ namespace Elsa.Activities.Console.Activities protected override ActivityExecutionResult OnResume(WorkflowExecutionContext context) { - var receivedInput = (string) context.Workflow.Input[VariableName]; + var receivedInput = (string) context.Workflow.Input["ReadLineInput"]; return Execute(context, receivedInput); } diff --git a/src/activities/Elsa.Activities.Email/Extensions/ServiceCollectionExtensions.cs b/src/activities/Elsa.Activities.Email/Extensions/ServiceCollectionExtensions.cs index fa967fcee..f3bdeff76 100644 --- a/src/activities/Elsa.Activities.Email/Extensions/ServiceCollectionExtensions.cs +++ b/src/activities/Elsa.Activities.Email/Extensions/ServiceCollectionExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Net; using System.Net.Mail; using Elsa.Activities.Email.Activities; using Elsa.Activities.Email.Options; @@ -23,8 +24,28 @@ namespace Elsa.Activities.Email.Extensions private static SmtpClient CreateSmtpClient(IServiceProvider serviceProvider) { var options = serviceProvider.GetRequiredService>().Value; + var smtpClient = new SmtpClient(options.Host, options.Port); + var credentials = options.Credentials; - return new SmtpClient(options.Host, options.Port); + if (credentials != null && !string.IsNullOrWhiteSpace(credentials.Username)) + smtpClient.Credentials = new NetworkCredential(credentials.Username, credentials.Password); + + if (options.Timeout != null) + smtpClient.Timeout = (int)options.Timeout.Value.TotalSeconds; + + if (options.DeliveryFormat != null) + smtpClient.DeliveryFormat = options.DeliveryFormat.Value; + + if (options.DeliveryMethod != null) + smtpClient.DeliveryMethod = options.DeliveryMethod.Value; + + if (options.EnableSsl != null) + smtpClient.EnableSsl = options.EnableSsl.Value; + + if (!string.IsNullOrWhiteSpace(options.PickupDirectoryLocation)) + smtpClient.PickupDirectoryLocation = options.PickupDirectoryLocation; + + return smtpClient; } } } \ No newline at end of file diff --git a/src/activities/Elsa.Activities.Email/Options/SmtpCredentials.cs b/src/activities/Elsa.Activities.Email/Options/SmtpCredentials.cs new file mode 100644 index 000000000..0f814dec6 --- /dev/null +++ b/src/activities/Elsa.Activities.Email/Options/SmtpCredentials.cs @@ -0,0 +1,8 @@ +namespace Elsa.Activities.Email.Options +{ + public class SmtpCredentials + { + public string Username { get; set; } + public string Password { get; set; } + } +} \ No newline at end of file diff --git a/src/activities/Elsa.Activities.Email/Options/SmtpOptions.cs b/src/activities/Elsa.Activities.Email/Options/SmtpOptions.cs index 5e8184996..25e267de5 100644 --- a/src/activities/Elsa.Activities.Email/Options/SmtpOptions.cs +++ b/src/activities/Elsa.Activities.Email/Options/SmtpOptions.cs @@ -1,3 +1,6 @@ +using System; +using System.Net.Mail; + namespace Elsa.Activities.Email.Options { public class SmtpOptions @@ -5,5 +8,11 @@ namespace Elsa.Activities.Email.Options public string Host { get; set; } public int Port { get; set; } public string DefaultSender { get; set; } + public SmtpCredentials Credentials { get; set; } + public TimeSpan? Timeout { get; set; } + public SmtpDeliveryFormat? DeliveryFormat { get; set; } + public SmtpDeliveryMethod? DeliveryMethod { get; set; } + public bool? EnableSsl { get; set; } + public string PickupDirectoryLocation { get; set; } } } \ No newline at end of file diff --git a/src/core/Elsa.Abstractions/Services/IActivityBuilder.cs b/src/core/Elsa.Abstractions/Services/IActivityBuilder.cs index f97f0c703..f521ad1b7 100644 --- a/src/core/Elsa.Abstractions/Services/IActivityBuilder.cs +++ b/src/core/Elsa.Abstractions/Services/IActivityBuilder.cs @@ -12,6 +12,7 @@ namespace Elsa.Services IActivityBuilder Add(Action setup = default, string id = null) where T : class, IActivity; IOutcomeBuilder When(string outcome); IActivityBuilder Then(Action setup = null, Action branch = null, string id = null) where T : class, IActivity; + IActivityBuilder WithId(string id); IWorkflowBuilder Then(string activityId); WorkflowDefinitionVersion Build(); ActivityDefinition BuildActivity(); diff --git a/src/core/Elsa.Core/Elsa.Core.csproj b/src/core/Elsa.Core/Elsa.Core.csproj index 58347620c..1e8b11eb6 100644 --- a/src/core/Elsa.Core/Elsa.Core.csproj +++ b/src/core/Elsa.Core/Elsa.Core.csproj @@ -29,7 +29,7 @@ - + diff --git a/src/core/Elsa.Core/WorkflowBuilders/ActivityBuilder.cs b/src/core/Elsa.Core/WorkflowBuilders/ActivityBuilder.cs index 262331a7a..bac4dc39e 100644 --- a/src/core/Elsa.Core/WorkflowBuilders/ActivityBuilder.cs +++ b/src/core/Elsa.Core/WorkflowBuilders/ActivityBuilder.cs @@ -40,6 +40,12 @@ namespace Elsa.WorkflowBuilders return activityBuilder; } + public IActivityBuilder WithId(string id) + { + Id = id; + return this; + } + public IWorkflowBuilder Then(string activityId) { WorkflowBuilder.Connect( diff --git a/src/dashboard/Elsa.Dashboard/Elsa.Dashboard.csproj b/src/dashboard/Elsa.Dashboard/Elsa.Dashboard.csproj index 8b9ac28a7..da6587839 100644 --- a/src/dashboard/Elsa.Dashboard/Elsa.Dashboard.csproj +++ b/src/dashboard/Elsa.Dashboard/Elsa.Dashboard.csproj @@ -21,7 +21,6 @@ - diff --git a/src/dashboard/Elsa.Dashboard/Extensions/DashboardServiceCollectionExtensions.cs b/src/dashboard/Elsa.Dashboard/Extensions/DashboardServiceCollectionExtensions.cs index 31c05ec28..6668f35d2 100644 --- a/src/dashboard/Elsa.Dashboard/Extensions/DashboardServiceCollectionExtensions.cs +++ b/src/dashboard/Elsa.Dashboard/Extensions/DashboardServiceCollectionExtensions.cs @@ -4,7 +4,6 @@ using Elsa.Dashboard.ActionFilters; using Elsa.Dashboard.Options; using Elsa.Dashboard.Services; using Elsa.Mapping; -using Elsa.Persistence; using Elsa.Runtime; using Elsa.Serialization; using Elsa.Serialization.Formatters; diff --git a/src/persistence/Elsa.Persistence.MongoDb/Extensions/ServiceCollectionExtensions.cs b/src/persistence/Elsa.Persistence.MongoDb/Extensions/ServiceCollectionExtensions.cs index 422e5ddcb..23b047581 100644 --- a/src/persistence/Elsa.Persistence.MongoDb/Extensions/ServiceCollectionExtensions.cs +++ b/src/persistence/Elsa.Persistence.MongoDb/Extensions/ServiceCollectionExtensions.cs @@ -1,6 +1,5 @@ using System; using Elsa.Models; -using Elsa.Persistence.Memory; using Elsa.Persistence.MongoDb.Serialization; using Elsa.Persistence.MongoDb.Services; using Microsoft.Extensions.Configuration; diff --git a/src/persistence/Elsa.Persistence.MongoDb/Services/MongoWorkflowDefinitionStore.cs b/src/persistence/Elsa.Persistence.MongoDb/Services/MongoWorkflowDefinitionStore.cs index edf82e8ff..e6be71e95 100644 --- a/src/persistence/Elsa.Persistence.MongoDb/Services/MongoWorkflowDefinitionStore.cs +++ b/src/persistence/Elsa.Persistence.MongoDb/Services/MongoWorkflowDefinitionStore.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using System.Linq; using System.Threading; using System.Threading.Tasks; using Elsa.Extensions; diff --git a/src/samples/Sample01/Program.cs b/src/samples/Sample01/Program.cs index f7b90aeab..007889309 100644 --- a/src/samples/Sample01/Program.cs +++ b/src/samples/Sample01/Program.cs @@ -1,6 +1,5 @@ using System; using System.Threading.Tasks; -using Elsa.Persistence.Memory; using Elsa.Services; using Microsoft.Extensions.DependencyInjection; using Sample01.Activities; diff --git a/src/samples/Sample02/Program.cs b/src/samples/Sample02/Program.cs index 17031321c..a7617d642 100644 --- a/src/samples/Sample02/Program.cs +++ b/src/samples/Sample02/Program.cs @@ -3,7 +3,6 @@ using System.Threading.Tasks; using Elsa.Activities.Console.Activities; using Elsa.Activities.Console.Extensions; using Elsa.Expressions; -using Elsa.Persistence.Memory; using Elsa.Services; using Microsoft.Extensions.DependencyInjection; diff --git a/src/samples/Sample03/Program.cs b/src/samples/Sample03/Program.cs index 4b1dbba48..eab461aa2 100644 --- a/src/samples/Sample03/Program.cs +++ b/src/samples/Sample03/Program.cs @@ -5,7 +5,6 @@ using Elsa.Activities.Console.Activities; using Elsa.Activities.Console.Extensions; using Elsa.Expressions; using Elsa.Models; -using Elsa.Persistence.Memory; using Elsa.Services; using Microsoft.Extensions.DependencyInjection; diff --git a/src/samples/Sample04/Program.cs b/src/samples/Sample04/Program.cs index 3a02dc358..b8e1cfb76 100644 --- a/src/samples/Sample04/Program.cs +++ b/src/samples/Sample04/Program.cs @@ -1,7 +1,6 @@ using System; using System.Threading.Tasks; using Elsa.Activities.Console.Extensions; -using Elsa.Persistence.Memory; using Elsa.Services; using Microsoft.Extensions.DependencyInjection; using Sample04.Activities; diff --git a/src/samples/Sample05/Program.cs b/src/samples/Sample05/Program.cs index b45b3a1ad..af6b6c6be 100644 --- a/src/samples/Sample05/Program.cs +++ b/src/samples/Sample05/Program.cs @@ -1,7 +1,6 @@ using System.Threading.Tasks; using Elsa.Activities.Console.Extensions; using Elsa.Activities.Timers.Extensions; -using Elsa.Persistence.Memory; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; diff --git a/src/samples/Sample06/Startup.cs b/src/samples/Sample06/Startup.cs index d9a364a9d..88b6befc0 100644 --- a/src/samples/Sample06/Startup.cs +++ b/src/samples/Sample06/Startup.cs @@ -1,5 +1,4 @@ using Elsa.Activities.Http.Extensions; -using Elsa.Persistence.Memory; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; diff --git a/src/samples/Sample07/Startup.cs b/src/samples/Sample07/Startup.cs index 867502b95..5d77b221c 100644 --- a/src/samples/Sample07/Startup.cs +++ b/src/samples/Sample07/Startup.cs @@ -1,7 +1,6 @@ using Elsa.Activities.Email.Extensions; using Elsa.Activities.Http.Extensions; using Elsa.Activities.Timers.Extensions; -using Elsa.Persistence.Memory; using Elsa.Runtime; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Configuration; diff --git a/src/samples/Sample08/Startup.cs b/src/samples/Sample08/Startup.cs index 648f3b588..d129097e8 100644 --- a/src/samples/Sample08/Startup.cs +++ b/src/samples/Sample08/Startup.cs @@ -2,7 +2,6 @@ using Elsa.Activities.Http.Extensions; using Elsa.Activities.MassTransit.Extensions; using Elsa.Activities.Timers.Extensions; -using Elsa.Persistence.Memory; using Elsa.Runtime; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Configuration; diff --git a/src/samples/Sample09/Program.cs b/src/samples/Sample09/Program.cs index 3decab293..2f4c4cbc2 100644 --- a/src/samples/Sample09/Program.cs +++ b/src/samples/Sample09/Program.cs @@ -4,7 +4,6 @@ using System.Reflection; using System.Threading.Tasks; using Elsa.Activities.Console.Extensions; using Elsa.Models; -using Elsa.Persistence.Memory; using Elsa.Serialization; using Elsa.Serialization.Formatters; using Elsa.Services; diff --git a/src/samples/Sample10/Program.cs b/src/samples/Sample10/Program.cs index f254c7f1f..ed7b6b5b1 100644 --- a/src/samples/Sample10/Program.cs +++ b/src/samples/Sample10/Program.cs @@ -5,7 +5,6 @@ using Elsa.Activities.Console.Extensions; using Elsa.Extensions; using Elsa.Models; using Elsa.Persistence; -using Elsa.Persistence.Memory; using Elsa.Persistence.YesSql.Extensions; using Elsa.Runtime; using Elsa.Services; diff --git a/src/samples/Sample11/Program.cs b/src/samples/Sample11/Program.cs index 02830ee07..42be5550d 100644 --- a/src/samples/Sample11/Program.cs +++ b/src/samples/Sample11/Program.cs @@ -5,7 +5,6 @@ using Elsa.Activities.Console.Extensions; using Elsa.Activities.Workflows; using Elsa.Extensions; using Elsa.Models; -using Elsa.Persistence.Memory; using Elsa.Services; using Microsoft.Extensions.DependencyInjection; diff --git a/src/samples/Sample12/Program.cs b/src/samples/Sample12/Program.cs index 1f5174753..028e6f648 100644 --- a/src/samples/Sample12/Program.cs +++ b/src/samples/Sample12/Program.cs @@ -6,7 +6,6 @@ using Elsa.Activities.UserTask.Activities; using Elsa.Activities.UserTask.Extensions; using Elsa.Extensions; using Elsa.Models; -using Elsa.Persistence.Memory; using Elsa.Services; using Elsa.Services.Extensions; using Elsa.Services.Models; diff --git a/src/samples/Sample13/Program.cs b/src/samples/Sample13/Program.cs index ccabb44c6..b70d0b866 100644 --- a/src/samples/Sample13/Program.cs +++ b/src/samples/Sample13/Program.cs @@ -1,7 +1,6 @@ using System; using System.Threading.Tasks; using Elsa.Activities.Console.Extensions; -using Elsa.Persistence.Memory; using Elsa.Scripting; using Elsa.Services; using Microsoft.Extensions.DependencyInjection; diff --git a/src/samples/Sample17/Activities/CreatePerson.cs b/src/samples/Sample17/Activities/CreatePerson.cs new file mode 100644 index 000000000..853f54588 --- /dev/null +++ b/src/samples/Sample17/Activities/CreatePerson.cs @@ -0,0 +1,45 @@ +using System.Threading; +using System.Threading.Tasks; +using Elsa.Expressions; +using Elsa.Extensions; +using Elsa.Results; +using Elsa.Services; +using Elsa.Services.Models; +using Sample17.Models; + +namespace Sample17.Activities +{ + public class CreatePerson : Activity + { + private readonly IWorkflowExpressionEvaluator expressionEvaluator; + + public CreatePerson(IWorkflowExpressionEvaluator expressionEvaluator) + { + this.expressionEvaluator = expressionEvaluator; + } + + public WorkflowExpression TitleExpression + { + get => GetState>(); + set => SetState(value); + } + + public WorkflowExpression AgeExpression + { + get => GetState>(); + set => SetState(value); + } + + protected override async Task OnExecuteAsync( + WorkflowExecutionContext context, + CancellationToken cancellationToken) + { + var name = await expressionEvaluator.EvaluateAsync(TitleExpression, context, cancellationToken); + var age = await expressionEvaluator.EvaluateAsync(AgeExpression, context, cancellationToken); + var person = new Person { FullName = name, Age = age }; + + Output["Person"] = person; + return Done(); + } + } +} \ No newline at end of file diff --git a/src/samples/Sample17/CreatePersonWorkflow.cs b/src/samples/Sample17/CreatePersonWorkflow.cs new file mode 100644 index 000000000..af843d04f --- /dev/null +++ b/src/samples/Sample17/CreatePersonWorkflow.cs @@ -0,0 +1,41 @@ +using Elsa.Activities.Console.Activities; +using Elsa.Activities.Primitives; +using Elsa.Expressions; +using Elsa.Services; +using Elsa.Services.Models; +using Sample17.Activities; +using Sample17.Models; + +namespace Sample17 +{ + public class CreatePersonWorkflow : IWorkflow + { + public void Build(IWorkflowBuilder builder) + { + builder + .StartWith(x => x.TextExpression = new LiteralExpression("Enter name:")) + .Then().WithId("NameInput") + .Then(x => x.TextExpression = new LiteralExpression("Enter age:")) + .Then().WithId("AgeInput") + .Then( + x => + { + x.TitleExpression = new JavaScriptExpression("NameInput.Input"); + x.AgeExpression = new JavaScriptExpression("AgeInput.Input"); + }).WithId("CreatePerson") + .Then( + x => + { + x.VariableName = "Person"; + x.ValueExpression = new JavaScriptExpression("CreatePerson.Person"); + }) + .Then( + x => + { + x.VariableName = "Age"; + x.ValueExpression = new JavaScriptExpression("CreatePerson.Person.Age"); + }) + .Then(x => x.TextExpression = new JavaScriptExpression("`A new person was created with name \"${Person.FullName}\" and age \"${Age}\"`")); + } + } +} \ No newline at end of file diff --git a/src/samples/Sample17/Models/Person.cs b/src/samples/Sample17/Models/Person.cs new file mode 100644 index 000000000..c88f2ea3b --- /dev/null +++ b/src/samples/Sample17/Models/Person.cs @@ -0,0 +1,10 @@ +namespace Sample17.Models +{ + public class Person + { + public string FullName { get; set; } + public int Age { get; set; } + + public override string ToString() => FullName; + } +} \ No newline at end of file diff --git a/src/samples/Sample17/Program.cs b/src/samples/Sample17/Program.cs new file mode 100644 index 000000000..11ab1fe04 --- /dev/null +++ b/src/samples/Sample17/Program.cs @@ -0,0 +1,34 @@ +using System; +using System.Threading.Tasks; +using Elsa.Activities.Console.Extensions; +using Elsa.Services; +using Microsoft.Extensions.DependencyInjection; +using Sample17.Activities; +using Sample17.Models; + +namespace Sample17 +{ + internal static class Program + { + private static async Task Main(string[] args) + { + var services = BuildServices(); + var workflowInvoker = services.GetRequiredService(); + var workflowExecutionContext = await workflowInvoker.StartAsync(); + var document = workflowExecutionContext.CurrentScope.GetVariable("Document"); + + Console.WriteLine("Created document: {0}", document); + } + + private static IServiceProvider BuildServices() + { + return new ServiceCollection() + .AddWorkflows() + .AddWorkflow() + .AddConsoleActivities() + .AddActivity() + .AddSingleton(Console.In) + .BuildServiceProvider(); + } + } +} \ No newline at end of file diff --git a/src/samples/Sample17/Sample17.csproj b/src/samples/Sample17/Sample17.csproj new file mode 100644 index 000000000..32f47e3b5 --- /dev/null +++ b/src/samples/Sample17/Sample17.csproj @@ -0,0 +1,15 @@ + + + + Exe + netcoreapp3.0 + latest + + + + + + + + +