elsa-core/src/modules/Elsa.Http/Activities/HttpEndpoint.cs

67 lines
2.4 KiB
C#
Raw Normal View History

2022-01-04 08:42:12 +00:00
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
2022-04-07 10:51:08 +00:00
using System.Text.Json.Serialization;
using Elsa.Expressions.Models;
using Elsa.Http.Models;
using Elsa.Workflows.Core;
using Elsa.Workflows.Core.Attributes;
using Elsa.Workflows.Core.Models;
using Elsa.Workflows.Management.Models;
2022-01-04 08:42:12 +00:00
namespace Elsa.Http;
2022-01-04 08:42:12 +00:00
2022-05-03 07:46:27 +00:00
[Activity("Elsa", "HTTP", "Wait for an inbound HTTP request that matches the specified path and methods.")]
public class HttpEndpoint : Trigger<HttpRequestModel>
2022-01-04 08:42:12 +00:00
{
public const string InputKey = "HttpRequest";
2022-04-07 10:51:08 +00:00
[JsonConstructor]
public HttpEndpoint()
{
}
2022-01-04 08:42:12 +00:00
[Input] public Input<string> Path { get; set; } = default!;
[Input(
2022-04-04 14:00:10 +00:00
Options = new[] { "GET", "POST", "PUT", "HEAD", "DELETE" },
2022-01-04 08:42:12 +00:00
UIHint = InputUIHints.CheckList
)]
public Input<ICollection<string>> SupportedMethods { get; set; } = new(new[] { HttpMethod.Get.Method });
[Input(
Description = "Allow authenticated requests only",
Category = "Security"
)]
public Input<bool> Authorize { get; set; } = new(false);
[Input(
Description = "Provide a policy to evaluate. If the policy fails, the request is forbidden.",
Category = "Security"
)]
public Input<string?> Policy { get; set; } = new(default(string?));
2022-01-04 08:42:12 +00:00
2022-08-10 14:02:53 +00:00
protected override IEnumerable<object> GetTriggerPayload(TriggerIndexingContext context) => GetBookmarkPayload(context.ExpressionExecutionContext);
protected override void Execute(ActivityExecutionContext context)
{
// If we did not receive external input, it means we are just now encountering this activity and we need to block execution by creating a bookmark.
2022-06-06 18:14:51 +00:00
if (!context.TryGetInput<HttpRequestModel>(InputKey, out var request))
{
// Create bookmarks for when we receive the expected HTTP request.
2022-08-10 14:02:53 +00:00
context.CreateBookmarks(GetBookmarkPayload(context.ExpressionExecutionContext));
return;
}
// Provide the received HTTP request as output.
context.Set(Result, request);
}
2022-01-04 08:42:12 +00:00
2022-08-10 14:02:53 +00:00
private IEnumerable<object> GetBookmarkPayload(ExpressionExecutionContext context)
2022-01-04 08:42:12 +00:00
{
2022-03-07 11:01:27 +00:00
// Generate bookmark data for path and selected methods.
var path = context.Get(Path);
var methods = context.Get(SupportedMethods);
return methods!.Select(x => new HttpEndpointBookmarkPayload(path!, x.ToLowerInvariant())).Cast<object>().ToArray();
2022-01-04 08:42:12 +00:00
}
}