From b797dd8c43bcacc5e297c3640dfeeb168eec30a8 Mon Sep 17 00:00:00 2001 From: Cameron Cowen Date: Thu, 29 Apr 2021 01:03:16 +0100 Subject: [PATCH] Added builder extensions for sendhttprequest and added initial sample --- Elsa.sln | 17 +++ .../SendHttpRequestBuilderExtensions.cs | 90 +++++++++++++++ .../SendHttpRequestExtensions.cs | 108 ++++++++++++++++++ .../Elsa.Samples.SendHttp.csproj | 12 ++ .../aspnet/Elsa.Samples.SendHttp/Program.cs | 26 +++++ .../Properties/launchSettings.json | 28 +++++ .../Elsa.Samples.SendHttp/SendHttpWorkflow.cs | 26 +++++ .../aspnet/Elsa.Samples.SendHttp/Startup.cs | 29 +++++ .../appsettings.Development.json | 9 ++ .../Elsa.Samples.SendHttp/appsettings.json | 10 ++ 10 files changed, 355 insertions(+) create mode 100644 src/activities/Elsa.Activities.Http/Activities/SendHttpRequest/SendHttpRequestBuilderExtensions.cs create mode 100644 src/activities/Elsa.Activities.Http/Activities/SendHttpRequest/SendHttpRequestExtensions.cs create mode 100644 src/samples/aspnet/Elsa.Samples.SendHttp/Elsa.Samples.SendHttp.csproj create mode 100644 src/samples/aspnet/Elsa.Samples.SendHttp/Program.cs create mode 100644 src/samples/aspnet/Elsa.Samples.SendHttp/Properties/launchSettings.json create mode 100644 src/samples/aspnet/Elsa.Samples.SendHttp/SendHttpWorkflow.cs create mode 100644 src/samples/aspnet/Elsa.Samples.SendHttp/Startup.cs create mode 100644 src/samples/aspnet/Elsa.Samples.SendHttp/appsettings.Development.json create mode 100644 src/samples/aspnet/Elsa.Samples.SendHttp/appsettings.json diff --git a/Elsa.sln b/Elsa.sln index 3e7233459..e2a777377 100644 --- a/Elsa.sln +++ b/Elsa.sln @@ -271,6 +271,8 @@ EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Persistence.EntityFramework.MySql", "src\persistence\Elsa.Persistence.EntityFramework\Elsa.Persistence.EntityFramework.MySql\Elsa.Persistence.EntityFramework.MySql.csproj", "{D55BC08B-CA82-478A-99F7-EDE90AC33160}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elsa.Samples.SendHttp", "src\samples\aspnet\Elsa.Samples.SendHttp\Elsa.Samples.SendHttp.csproj", "{775EFD59-F99C-4D38-B54E-9734C9D9649A}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -645,6 +647,18 @@ Global {D55BC08B-CA82-478A-99F7-EDE90AC33160}.Debug|Any CPU.Build.0 = Debug|Any CPU {D55BC08B-CA82-478A-99F7-EDE90AC33160}.Release|Any CPU.ActiveCfg = Release|Any CPU {D55BC08B-CA82-478A-99F7-EDE90AC33160}.Release|Any CPU.Build.0 = Release|Any CPU + {BE284508-9582-4FCB-B0DD-0761AB940AD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BE284508-9582-4FCB-B0DD-0761AB940AD7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BE284508-9582-4FCB-B0DD-0761AB940AD7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BE284508-9582-4FCB-B0DD-0761AB940AD7}.Release|Any CPU.Build.0 = Release|Any CPU + {3EB488DF-3C28-4DAD-B43E-6062E39629AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3EB488DF-3C28-4DAD-B43E-6062E39629AB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3EB488DF-3C28-4DAD-B43E-6062E39629AB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3EB488DF-3C28-4DAD-B43E-6062E39629AB}.Release|Any CPU.Build.0 = Release|Any CPU + {775EFD59-F99C-4D38-B54E-9734C9D9649A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {775EFD59-F99C-4D38-B54E-9734C9D9649A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {775EFD59-F99C-4D38-B54E-9734C9D9649A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {775EFD59-F99C-4D38-B54E-9734C9D9649A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -771,6 +785,9 @@ Global {3A30EFFE-32D8-40B8-9C62-427037BB5424} = {EEBEA8AF-C8A8-4C71-A96C-D5836DE24359} {3DF05CFC-AC77-489F-9A42-C4FDB599AA69} = {8B6B40A8-DF21-4CD2-BABD-474B79D0C3AF} {D55BC08B-CA82-478A-99F7-EDE90AC33160} = {C865B0FD-E505-48F0-BFAF-0D4D7C1B5CA1} + {BE284508-9582-4FCB-B0DD-0761AB940AD7} = {B43B546E-23F3-46E8-ACB7-D04F05CDA180} + {3EB488DF-3C28-4DAD-B43E-6062E39629AB} = {FC9F520F-BA51-4AD2-BFEE-EF787798E734} + {775EFD59-F99C-4D38-B54E-9734C9D9649A} = {22E75696-6FE9-436A-9097-EE21C603F818} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {8B0975FD-7050-48B0-88C5-48C33378E158} diff --git a/src/activities/Elsa.Activities.Http/Activities/SendHttpRequest/SendHttpRequestBuilderExtensions.cs b/src/activities/Elsa.Activities.Http/Activities/SendHttpRequest/SendHttpRequestBuilderExtensions.cs new file mode 100644 index 000000000..e9983cf62 --- /dev/null +++ b/src/activities/Elsa.Activities.Http/Activities/SendHttpRequest/SendHttpRequestBuilderExtensions.cs @@ -0,0 +1,90 @@ +using Elsa.Activities.Http.Models; +using Elsa.Builders; +using Elsa.Services.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace Elsa.Activities.Http +{ + public static class SendHttpRequestBuilderExtensions + { + public static IActivityBuilder SendHttpRequest(this IActivityBuilder builder, Action> setup, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => + builder.Then(setup, null, lineNumber, sourceFile); + + public static IActivityBuilder SendHttpRequest(this IActivityBuilder builder, + Func url, + Func method, + Func content, + Func contentType, + Func authorization, + Func requestHeaders, + Func readContent, + Func> supportedHttpCodes, + [CallerLineNumber] int lineNumber = default, + [CallerFilePath] string? sourceFile = default) => + builder.SendHttpRequest( + setup => setup + .Set(x => x.Url, url) + .Set(x => x.Method, method) + .Set(x => x.Content, content) + .Set(x => x.ContentType, contentType) + .Set(x => x.Authorization, authorization) + .Set(x => x.RequestHeaders, requestHeaders) + .Set(x => x.ReadContent, readContent) + .Set(x => x.SupportedStatusCodes, supportedHttpCodes), + lineNumber, + sourceFile); + + public static IActivityBuilder SendHttpRequest(this IActivityBuilder builder, + Func url, + Func method, + Func content, + Func contentType, + Func authorization, + Func requestHeaders, + Func readContent, + Func> supportedHttpCodes, + [CallerLineNumber] int lineNumber = default, + [CallerFilePath] string? sourceFile = default) => + builder.SendHttpRequest( + setup => setup + .Set(x => x.Url, url) + .Set(x => x.Method, method) + .Set(x => x.Content, content) + .Set(x => x.ContentType, contentType) + .Set(x => x.Authorization, authorization) + .Set(x => x.RequestHeaders, requestHeaders) + .Set(x => x.ReadContent, readContent) + .Set(x => x.SupportedStatusCodes, supportedHttpCodes), + lineNumber, + sourceFile); + + public static IActivityBuilder SendHttpRequest(this IActivityBuilder builder, + Uri? url, + string? method, + string? content, + string? contentType, + string? authorization, + HttpRequestHeaders requestHeaders, + bool readContent, + ICollection supportedHttpCodes, + [CallerLineNumber] int lineNumber = default, + [CallerFilePath] string? sourceFile = default) => + builder.SendHttpRequest( + setup => setup + .Set(x => x.Url, url) + .Set(x => x.Method, method) + .Set(x => x.Content, content) + .Set(x => x.ContentType, contentType) + .Set(x => x.Authorization, authorization) + .Set(x => x.RequestHeaders, requestHeaders) + .Set(x => x.ReadContent, readContent) + .Set(x => x.SupportedStatusCodes, supportedHttpCodes), + lineNumber, + sourceFile); + } +} diff --git a/src/activities/Elsa.Activities.Http/Activities/SendHttpRequest/SendHttpRequestExtensions.cs b/src/activities/Elsa.Activities.Http/Activities/SendHttpRequest/SendHttpRequestExtensions.cs new file mode 100644 index 000000000..3d99f5467 --- /dev/null +++ b/src/activities/Elsa.Activities.Http/Activities/SendHttpRequest/SendHttpRequestExtensions.cs @@ -0,0 +1,108 @@ +using Elsa.Activities.Http.Models; +using Elsa.Builders; +using Elsa.Services.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +namespace Elsa.Activities.Http +{ + public static class SendHttpRequestExtensions + { + public static ISetupActivity WithUrl(this ISetupActivity activity, Func> url) => activity.Set(x => x.Url, url); + + public static ISetupActivity WithUrl(this ISetupActivity activity, Func> url) => activity.Set(x => x.Url, url); + + public static ISetupActivity WithUrl(this ISetupActivity activity, Func url) => activity.Set(x => x.Url, url); + + public static ISetupActivity WithUrl(this ISetupActivity activity, Func url) => activity.Set(x => x.Url, url); + + public static ISetupActivity WithUrl(this ISetupActivity activity, Uri? url) => activity.Set(x => x.Url, url); + + + public static ISetupActivity WithMethod(this ISetupActivity activity, Func> method) => activity.Set(x => x.Method, method); + + public static ISetupActivity WithMethod(this ISetupActivity activity, Func> method) => activity.Set(x => x.Method, method); + + public static ISetupActivity WithMethod(this ISetupActivity activity, Func method) => activity.Set(x => x.Method, method); + + public static ISetupActivity WithMethod(this ISetupActivity activity, Func method) => activity.Set(x => x.Method, method); + + public static ISetupActivity WithMethod(this ISetupActivity activity, string? method) => activity.Set(x => x.Method, method); + + + public static ISetupActivity WithContent(this ISetupActivity activity, Func> content + ) => activity.Set(x => x.Content, content); + + public static ISetupActivity WithContent(this ISetupActivity activity, Func> content) => activity.Set(x => x.Content, content); + + public static ISetupActivity WithContent(this ISetupActivity activity, Func content) => activity.Set(x => x.Content, content); + + public static ISetupActivity WithContent(this ISetupActivity activity, Func content) => activity.Set(x => x.Content, content); + + public static ISetupActivity WithContent(this ISetupActivity activity, string? content) => activity.Set(x => x.Content, content); + + + public static ISetupActivity WithContentType(this ISetupActivity activity, Func> contentType + ) => activity.Set(x => x.ContentType, contentType); + + public static ISetupActivity WithContentType(this ISetupActivity activity, Func> contentType) => activity.Set(x => x.ContentType, contentType); + + public static ISetupActivity WithContentType(this ISetupActivity activity, Func contentType) => activity.Set(x => x.ContentType, contentType); + + public static ISetupActivity WithContentType(this ISetupActivity activity, Func contentType) => activity.Set(x => x.ContentType, contentType); + + public static ISetupActivity WithContentType(this ISetupActivity activity, string? contentType) => activity.Set(x => x.ContentType, contentType); + + + public static ISetupActivity WithAuthorization(this ISetupActivity activity, Func> authorization + ) => activity.Set(x => x.Authorization, authorization); + + public static ISetupActivity WithAuthorization(this ISetupActivity activity, Func> authorization) => activity.Set(x => x.Authorization, authorization); + + public static ISetupActivity WithAuthorization(this ISetupActivity activity, Func authorization) => activity.Set(x => x.Authorization, authorization); + + public static ISetupActivity WithAuthorization(this ISetupActivity activity, Func authorization) => activity.Set(x => x.Authorization, authorization); + + public static ISetupActivity WithAuthorization(this ISetupActivity activity, string? authorization) => activity.Set(x => x.Authorization, authorization); + + + public static ISetupActivity WithRequestHeaders(this ISetupActivity activity, Func> requestHeaders + ) => activity.Set(x => x.RequestHeaders, requestHeaders); + + public static ISetupActivity WithRequestHeaders(this ISetupActivity activity, Func> requestHeaders) => activity.Set(x => x.RequestHeaders, requestHeaders); + + public static ISetupActivity WithRequestHeaders(this ISetupActivity activity, Func requestHeaders) => activity.Set(x => x.RequestHeaders, requestHeaders); + + public static ISetupActivity WithRequestHeaders(this ISetupActivity activity, Func requestHeaders) => activity.Set(x => x.RequestHeaders, requestHeaders); + + public static ISetupActivity WithRequestHeaders(this ISetupActivity activity, HttpRequestHeaders? requestHeaders) => activity.Set(x => x.RequestHeaders, requestHeaders); + + + public static ISetupActivity WithReadContent(this ISetupActivity activity, Func> readContent + ) => activity.Set(x => x.ReadContent, readContent); + + public static ISetupActivity WithReadContent(this ISetupActivity activity, Func> readContent) => activity.Set(x => x.ReadContent, readContent); + + public static ISetupActivity WithReadContent(this ISetupActivity activity, Func readContent) => activity.Set(x => x.ReadContent, readContent); + + public static ISetupActivity WithReadContent(this ISetupActivity activity, Func readContent) => activity.Set(x => x.ReadContent, readContent); + + public static ISetupActivity WithReadContent(this ISetupActivity activity, bool? readContent) => activity.Set(x => x.ReadContent, readContent); + + + public static ISetupActivity WithSupportedHttpCodes(this ISetupActivity activity, Func>> supportedHttpCodes + ) => activity.Set(x => x.SupportedStatusCodes, supportedHttpCodes); + + public static ISetupActivity WithSupportedHttpCodes(this ISetupActivity activity, Func>> supportedHttpCodes) => activity.Set(x => x.SupportedStatusCodes, supportedHttpCodes); + + public static ISetupActivity WithSupportedHttpCodes(this ISetupActivity activity, Func> supportedHttpCodes) => activity.Set(x => x.SupportedStatusCodes, supportedHttpCodes); + + public static ISetupActivity WithSupportedHttpCodes(this ISetupActivity activity, Func> supportedHttpCodes) => activity.Set(x => x.SupportedStatusCodes, supportedHttpCodes); + + public static ISetupActivity WithSupportedHttpCodes(this ISetupActivity activity, ICollection supportedHttpCodes) => activity.Set(x => x.SupportedStatusCodes, supportedHttpCodes); + } +} diff --git a/src/samples/aspnet/Elsa.Samples.SendHttp/Elsa.Samples.SendHttp.csproj b/src/samples/aspnet/Elsa.Samples.SendHttp/Elsa.Samples.SendHttp.csproj new file mode 100644 index 000000000..f8ceca7a9 --- /dev/null +++ b/src/samples/aspnet/Elsa.Samples.SendHttp/Elsa.Samples.SendHttp.csproj @@ -0,0 +1,12 @@ + + + + net5.0 + + + + + + + + diff --git a/src/samples/aspnet/Elsa.Samples.SendHttp/Program.cs b/src/samples/aspnet/Elsa.Samples.SendHttp/Program.cs new file mode 100644 index 000000000..33f467d85 --- /dev/null +++ b/src/samples/aspnet/Elsa.Samples.SendHttp/Program.cs @@ -0,0 +1,26 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Elsa.Samples.SendHttp +{ + 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(); + }); + } +} diff --git a/src/samples/aspnet/Elsa.Samples.SendHttp/Properties/launchSettings.json b/src/samples/aspnet/Elsa.Samples.SendHttp/Properties/launchSettings.json new file mode 100644 index 000000000..142f1a8f1 --- /dev/null +++ b/src/samples/aspnet/Elsa.Samples.SendHttp/Properties/launchSettings.json @@ -0,0 +1,28 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:8929", + "sslPort": 44312 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Elsa.Samples.SendHttp": { + "commandName": "Project", + "dotnetRunMessages": "true", + "launchBrowser": true, + "applicationUrl": "https://localhost:5001;http://localhost:5000", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/src/samples/aspnet/Elsa.Samples.SendHttp/SendHttpWorkflow.cs b/src/samples/aspnet/Elsa.Samples.SendHttp/SendHttpWorkflow.cs new file mode 100644 index 000000000..89cdf278f --- /dev/null +++ b/src/samples/aspnet/Elsa.Samples.SendHttp/SendHttpWorkflow.cs @@ -0,0 +1,26 @@ +using Elsa.Activities.Http; +using Elsa.Builders; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Elsa.Samples.SendHttp +{ + public class SendHttpWorkflow : IWorkflow + { + public void Build(IWorkflowBuilder builder) + { + builder.WithWorkflowDefinitionId("SendHttp") + .WithVersion(1) + .WithDescription("Send test http request and return response") + .HttpEndpoint(setup => setup.WithPath("/helloworld") + .WithMethod("GET")) + .SendHttpRequest(setup => setup.WithUrl(new Uri("https://jsonplaceholder.typicode.com/todos/3")) + .WithMethod("GET") + .WithReadContent(true)) + .WriteHttpResponse(setup => setup.WithStatusCode(System.Net.HttpStatusCode.OK) + .WithContent("Hello World")); + } + } +} diff --git a/src/samples/aspnet/Elsa.Samples.SendHttp/Startup.cs b/src/samples/aspnet/Elsa.Samples.SendHttp/Startup.cs new file mode 100644 index 000000000..cf3a4a6a7 --- /dev/null +++ b/src/samples/aspnet/Elsa.Samples.SendHttp/Startup.cs @@ -0,0 +1,29 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Elsa.Samples.SendHttp +{ + public class Startup + { + // This method gets called by the runtime. Use this method to add services to the container. + // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 + public void ConfigureServices(IServiceCollection services) + { + services.AddElsa(options => options.AddHttpActivities() + .AddWorkflowsFrom()); + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + app.UseHttpActivities(); + } + } +} diff --git a/src/samples/aspnet/Elsa.Samples.SendHttp/appsettings.Development.json b/src/samples/aspnet/Elsa.Samples.SendHttp/appsettings.Development.json new file mode 100644 index 000000000..8983e0fc1 --- /dev/null +++ b/src/samples/aspnet/Elsa.Samples.SendHttp/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + } +} diff --git a/src/samples/aspnet/Elsa.Samples.SendHttp/appsettings.json b/src/samples/aspnet/Elsa.Samples.SendHttp/appsettings.json new file mode 100644 index 000000000..d9d9a9bff --- /dev/null +++ b/src/samples/aspnet/Elsa.Samples.SendHttp/appsettings.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "AllowedHosts": "*" +}