using Elsa.Abstractions; using Elsa.Mediator.Contracts; using Elsa.Webhooks.Notifications; using Elsa.Workflows.Runtime; using JetBrains.Annotations; using Microsoft.AspNetCore.Http; using WebhooksCore; namespace Elsa.Webhooks.Endpoints.Webhooks; /// /// An API endpoint that receives webhook events from a webhook source. /// [PublicAPI] internal class Post(IWebhookSourceProvider webhookSourceProvider, INotificationSender notificationSender, IStimulusSender stimulusSender) : ElsaEndpointWithoutRequest { /// public override void Configure() { Routes("/webhooks"); Verbs(FastEndpoints.Http.POST); AllowAnonymous(); } /// public override async Task HandleAsync(CancellationToken cancellationToken) { var webhookEvent = (await HttpContext.Request.ReadFromJsonAsync(cancellationToken))!; var webhookSources = (await webhookSourceProvider.ListAsync(cancellationToken)).ToList(); var matchingSource = webhookSources.FirstOrDefault(source => source.EventTypes.Any(eventType => eventType.EventType == webhookEvent.EventType)); if (matchingSource == null) { await SendOkAsync(cancellationToken); return; } var notification = new WebhookEventReceived(webhookEvent, matchingSource); await notificationSender.SendAsync(notification, cancellationToken); } }