using Elsa.Extensions;
using Elsa.Http.Bookmarks;
using Elsa.Http.Contexts;
using Elsa.Workflows;
using Elsa.Workflows.Models;
using Elsa.Workflows.Runtime;
using Elsa.Workflows.Runtime.Entities;
using Elsa.Workflows.Runtime.Filters;
namespace Elsa.Http.Services;
///
public class DefaultRouteTableUpdater(
IRouteTable routeTable,
ITriggerStore triggerStore,
IBookmarkStore bookmarkStore,
IHttpEndpointRoutesProvider httpEndpointRoutesProvider)
: IRouteTableUpdater
{
///
public async Task UpdateAsync(CancellationToken cancellationToken = default)
{
var stimulusName = HttpStimulusNames.HttpEndpoint;
var triggerFilter = new TriggerFilter
{
Name = stimulusName
};
var bookmarkFilter = new BookmarkFilter
{
Name = stimulusName
};
var triggers = (await triggerStore.FindManyAsync(triggerFilter, cancellationToken)).ToList();
var bookmarks = (await bookmarkStore.FindManyAsync(bookmarkFilter, cancellationToken)).ToList();
await AddRoutesAsync(triggers, cancellationToken);
await AddRoutesAsync(bookmarks, cancellationToken);
}
public async Task AddRoutesAsync(IEnumerable triggers, CancellationToken cancellationToken = default)
{
var httpEndpointTriggers = Filter(triggers).ToList();
foreach (var trigger in httpEndpointTriggers)
{
var payload = trigger.GetPayload();
await AddRoutesAsync(payload, trigger.TenantId, cancellationToken);
}
}
public async Task AddRoutesAsync(IEnumerable bookmarks, CancellationToken cancellationToken = default)
{
var httpEndpointBookmarks = Filter(bookmarks).ToList();
foreach (var bookmark in httpEndpointBookmarks)
{
var payload = bookmark.GetPayload();
await AddRoutesAsync(payload, bookmark.TenantId, cancellationToken);
}
}
public async Task AddRoutesAsync(IEnumerable bookmarks, WorkflowExecutionContext workflowExecutionContext, CancellationToken cancellationToken = default)
{
var httpEndpointBookmarks = Filter(bookmarks).ToList();
foreach (var bookmark in httpEndpointBookmarks)
{
var payload = bookmark.GetPayload();
await AddRoutesAsync(payload, workflowExecutionContext.Workflow.Identity.TenantId, cancellationToken);
}
}
public void RemoveRoutes(IEnumerable triggers)
{
var paths = Filter(triggers).Select(x => x.GetPayload().Path).ToList();
routeTable.RemoveRange(paths);
}
public void RemoveRoutes(IEnumerable bookmarks)
{
var paths = Filter(bookmarks).Select(x => x.GetPayload().Path).ToList();
routeTable.RemoveRange(paths);
}
private async Task AddRoutesAsync(HttpEndpointBookmarkPayload payload, string? tenantId, CancellationToken cancellationToken)
{
var context = new HttpEndpointRouteProviderContext(payload, tenantId, cancellationToken);
var routes = await httpEndpointRoutesProvider.GetRoutesAsync(context);
foreach (var route in routes)
routeTable.Add(route);
}
private static IEnumerable Filter(IEnumerable triggers)
{
var stimulusName = HttpStimulusNames.HttpEndpoint;
return triggers.Where(x => x.Name == stimulusName && x.Payload != null);
}
private static IEnumerable Filter(IEnumerable bookmarks)
{
var stimulusName = HttpStimulusNames.HttpEndpoint;
return bookmarks.Where(x => x.Name == stimulusName && x.Payload != null);
}
private static IEnumerable Filter(IEnumerable bookmarks)
{
var stimulusName = HttpStimulusNames.HttpEndpoint;
return bookmarks.Where(x => x.Name == stimulusName && x.Payload != null);
}
}