From 9d333ec5b8af3fa5f055d6066ae552acc1e6bb8b Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Fri, 2 Apr 2021 16:56:08 +0200 Subject: [PATCH] Add Document Approval sample project --- Elsa.sln | 7 ++ .../DocumentApprovalWorkflow.cs | 89 +++++++++++++++++++ .../Elsa.Samples.DocumentApproval.csproj | 14 +++ .../Elsa.Samples.DocumentApproval/Program.cs | 14 +++ .../Properties/launchSettings.json | 26 ++++++ .../Elsa.Samples.DocumentApproval/Startup.cs | 31 +++++++ .../appsettings.json | 10 +++ .../post-document.http | 11 +++ 8 files changed, 202 insertions(+) create mode 100644 src/samples/aspnet/Elsa.Samples.DocumentApproval/DocumentApprovalWorkflow.cs create mode 100644 src/samples/aspnet/Elsa.Samples.DocumentApproval/Elsa.Samples.DocumentApproval.csproj create mode 100644 src/samples/aspnet/Elsa.Samples.DocumentApproval/Program.cs create mode 100644 src/samples/aspnet/Elsa.Samples.DocumentApproval/Properties/launchSettings.json create mode 100644 src/samples/aspnet/Elsa.Samples.DocumentApproval/Startup.cs create mode 100644 src/samples/aspnet/Elsa.Samples.DocumentApproval/appsettings.json create mode 100644 src/samples/aspnet/Elsa.Samples.DocumentApproval/post-document.http diff --git a/Elsa.sln b/Elsa.sln index 8f8b4735d..b5572ce71 100644 --- a/Elsa.sln +++ b/Elsa.sln @@ -249,6 +249,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Server.Orleans", "src\ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Server.Hangfire", "src\server\Elsa.Server.Hangfire\Elsa.Server.Hangfire.csproj", "{546C123A-F855-459F-886C-9D90AA14D12B}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.DocumentApproval", "src\samples\aspnet\Elsa.Samples.DocumentApproval\Elsa.Samples.DocumentApproval.csproj", "{C890480A-F21B-4F6F-821A-67FA19DAD539}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -603,6 +605,10 @@ Global {546C123A-F855-459F-886C-9D90AA14D12B}.Debug|Any CPU.Build.0 = Debug|Any CPU {546C123A-F855-459F-886C-9D90AA14D12B}.Release|Any CPU.ActiveCfg = Release|Any CPU {546C123A-F855-459F-886C-9D90AA14D12B}.Release|Any CPU.Build.0 = Release|Any CPU + {C890480A-F21B-4F6F-821A-67FA19DAD539}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C890480A-F21B-4F6F-821A-67FA19DAD539}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C890480A-F21B-4F6F-821A-67FA19DAD539}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C890480A-F21B-4F6F-821A-67FA19DAD539}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -722,6 +728,7 @@ Global {2B67E954-3B04-402D-A9A7-AAAB1D6C3215} = {B43B546E-23F3-46E8-ACB7-D04F05CDA180} {76BD888E-F0FD-40DD-B025-2ED773C1C50B} = {468E498C-59DB-4541-8D8A-0D89DE9083AB} {546C123A-F855-459F-886C-9D90AA14D12B} = {468E498C-59DB-4541-8D8A-0D89DE9083AB} + {C890480A-F21B-4F6F-821A-67FA19DAD539} = {22E75696-6FE9-436A-9097-EE21C603F818} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {8B0975FD-7050-48B0-88C5-48C33378E158} diff --git a/src/samples/aspnet/Elsa.Samples.DocumentApproval/DocumentApprovalWorkflow.cs b/src/samples/aspnet/Elsa.Samples.DocumentApproval/DocumentApprovalWorkflow.cs new file mode 100644 index 000000000..380d5fe9f --- /dev/null +++ b/src/samples/aspnet/Elsa.Samples.DocumentApproval/DocumentApprovalWorkflow.cs @@ -0,0 +1,89 @@ +using System.Net; +using System.Net.Http; +using Elsa.Activities.Console; +using Elsa.Activities.ControlFlow; +using Elsa.Activities.Http; +using Elsa.Activities.Http.Extensions; +using Elsa.Activities.Http.Models; +using Elsa.Activities.Primitives; +using Elsa.Builders; + +namespace Elsa.Samples.DocumentApproval +{ + /// + /// A workflow that gives Jack and Lucy a chance to review a submitted document. + /// + public class DocumentApprovalWorkflow : IWorkflow + { + public void Build(IWorkflowBuilder builder) + { + builder + .HttpEndpoint(activity => activity + .WithMethod(HttpMethod.Post.Method) + .WithPath("/documents") + .WithReadContent()) + .SetVariable("Document", context => context.GetInput()!.Body) + .WriteLine(context => $"Document received from {context.GetVariable("Document")!.Author.Name}") + .WriteHttpResponse(activity => activity + .WithContent(context => "

Request for Approval Sent

Your document has been received and will be reviewed shortly.

") + .WithContentType("text/html") + .WithStatusCode(HttpStatusCode.OK).WithResponseHeaders(new HttpResponseHeaders { ["X-Powered-By"] = "Elsa Workflows" }) + ) + .Then(fork1 => fork1.WithBranches("Jack", "Lucy"), fork1 => + { + fork1 + .When("Jack") + .WriteLine(context => $"Jack approve url: \n {context.GenerateSignalUrl("Approve:Jack")}") + .Then(fork2 => fork2.WithBranches("Approve", "Reject"), fork2 => + { + fork2 + .When("Approve") + .SignalReceived("Approve:Jack") + .SetVariable("Approved", context => context.SetVariable("Approved", approved => approved == 0 ? 1 : approved)) + .ThenNamed("JoinJack"); + + fork2 + .When("Reject") + .SignalReceived("Reject:Jack") + .SetVariable("Approved", 2) + .ThenNamed("JoinJack"); + }).WithName("ForkJack") + .Add(x => x.WithMode(Join.JoinMode.WaitAny)).WithName("JoinJack") + .ThenNamed("JoinJackLucy"); + + fork1.When("Lucy") + .WriteLine(context => $"Lucy approve url: \n {context.GenerateSignalUrl("Approve:Lucy")}") + .Then(fork2 => fork2.WithBranches("Approve", "Reject"), + fork2 => + { + fork2 + .When("Approve") + .SignalReceived("Approve:Lucy") + .SetVariable("Approved", context => context.SetVariable("Approved", approved => approved == 0 ? 1 : approved)) + .ThenNamed("JoinLucy"); + + fork2 + .When("Reject") + .SignalReceived("Reject:Lucy") + .SetVariable("Approved", 2) + .ThenNamed("JoinLucy"); + }).WithName("ForkLucy") + .Add(x => x.WithMode(Join.JoinMode.WaitAny)).WithName("JoinLucy") + .ThenNamed("JoinJackLucy"); + } + ) + .Add(x => x.WithMode(Join.JoinMode.WaitAll)).WithName("JoinJackLucy") + .WriteLine(context => $"Approved: {context.GetVariable("Approved")}").WithName("AfterJoinJackLucy") + .If(context => context.GetVariable("Approved") == 1, @if => + { + @if + .When(OutcomeNames.True) + .WriteLine(context => $"Document ${context.GetVariable("Document")!.Id} approved!`"); + + @if + .When(OutcomeNames.False) + .WriteLine(context => $"Document ${context.GetVariable("Document")!.Id} rejected!`"); + }); + } + } +} \ No newline at end of file diff --git a/src/samples/aspnet/Elsa.Samples.DocumentApproval/Elsa.Samples.DocumentApproval.csproj b/src/samples/aspnet/Elsa.Samples.DocumentApproval/Elsa.Samples.DocumentApproval.csproj new file mode 100644 index 000000000..9416619a2 --- /dev/null +++ b/src/samples/aspnet/Elsa.Samples.DocumentApproval/Elsa.Samples.DocumentApproval.csproj @@ -0,0 +1,14 @@ + + + + net5.0 + false + + + + + + + + + diff --git a/src/samples/aspnet/Elsa.Samples.DocumentApproval/Program.cs b/src/samples/aspnet/Elsa.Samples.DocumentApproval/Program.cs new file mode 100644 index 000000000..51e04773d --- /dev/null +++ b/src/samples/aspnet/Elsa.Samples.DocumentApproval/Program.cs @@ -0,0 +1,14 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; + +namespace Elsa.Samples.DocumentApproval +{ + public class Program + { + public static void Main(string[] args) => CreateHostBuilder(args).Build().Run(); + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); }); + } +} \ No newline at end of file diff --git a/src/samples/aspnet/Elsa.Samples.DocumentApproval/Properties/launchSettings.json b/src/samples/aspnet/Elsa.Samples.DocumentApproval/Properties/launchSettings.json new file mode 100644 index 000000000..96bc5506d --- /dev/null +++ b/src/samples/aspnet/Elsa.Samples.DocumentApproval/Properties/launchSettings.json @@ -0,0 +1,26 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:62841/" + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Elsa.Samples.HelloWorldHttp": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "http://localhost:62841" + } + } +} \ No newline at end of file diff --git a/src/samples/aspnet/Elsa.Samples.DocumentApproval/Startup.cs b/src/samples/aspnet/Elsa.Samples.DocumentApproval/Startup.cs new file mode 100644 index 000000000..02ee3608c --- /dev/null +++ b/src/samples/aspnet/Elsa.Samples.DocumentApproval/Startup.cs @@ -0,0 +1,31 @@ +using Elsa.Persistence.EntityFramework.Core.Extensions; +using Elsa.Persistence.EntityFramework.Sqlite; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; + +namespace Elsa.Samples.DocumentApproval +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddControllers(); + + services + .AddElsa(options => options + .UseEntityFrameworkPersistence(ef => ef.UseSqlite()) + .AddConsoleActivities() + .AddHttpActivities() + .AddWorkflow()); + } + + public void Configure(IApplicationBuilder app) + { + // Add HTTP activities middleware. + app.UseHttpActivities(); + + app.UseRouting(); + app.UseEndpoints(endpoints => endpoints.MapControllers()); + } + } +} \ No newline at end of file diff --git a/src/samples/aspnet/Elsa.Samples.DocumentApproval/appsettings.json b/src/samples/aspnet/Elsa.Samples.DocumentApproval/appsettings.json new file mode 100644 index 000000000..208b7819d --- /dev/null +++ b/src/samples/aspnet/Elsa.Samples.DocumentApproval/appsettings.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Debug", + "System": "Information", + "Microsoft": "Information", + "Microsoft.EntityFrameworkCore": "Warning" + } + } +} \ No newline at end of file diff --git a/src/samples/aspnet/Elsa.Samples.DocumentApproval/post-document.http b/src/samples/aspnet/Elsa.Samples.DocumentApproval/post-document.http new file mode 100644 index 000000000..a0c5bc497 --- /dev/null +++ b/src/samples/aspnet/Elsa.Samples.DocumentApproval/post-document.http @@ -0,0 +1,11 @@ +POST http://localhost:62841/documents +Content-Type: application/json + +{ + "Id": "document-1", + "Author": { + "Name": "Amanda" + } +} + +###