diff --git a/src/clients/Elsa.Api.Client/Resources/WorkflowDefinitions/Contracts/IWorkflowDefinitionsApi.cs b/src/clients/Elsa.Api.Client/Resources/WorkflowDefinitions/Contracts/IWorkflowDefinitionsApi.cs index 5fc8e2e70..80bc0d1bb 100644 --- a/src/clients/Elsa.Api.Client/Resources/WorkflowDefinitions/Contracts/IWorkflowDefinitionsApi.cs +++ b/src/clients/Elsa.Api.Client/Resources/WorkflowDefinitions/Contracts/IWorkflowDefinitionsApi.cs @@ -22,14 +22,23 @@ public interface IWorkflowDefinitionsApi Task ListAsync([Query]ListWorkflowDefinitionsRequest request, [Query]VersionOptions? versionOptions = default, CancellationToken cancellationToken = default); /// - /// Gets a workflow definition. + /// Gets a workflow definition by definition ID. /// - /// The ID of the workflow definition to get. + /// The definition ID of the workflow definition to get. /// The version options. /// Whether to include the root activity of composite activities. /// The cancellation token. - [Get("/workflow-definitions/{definitionId}?versionOptions={versionOptions}&includeCompositeRoot={includeCompositeRoot}")] - Task GetAsync(string definitionId, VersionOptions? versionOptions = default, bool includeCompositeRoot = false, CancellationToken cancellationToken = default); + [Get("/workflow-definitions/by-definition-id/{definitionId}?versionOptions={versionOptions}&includeCompositeRoot={includeCompositeRoot}")] + Task GetByDefinitionIdAsync(string definitionId, VersionOptions? versionOptions = default, bool includeCompositeRoot = false, CancellationToken cancellationToken = default); + + /// + /// Gets a workflow definition by ID. + /// + /// The ID of the workflow definition to get. + /// Whether to include the root activity of composite activities. + /// The cancellation token. + [Get("/workflow-definitions/by-id/{id}?includeCompositeRoot={includeCompositeRoot}")] + Task GetByIdAsync(string id, bool includeCompositeRoot = false, CancellationToken cancellationToken = default); /// /// Gets the number of workflow definitions. diff --git a/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Get/Endpoint.cs b/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/GetByDefinitionId/Endpoint.cs similarity index 82% rename from src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Get/Endpoint.cs rename to src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/GetByDefinitionId/Endpoint.cs index bf121295d..ddb7de686 100644 --- a/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Get/Endpoint.cs +++ b/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/GetByDefinitionId/Endpoint.cs @@ -6,17 +6,19 @@ using Elsa.Workflows.Core.Serialization.Converters; using Elsa.Workflows.Management.Contracts; using Elsa.Workflows.Management.Filters; using Elsa.Workflows.Management.Mappers; +using JetBrains.Annotations; using Microsoft.AspNetCore.Http; -namespace Elsa.Workflows.Api.Endpoints.WorkflowDefinitions.Get; +namespace Elsa.Workflows.Api.Endpoints.WorkflowDefinitions.GetByDefinitionId; -internal class Get : ElsaEndpoint +[PublicAPI] +internal class GetByDefinitionId : ElsaEndpoint { private readonly IWorkflowDefinitionStore _store; private readonly IApiSerializer _apiSerializer; private readonly WorkflowDefinitionMapper _mapper; - public Get(IWorkflowDefinitionStore store, IApiSerializer apiSerializer, WorkflowDefinitionMapper mapper) + public GetByDefinitionId(IWorkflowDefinitionStore store, IApiSerializer apiSerializer, WorkflowDefinitionMapper mapper) { _store = store; _apiSerializer = apiSerializer; @@ -25,7 +27,7 @@ internal class Get : ElsaEndpoint public override void Configure() { - Get("/workflow-definitions/{definitionId}"); + Get("/workflow-definitions/by-definition-id/{definitionId}", "/workflow-definitions/{definitionId}"); ConfigurePermissions("read:workflow-definitions"); } diff --git a/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Get/Models.cs b/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/GetByDefinitionId/Models.cs similarity index 80% rename from src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Get/Models.cs rename to src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/GetByDefinitionId/Models.cs index b5f4f033e..821ebdc35 100644 --- a/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Get/Models.cs +++ b/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/GetByDefinitionId/Models.cs @@ -1,4 +1,4 @@ -namespace Elsa.Workflows.Api.Endpoints.WorkflowDefinitions.Get; +namespace Elsa.Workflows.Api.Endpoints.WorkflowDefinitions.GetByDefinitionId; internal class Request { diff --git a/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/GetById/Endpoint.cs b/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/GetById/Endpoint.cs new file mode 100644 index 000000000..d6a5fb973 --- /dev/null +++ b/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/GetById/Endpoint.cs @@ -0,0 +1,58 @@ +using Elsa.Abstractions; +using Elsa.Common.Entities; +using Elsa.Common.Models; +using Elsa.Workflows.Core.Contracts; +using Elsa.Workflows.Core.Serialization.Converters; +using Elsa.Workflows.Management.Contracts; +using Elsa.Workflows.Management.Filters; +using Elsa.Workflows.Management.Mappers; +using JetBrains.Annotations; +using Microsoft.AspNetCore.Http; + +namespace Elsa.Workflows.Api.Endpoints.WorkflowDefinitions.GetById; + +[PublicAPI] +internal class GetById : ElsaEndpoint +{ + private readonly IWorkflowDefinitionStore _store; + private readonly IApiSerializer _apiSerializer; + private readonly WorkflowDefinitionMapper _mapper; + + public GetById(IWorkflowDefinitionStore store, IApiSerializer apiSerializer, WorkflowDefinitionMapper mapper) + { + _store = store; + _apiSerializer = apiSerializer; + _mapper = mapper; + } + + public override void Configure() + { + Get("/workflow-definitions/by-id/{id}"); + ConfigurePermissions("read:workflow-definitions"); + } + + public override async Task HandleAsync(Request request, CancellationToken cancellationToken) + { + var filter = new WorkflowDefinitionFilter + { + Id = request.Id + }; + + var definition = (await _store.FindManyAsync(filter, cancellationToken)).FirstOrDefault(); + + if (definition == null) + { + await SendNotFoundAsync(cancellationToken); + return; + } + + var model = await _mapper.MapAsync(definition, cancellationToken); + var serializerOptions = _apiSerializer.CreateOptions(); + + // If the root of composite activities is not requested, exclude them from being serialized. + if (!request.IncludeCompositeRoot) + serializerOptions.Converters.Add(new JsonIgnoreCompositeRootConverterFactory()); + + await HttpContext.Response.WriteAsJsonAsync(model, serializerOptions, cancellationToken); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/GetById/Models.cs b/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/GetById/Models.cs new file mode 100644 index 000000000..8c88d6420 --- /dev/null +++ b/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/GetById/Models.cs @@ -0,0 +1,11 @@ +namespace Elsa.Workflows.Api.Endpoints.WorkflowDefinitions.GetById; + +internal class Request +{ + public string Id { get; set; } = default!; + + /// + /// True if the response should include the root activity of composite activities. + /// + public bool IncludeCompositeRoot { get; set; } +} \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Import/Endpoint.cs b/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Import/Endpoint.cs index 2b5e6eb47..822e7b650 100644 --- a/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Import/Endpoint.cs +++ b/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Import/Endpoint.cs @@ -53,7 +53,7 @@ internal class Import : ElsaEndpoint(new { DefinitionId = definitionId }, updatedModel, cancellation: cancellationToken); + await SendCreatedAtAsync(new { DefinitionId = definitionId }, updatedModel, cancellation: cancellationToken); else await SendOkAsync(updatedModel, cancellationToken); } diff --git a/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Post/Endpoint.cs b/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Post/Endpoint.cs index 63851db34..3d887de3d 100644 --- a/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Post/Endpoint.cs +++ b/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/Post/Endpoint.cs @@ -95,7 +95,7 @@ internal class Post : ElsaEndpoint(new { definitionId }, response, cancellation: cancellationToken); + await SendCreatedAtAsync(new { definitionId }, response, cancellation: cancellationToken); else { await HttpContext.Response.WriteAsJsonAsync(response, serializerOptions, cancellationToken);