From 005c0eb6ec37918c941fdca249f8cf377541d72b Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Tue, 30 May 2023 20:14:18 +0200 Subject: [PATCH] Update HttpEndpoints sample project --- .../Activities/MapTo.cs | 18 +++++ .../Elsa.Samples.AspNet.HttpEndpoints.csproj | 5 ++ .../Models/Customer.cs | 4 ++ .../Program.cs | 12 +++- .../Workflows/TypedSubmissionWorkflow.cs | 67 +++++++++++++++++++ 5 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 src/samples/aspnet/Elsa.Samples.AspNet.HttpEndpoints/Activities/MapTo.cs create mode 100644 src/samples/aspnet/Elsa.Samples.AspNet.HttpEndpoints/Models/Customer.cs create mode 100644 src/samples/aspnet/Elsa.Samples.AspNet.HttpEndpoints/Workflows/TypedSubmissionWorkflow.cs diff --git a/src/samples/aspnet/Elsa.Samples.AspNet.HttpEndpoints/Activities/MapTo.cs b/src/samples/aspnet/Elsa.Samples.AspNet.HttpEndpoints/Activities/MapTo.cs new file mode 100644 index 000000000..4b9255f2f --- /dev/null +++ b/src/samples/aspnet/Elsa.Samples.AspNet.HttpEndpoints/Activities/MapTo.cs @@ -0,0 +1,18 @@ +using AutoMapper; +using Elsa.Extensions; +using Elsa.Workflows.Core.Models; + +namespace Elsa.Samples.AspNet.HttpEndpoints.Activities; + +public class MapTo : CodeActivity +{ + public Input Source { get; set; } = default!; + + protected override void Execute(ActivityExecutionContext context) + { + var mapper = context.GetRequiredService(); + var source = Source.Get(context); + var destination = mapper.Map(source); + context.SetResult(destination); + } +} \ No newline at end of file diff --git a/src/samples/aspnet/Elsa.Samples.AspNet.HttpEndpoints/Elsa.Samples.AspNet.HttpEndpoints.csproj b/src/samples/aspnet/Elsa.Samples.AspNet.HttpEndpoints/Elsa.Samples.AspNet.HttpEndpoints.csproj index c76dbe5f3..e989670f6 100644 --- a/src/samples/aspnet/Elsa.Samples.AspNet.HttpEndpoints/Elsa.Samples.AspNet.HttpEndpoints.csproj +++ b/src/samples/aspnet/Elsa.Samples.AspNet.HttpEndpoints/Elsa.Samples.AspNet.HttpEndpoints.csproj @@ -13,4 +13,9 @@ + + + + + diff --git a/src/samples/aspnet/Elsa.Samples.AspNet.HttpEndpoints/Models/Customer.cs b/src/samples/aspnet/Elsa.Samples.AspNet.HttpEndpoints/Models/Customer.cs new file mode 100644 index 000000000..708a436ee --- /dev/null +++ b/src/samples/aspnet/Elsa.Samples.AspNet.HttpEndpoints/Models/Customer.cs @@ -0,0 +1,4 @@ +namespace Elsa.Samples.AspNet.HttpEndpoints.Models; + +public record CustomerDto(string Name, string Email); +public record Customer(string Name, string Email); \ No newline at end of file diff --git a/src/samples/aspnet/Elsa.Samples.AspNet.HttpEndpoints/Program.cs b/src/samples/aspnet/Elsa.Samples.AspNet.HttpEndpoints/Program.cs index 4525b3bf5..46039535c 100644 --- a/src/samples/aspnet/Elsa.Samples.AspNet.HttpEndpoints/Program.cs +++ b/src/samples/aspnet/Elsa.Samples.AspNet.HttpEndpoints/Program.cs @@ -1,18 +1,24 @@ using Elsa.Extensions; -using Elsa.Samples.AspNet.HttpEndpoints.Workflows; +using Elsa.Samples.AspNet.HttpEndpoints.Models; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddElsa(elsa => { - // Add workflow. - elsa.AddWorkflow(); + // Add activities. + elsa.AddActivitiesFrom(); + + // Add workflows. + elsa.AddWorkflowsFrom(); // Enable the HTTP feature for HTTP activities. elsa.UseHttp(); }); +// Add AutoMapper for demo purposes. +builder.Services.AddAutoMapper(autoMapper => autoMapper.CreateMap()); + builder.Services.AddAuthorization(); var app = builder.Build(); diff --git a/src/samples/aspnet/Elsa.Samples.AspNet.HttpEndpoints/Workflows/TypedSubmissionWorkflow.cs b/src/samples/aspnet/Elsa.Samples.AspNet.HttpEndpoints/Workflows/TypedSubmissionWorkflow.cs new file mode 100644 index 000000000..07bda6c57 --- /dev/null +++ b/src/samples/aspnet/Elsa.Samples.AspNet.HttpEndpoints/Workflows/TypedSubmissionWorkflow.cs @@ -0,0 +1,67 @@ +using System.Net.Mime; +using Elsa.Extensions; +using Elsa.Http; +using Elsa.Samples.AspNet.HttpEndpoints.Activities; +using Elsa.Samples.AspNet.HttpEndpoints.Models; +using Elsa.Workflows.Core.Abstractions; +using Elsa.Workflows.Core.Activities; +using Elsa.Workflows.Core.Contracts; + +namespace Elsa.Samples.AspNet.HttpEndpoints.Workflows; + +/// +/// A workflow that acts as an HTTP endpoint to which a client can POST a JSON payload which gts parsed into a strongly typed model. +/// +public class TypedSubmissionWorkflow : WorkflowBase +{ + protected override void Build(IWorkflowBuilder builder) + { + // The payload will be deserialized into a Customer object. The JSON must look like this: + // { + // "name": "John Doe", + // "email": "john.doe@localhost" + // } + var customerVariable = builder.WithVariable(); + + var mappedCustomerVariable = builder.WithVariable(); + + builder.Root = new Sequence + { + Activities = + { + // Define an HTTP endpoint. + new HttpEndpoint + { + Path = new("customers"), + SupportedMethods = new(new[]{HttpMethods.Post}), + CanStartWorkflow = true, + ParsedContent = new(customerVariable) + }, + + // Map the DTO to a domain model. + new MapTo + { + Source = new(customerVariable), + Result = new(mappedCustomerVariable) + }, + + // Write a response. + new WriteHttpResponse + { + ContentType = new(MediaTypeNames.Application.Json), + Content = new(context => + { + var customer = mappedCustomerVariable.Get(context)!; + var name = customer.Name; + var email = customer.Email; + + return new + { + Message = $"Dear {name}, thank you for submitting your information! We'll send you an email at {email} shortly.", + }; + }), + } + } + }; + } +} \ No newline at end of file