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); } }