diff --git a/Elsa.Activities.File/Activities/OutFile/OutFile.cs b/Elsa.Activities.File/Activities/OutFile/OutFile.cs new file mode 100644 index 000000000..9fa0cc57c --- /dev/null +++ b/Elsa.Activities.File/Activities/OutFile/OutFile.cs @@ -0,0 +1,27 @@ +using Elsa.ActivityResults; +using Elsa.Attributes; +using Elsa.Services; +using Elsa.Services.Models; +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Threading.Tasks; + +namespace Elsa.Activities.File +{ + [Action(Category = "File", + Description = "Output input value to specified location")] + public class OutFile : Activity + { + [ActivityProperty(Hint = "Path to create file at.")] + public string Path { get; set; } + + protected async override ValueTask OnExecuteAsync(ActivityExecutionContext context) + { + await System.IO.File.WriteAllTextAsync(Path, (string)context.Input); + + return Done(); + } + } +} diff --git a/Elsa.Activities.File/Activities/OutFile/OutFileBuilderExtensions.cs b/Elsa.Activities.File/Activities/OutFile/OutFileBuilderExtensions.cs new file mode 100644 index 000000000..87745a00e --- /dev/null +++ b/Elsa.Activities.File/Activities/OutFile/OutFileBuilderExtensions.cs @@ -0,0 +1,30 @@ +using Elsa.Builders; +using Elsa.Services.Models; +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace Elsa.Activities.File +{ + public static class OutFileBuilderExtensions + { + public static IActivityBuilder OutFile(this IBuilder builder, Action> setup, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => builder.Then(setup, null, lineNumber, sourceFile); + + public static IActivityBuilder OutFile(this IBuilder builder, Func path, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => + builder.OutFile(activity => activity.WithPath(path), lineNumber, sourceFile); + + public static IActivityBuilder OutFile(this IBuilder builder, Func> path, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => + builder.OutFile(activity => activity.WithPath(path!), lineNumber, sourceFile); + + public static IActivityBuilder OutFile(this IBuilder builder, Func path, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => + builder.OutFile(activity => activity.WithPath(path!), lineNumber, sourceFile); + + public static IActivityBuilder OutFile(this IBuilder builder, Func> path, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => + builder.OutFile(activity => activity.WithPath(path!), lineNumber, sourceFile); + + public static IActivityBuilder OutFile(this IBuilder builder, string path, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => + builder.OutFile(activity => activity.WithPath(path!), lineNumber, sourceFile); + } +} diff --git a/Elsa.Activities.File/Activities/OutFile/OutFileExtensions.cs b/Elsa.Activities.File/Activities/OutFile/OutFileExtensions.cs new file mode 100644 index 000000000..c0bf970cc --- /dev/null +++ b/Elsa.Activities.File/Activities/OutFile/OutFileExtensions.cs @@ -0,0 +1,18 @@ +using Elsa.Builders; +using Elsa.Services.Models; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; + +namespace Elsa.Activities.File +{ + public static class OutFileExtensions + { + public static ISetupActivity WithPath(this ISetupActivity setup, Func> path) => setup.Set(x => x.Path, path); + public static ISetupActivity WithPath(this ISetupActivity setup, Func path) => setup.Set(x => x.Path, path); + public static ISetupActivity WithPath(this ISetupActivity setup, Func> path) => setup.Set(x => x.Path, path); + public static ISetupActivity WithPath(this ISetupActivity setup, Func path) => setup.Set(x => x.Path, path); + public static ISetupActivity WithPath(this ISetupActivity setup, string path) => setup.Set(x => x.Path, path); + } +} diff --git a/Elsa.Activities.File/Elsa.Activities.File.csproj b/Elsa.Activities.File/Elsa.Activities.File.csproj new file mode 100644 index 000000000..9d2467710 --- /dev/null +++ b/Elsa.Activities.File/Elsa.Activities.File.csproj @@ -0,0 +1,11 @@ + + + + netstandard2.1 + + + + + + + diff --git a/Elsa.Activities.File/Extensions/ServiceCollectionExtensions.cs b/Elsa.Activities.File/Extensions/ServiceCollectionExtensions.cs new file mode 100644 index 000000000..718a4ed23 --- /dev/null +++ b/Elsa.Activities.File/Extensions/ServiceCollectionExtensions.cs @@ -0,0 +1,24 @@ +using Elsa; +using Elsa.Activities.File; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Microsoft.Extensions.DependencyInjection +{ + public static class ServiceCollectionExtensions + { + public static IServiceCollection AddFileActivities(this IServiceCollection services) + { + return services; + } + + public static ElsaOptionsBuilder AddFileActivities(this ElsaOptionsBuilder builder) + { + builder.AddActivity(); + + return builder; + } + } +} diff --git a/Elsa.Samples.ReadLineToFile/Elsa.Samples.ReadLineToFile.csproj b/Elsa.Samples.ReadLineToFile/Elsa.Samples.ReadLineToFile.csproj new file mode 100644 index 000000000..b0b549e13 --- /dev/null +++ b/Elsa.Samples.ReadLineToFile/Elsa.Samples.ReadLineToFile.csproj @@ -0,0 +1,13 @@ + + + + Exe + netcoreapp3.1 + + + + + + + + diff --git a/Elsa.Samples.ReadLineToFile/Program.cs b/Elsa.Samples.ReadLineToFile/Program.cs new file mode 100644 index 000000000..9d335860a --- /dev/null +++ b/Elsa.Samples.ReadLineToFile/Program.cs @@ -0,0 +1,50 @@ +using Elsa.Models; +using Elsa.Persistence; +using Elsa.Persistence.Specifications; +using Elsa.Persistence.Specifications.WorkflowInstances; +using Elsa.Services; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Threading.Tasks; + +namespace Elsa.Samples.ReadLineToFile +{ + class Program + { + static async Task Main(string[] args) + { + var services = new ServiceCollection() + .AddElsa(configure => configure + .AddConsoleActivities() + .AddFileActivities()) + .AddAutoMapperProfiles() + .BuildServiceProvider(); + + // Run startup actions (not needed when registering Elsa with a Host). + var startupRunner = services.GetRequiredService(); + await startupRunner.StartupAsync(); + + // Get a workflow runner. + var workflowRunner = services.GetRequiredService(); + + // Run the workflow. + await workflowRunner.BuildAndStartWorkflowAsync(); + + var store = services.GetRequiredService(); + + var results = await store.FindManyAsync( + new WorkflowDefinitionIdSpecification(nameof(ReadLineToFileWorkflow)), + OrderBySpecification.OrderByDescending(x => x.CreatedAt), + Paging.Page(1, 2)); + + var count = await store.CountAsync(new WorkflowDefinitionIdSpecification(nameof(ReadLineToFileWorkflow))); + + Console.WriteLine(count); + + foreach (var result in results) + { + Console.WriteLine(result.CreatedAt); + } + } + } +} diff --git a/Elsa.Samples.ReadLineToFile/ReadLineToFileWorkflow.cs b/Elsa.Samples.ReadLineToFile/ReadLineToFileWorkflow.cs new file mode 100644 index 000000000..143a2d739 --- /dev/null +++ b/Elsa.Samples.ReadLineToFile/ReadLineToFileWorkflow.cs @@ -0,0 +1,23 @@ +using Elsa.Activities.Console; +using Elsa.Activities.File; +using Elsa.Builders; +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace Elsa.Samples.ReadLineToFile +{ + public class ReadLineToFileWorkflow : IWorkflow + { + public void Build(IWorkflowBuilder builder) + { + var temp = Path.GetTempFileName(); + + builder + .WriteLine("Enter text to write to file") + .ReadLine() + .OutFile(temp); + } + } +} diff --git a/Elsa.sln b/Elsa.sln index ee3757e95..92ca2cb47 100644 --- a/Elsa.sln +++ b/Elsa.sln @@ -239,11 +239,15 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Activities.BlobStorage EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "locking", "locking", "{DBBD242E-4437-4BDB-919F-A70839BE75FA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.DistributedLocking.SqlServer", "src\locking\Elsa.DistributedLocking.SqlServer\Elsa.DistributedLocking.SqlServer.csproj", "{B09A6E42-EF42-4693-BA0E-5EE1D7F81FFD}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.DistributedLocking.SqlServer", "src\locking\Elsa.DistributedLocking.SqlServer\Elsa.DistributedLocking.SqlServer.csproj", "{B09A6E42-EF42-4693-BA0E-5EE1D7F81FFD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.DistributedLocking.Redis", "src\locking\Elsa.DistributedLocking.Redis\Elsa.DistributedLocking.Redis.csproj", "{7E5514AC-3633-4237-9490-0992417F2273}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.DistributedLocking.Redis", "src\locking\Elsa.DistributedLocking.Redis\Elsa.DistributedLocking.Redis.csproj", "{7E5514AC-3633-4237-9490-0992417F2273}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.DistributedLocking.AzureBlob", "src\locking\Elsa.DistributedLocking.AzureBlob\Elsa.DistributedLocking.AzureBlob.csproj", "{495BE954-E6EA-41A9-8054-A5CA5DD0924E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.DistributedLocking.AzureBlob", "src\locking\Elsa.DistributedLocking.AzureBlob\Elsa.DistributedLocking.AzureBlob.csproj", "{495BE954-E6EA-41A9-8054-A5CA5DD0924E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Activities.File", "Elsa.Activities.File\Elsa.Activities.File.csproj", "{C7BCC9FA-4F61-4834-AB27-3D7C204E512D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.ReadLineToFile", "Elsa.Samples.ReadLineToFile\Elsa.Samples.ReadLineToFile.csproj", "{08C78021-B949-4A73-A4C6-0D72876B9593}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "blazor", "blazor", "{D86B94DC-A53C-4A67-A820-828DD359C49B}" EndProject @@ -639,6 +643,14 @@ Global {3DF05CFC-AC77-489F-9A42-C4FDB599AA69}.Debug|Any CPU.Build.0 = Debug|Any CPU {3DF05CFC-AC77-489F-9A42-C4FDB599AA69}.Release|Any CPU.ActiveCfg = Release|Any CPU {3DF05CFC-AC77-489F-9A42-C4FDB599AA69}.Release|Any CPU.Build.0 = Release|Any CPU + {C7BCC9FA-4F61-4834-AB27-3D7C204E512D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C7BCC9FA-4F61-4834-AB27-3D7C204E512D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C7BCC9FA-4F61-4834-AB27-3D7C204E512D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C7BCC9FA-4F61-4834-AB27-3D7C204E512D}.Release|Any CPU.Build.0 = Release|Any CPU + {08C78021-B949-4A73-A4C6-0D72876B9593}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {08C78021-B949-4A73-A4C6-0D72876B9593}.Debug|Any CPU.Build.0 = Debug|Any CPU + {08C78021-B949-4A73-A4C6-0D72876B9593}.Release|Any CPU.ActiveCfg = Release|Any CPU + {08C78021-B949-4A73-A4C6-0D72876B9593}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -764,6 +776,8 @@ Global {F1EF5639-021A-4D22-9D4A-73D57C88EBFA} = {C869CC72-9A98-4246-9A76-6A50F48AFD85} {3A30EFFE-32D8-40B8-9C62-427037BB5424} = {EEBEA8AF-C8A8-4C71-A96C-D5836DE24359} {3DF05CFC-AC77-489F-9A42-C4FDB599AA69} = {8B6B40A8-DF21-4CD2-BABD-474B79D0C3AF} + {C7BCC9FA-4F61-4834-AB27-3D7C204E512D} = {B43B546E-23F3-46E8-ACB7-D04F05CDA180} + {08C78021-B949-4A73-A4C6-0D72876B9593} = {FC9F520F-BA51-4AD2-BFEE-EF787798E734} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {8B0975FD-7050-48B0-88C5-48C33378E158}