("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"
+ }
+}
+
+###