2023-07-14 17:19:41 +00:00
|
|
|
using Elsa.Extensions;
|
|
|
|
|
using Elsa.Http.Models;
|
|
|
|
|
using Elsa.Mediator.Contracts;
|
|
|
|
|
using Elsa.Workflows.Core.Helpers;
|
|
|
|
|
using Elsa.Workflows.Management.Models;
|
|
|
|
|
using Elsa.Workflows.Management.Requests;
|
|
|
|
|
using Elsa.Workflows.Management.Responses;
|
|
|
|
|
using Elsa.Workflows.Runtime.Contracts;
|
2023-07-19 22:05:43 +00:00
|
|
|
using Elsa.Workflows.Runtime.Filters;
|
2023-07-14 17:19:41 +00:00
|
|
|
|
|
|
|
|
namespace Elsa.Http.Handlers;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// A <see cref="ValidateWorkflowRequest"/> handler that validates a workflow path and return any errors.
|
|
|
|
|
/// </summary>
|
|
|
|
|
public class ValidateWorkflowRequestHandler : IRequestHandler<ValidateWorkflowRequest, ValidateWorkflowResponse>
|
|
|
|
|
{
|
|
|
|
|
private readonly ITriggerStore _triggerStore;
|
|
|
|
|
private readonly ITriggerIndexer _triggerIndexer;
|
2023-08-25 07:11:22 +00:00
|
|
|
|
2023-07-14 17:19:41 +00:00
|
|
|
/// <summary>
|
|
|
|
|
/// Constructor.
|
|
|
|
|
/// </summary>
|
|
|
|
|
public ValidateWorkflowRequestHandler(ITriggerStore triggerStore, ITriggerIndexer triggerIndexer)
|
|
|
|
|
{
|
|
|
|
|
_triggerStore = triggerStore;
|
|
|
|
|
_triggerIndexer = triggerIndexer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
public async Task<ValidateWorkflowResponse> HandleAsync(ValidateWorkflowRequest request, CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
var workflow = request.Workflow;
|
|
|
|
|
var httpEndpointTriggers = (await _triggerIndexer.GetTriggersAsync(workflow, cancellationToken)).Where(x => x.Payload is HttpEndpointBookmarkPayload).ToList();
|
|
|
|
|
var publishedWorkflowsTriggers = (await _triggerStore.FindManyAsync(new TriggerFilter { Name = ActivityTypeNameHelper.GenerateTypeName(typeof(HttpEndpoint)) }, cancellationToken)).ToList();
|
2023-08-25 07:11:22 +00:00
|
|
|
var validationErrors = new List<WorkflowValidationError>();
|
|
|
|
|
|
2023-07-14 17:19:41 +00:00
|
|
|
foreach (var httpEndpointTrigger in httpEndpointTriggers)
|
|
|
|
|
{
|
2023-08-25 07:11:22 +00:00
|
|
|
var triggerPayload = httpEndpointTrigger.GetPayload<HttpEndpointBookmarkPayload>();
|
|
|
|
|
|
2023-07-14 17:19:41 +00:00
|
|
|
var otherWorkflowsWithSamePath = publishedWorkflowsTriggers
|
2023-08-25 07:11:22 +00:00
|
|
|
.Where(x =>
|
|
|
|
|
x.WorkflowDefinitionId != workflow.Identity.DefinitionId &&
|
|
|
|
|
x.Payload is HttpEndpointBookmarkPayload payload &&
|
|
|
|
|
payload.Path == triggerPayload.Path &&
|
|
|
|
|
payload.Method == triggerPayload.Method)
|
2023-07-14 17:19:41 +00:00
|
|
|
.ToList();
|
|
|
|
|
|
2023-08-25 07:11:22 +00:00
|
|
|
if (!otherWorkflowsWithSamePath.Any())
|
2023-07-14 17:19:41 +00:00
|
|
|
continue;
|
2023-08-25 07:11:22 +00:00
|
|
|
|
|
|
|
|
var message = $"The {triggerPayload.Path} path and {triggerPayload.Method} method are already in use by another workflow!";
|
2023-07-14 17:19:41 +00:00
|
|
|
validationErrors.Add(new WorkflowValidationError(message, httpEndpointTrigger.ActivityId));
|
|
|
|
|
}
|
2023-08-25 07:11:22 +00:00
|
|
|
|
2023-07-14 17:19:41 +00:00
|
|
|
return new ValidateWorkflowResponse(validationErrors);
|
|
|
|
|
}
|
|
|
|
|
}
|