From c07e561ad3f0e88535c0b7c8f7b3f0d5e24aee79 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Tue, 16 May 2023 22:37:08 +0200 Subject: [PATCH] Update API client --- .../Converters/VersionOptionsJsonConverter.cs | 24 +++++++++++++++++++ .../Converters/VersionOptionsTypeConverter.cs | 17 +++++++++++++ .../DependencyInjectionExtensions.cs | 3 ++- .../Contracts/IWorkflowDefinitionsApi.cs | 6 +++-- .../Models/ListWorkflowDefinitionsRequest.cs | 14 ++++++----- .../Shared/Models/VersionOptions.cs | 11 +++++++++ .../components/browser.tsx | 12 +++++----- .../WorkflowDefinitions/List/Endpoint.cs | 7 +++--- 8 files changed, 75 insertions(+), 19 deletions(-) create mode 100644 src/clients/Elsa.Api.Client/Converters/VersionOptionsJsonConverter.cs create mode 100644 src/clients/Elsa.Api.Client/Converters/VersionOptionsTypeConverter.cs diff --git a/src/clients/Elsa.Api.Client/Converters/VersionOptionsJsonConverter.cs b/src/clients/Elsa.Api.Client/Converters/VersionOptionsJsonConverter.cs new file mode 100644 index 000000000..0da7b64ff --- /dev/null +++ b/src/clients/Elsa.Api.Client/Converters/VersionOptionsJsonConverter.cs @@ -0,0 +1,24 @@ +using System.Text.Json; +using System.Text.Json.Serialization; +using Elsa.Api.Client.Shared.Models; + +namespace Elsa.Api.Client.Converters; + +/// +/// A JSON converter that serializes . +/// +public class VersionOptionsJsonConverter : JsonConverter +{ + /// + public override VersionOptions Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + var textValue = reader.GetString(); + return string.IsNullOrWhiteSpace(textValue) ? VersionOptions.Published : VersionOptions.FromString(textValue); + } + + /// + public override void Write(Utf8JsonWriter writer, VersionOptions value, JsonSerializerOptions options) + { + writer.WriteStringValue(value.ToString()); + } +} \ No newline at end of file diff --git a/src/clients/Elsa.Api.Client/Converters/VersionOptionsTypeConverter.cs b/src/clients/Elsa.Api.Client/Converters/VersionOptionsTypeConverter.cs new file mode 100644 index 000000000..16945d9b4 --- /dev/null +++ b/src/clients/Elsa.Api.Client/Converters/VersionOptionsTypeConverter.cs @@ -0,0 +1,17 @@ +using System.ComponentModel; +using System.Globalization; +using Elsa.Api.Client.Shared.Models; + +namespace Elsa.Api.Client.Converters; + +/// +/// A type converter that converts to and from strings. +/// +public class VersionOptionsTypeConverter : TypeConverter +{ + /// + public override bool CanConvertFrom(ITypeDescriptorContext? context, Type sourceType) => sourceType == typeof(string) || base.CanConvertFrom(context, sourceType); + + /// + public override object ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object value) => value is string text ? VersionOptions.FromString(text) : base.ConvertFrom(context, culture, value)!; +} \ No newline at end of file diff --git a/src/clients/Elsa.Api.Client/Extensions/DependencyInjectionExtensions.cs b/src/clients/Elsa.Api.Client/Extensions/DependencyInjectionExtensions.cs index cbec2b253..d60e674e0 100644 --- a/src/clients/Elsa.Api.Client/Extensions/DependencyInjectionExtensions.cs +++ b/src/clients/Elsa.Api.Client/Extensions/DependencyInjectionExtensions.cs @@ -36,7 +36,8 @@ public static class DependencyInjectionExtensions /// The API type. public static void AddElsaApiClient(this IServiceCollection services, RefitSettings settings) where T : class { - services.AddRefitClient(settings).ConfigureHttpClient(ConfigureElsaApiHttpClient); + services.AddRefitClient(settings) + .ConfigureHttpClient(ConfigureElsaApiHttpClient); } private static void ConfigureElsaApiHttpClient(IServiceProvider serviceProvider, HttpClient httpClient) 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 93bdc9a44..94d8eae14 100644 --- a/src/clients/Elsa.Api.Client/Resources/WorkflowDefinitions/Contracts/IWorkflowDefinitionsApi.cs +++ b/src/clients/Elsa.Api.Client/Resources/WorkflowDefinitions/Contracts/IWorkflowDefinitionsApi.cs @@ -1,4 +1,5 @@ using Elsa.Api.Client.Resources.WorkflowDefinitions.Models; +using Elsa.Api.Client.Shared.Models; using Refit; namespace Elsa.Api.Client.Resources.WorkflowDefinitions.Contracts; @@ -12,10 +13,11 @@ public interface IWorkflowDefinitionsApi /// Lists workflow definitions. /// /// The request containing options for listing workflow definitions. + /// The version options. /// The cancellation token. /// The response containing the workflow definitions. - [Get("/workflow-definitions")] - Task ListAsync(ListWorkflowDefinitionsRequest request, CancellationToken cancellationToken = default); + [Get("/workflow-definitions?versionOptions={VersionOptions}")] + Task ListAsync([Query]ListWorkflowDefinitionsRequest request, VersionOptions? versionOptions = default, CancellationToken cancellationToken = default); /// /// Deletes a workflow definition. diff --git a/src/clients/Elsa.Api.Client/Resources/WorkflowDefinitions/Models/ListWorkflowDefinitionsRequest.cs b/src/clients/Elsa.Api.Client/Resources/WorkflowDefinitions/Models/ListWorkflowDefinitionsRequest.cs index 35cea5227..4973b1b83 100644 --- a/src/clients/Elsa.Api.Client/Resources/WorkflowDefinitions/Models/ListWorkflowDefinitionsRequest.cs +++ b/src/clients/Elsa.Api.Client/Resources/WorkflowDefinitions/Models/ListWorkflowDefinitionsRequest.cs @@ -19,17 +19,19 @@ public class ListWorkflowDefinitionsRequest public int? PageSize { get; set; } /// - /// The version options. + /// The IDs of the workflow definitions to filter by. /// - public VersionOptions? Version { get; set; } - + public ICollection? DefinitionIds { get; set; } + /// /// The name of the workflow materializer to filter by. /// - [AliasAs("materializer")] public string? MaterializerName { get; set; } - + [AliasAs("materializer")] + public string? MaterializerName { get; set; } + /// /// The labels to filter by. /// - [AliasAs("label")] public string[]? Labels { get; set; } + [AliasAs("label")] + public string[]? Labels { get; set; } } \ No newline at end of file diff --git a/src/clients/Elsa.Api.Client/Shared/Models/VersionOptions.cs b/src/clients/Elsa.Api.Client/Shared/Models/VersionOptions.cs index 40073d4ae..344f08df6 100644 --- a/src/clients/Elsa.Api.Client/Shared/Models/VersionOptions.cs +++ b/src/clients/Elsa.Api.Client/Shared/Models/VersionOptions.cs @@ -1,3 +1,6 @@ +using System.ComponentModel; +using System.Text.Json.Serialization; +using Elsa.Api.Client.Converters; using JetBrains.Annotations; namespace Elsa.Api.Client.Shared.Models; @@ -6,6 +9,8 @@ namespace Elsa.Api.Client.Shared.Models; /// Represents the version to get. /// [PublicAPI] +[TypeConverter(typeof(VersionOptionsTypeConverter))] +[JsonConverter(typeof(VersionOptionsJsonConverter))] public struct VersionOptions { /// @@ -58,6 +63,12 @@ public struct VersionOptions _ => SpecificVersion(int.Parse(value)) }; + /// + /// Tries to parse a string into a . + /// + /// The value to parse. + /// The parsed value. + /// true if the value was parsed successfully, otherwise false. public static bool TryParse(string value, out VersionOptions versionOptions) { versionOptions = FromString(value); diff --git a/src/designer/designer_packages/elsa-workflows-designer/src/modules/workflow-definitions/components/browser.tsx b/src/designer/designer_packages/elsa-workflows-designer/src/modules/workflow-definitions/components/browser.tsx index e6ba206b6..44f24b63d 100644 --- a/src/designer/designer_packages/elsa-workflows-designer/src/modules/workflow-definitions/components/browser.tsx +++ b/src/designer/designer_packages/elsa-workflows-designer/src/modules/workflow-definitions/components/browser.tsx @@ -44,7 +44,7 @@ export class WorkflowDefinitionBrowser { @State() private selectAllChecked: boolean; async componentWillLoad() { - var persistedRequest = getRequest() + const persistedRequest = getRequest(); if (persistedRequest) { this.currentPage = persistedRequest.page @@ -83,7 +83,7 @@ export class WorkflowDefinitionBrowser { } private onDeleteManyClick = async () => { - if(this.selectedWorkflowDefinitionIds.length == 0) + if(this.selectedWorkflowDefinitionIds.length == 0) return; this.modalDialogService.show( @@ -99,7 +99,7 @@ export class WorkflowDefinitionBrowser { }; private onPublishManyClick = async () => { - if(this.selectedWorkflowDefinitionIds.length == 0) + if(this.selectedWorkflowDefinitionIds.length == 0) return; this.modalDialogService.show( @@ -114,9 +114,9 @@ export class WorkflowDefinitionBrowser { }; private onUnpublishManyClick = async () => { - if(this.selectedWorkflowDefinitionIds.length == 0) + if(this.selectedWorkflowDefinitionIds.length == 0) return; - + this.modalDialogService.show( () => DefaultContents.Warning("Are you sure you want to unpublish selected workflow definitions?"), { @@ -138,7 +138,7 @@ export class WorkflowDefinitionBrowser { // TODO: Load only json-based workflow definitions for now. // Later, also allow CLR-based workflows to be "edited" (publish / unpublish / position activities / set variables, etc.) const materializerName = 'Json'; - + var request: ListWorkflowDefinitionsRequest = { materializerName, page: this.currentPage, diff --git a/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/List/Endpoint.cs b/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/List/Endpoint.cs index 0697c532f..853d73d7a 100644 --- a/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/List/Endpoint.cs +++ b/src/modules/Elsa.Workflows.Api/Endpoints/WorkflowDefinitions/List/Endpoint.cs @@ -45,15 +45,14 @@ internal class List : ElsaEndpoint private async Task> FindAsync(Request request, WorkflowDefinitionFilter filter, PageArgs pageArgs, CancellationToken cancellationToken) { - request.OrderBy = request.OrderBy ?? OrderByWfDefinition.Created; + request.OrderBy ??= OrderByWfDefinition.Created; var direction = request.OrderBy == OrderByWfDefinition.Name ? (request.OrderDirection ?? OrderDirection.Ascending) : (request.OrderDirection ?? OrderDirection.Descending); switch (request.OrderBy) { default: - case OrderByWfDefinition.Created: - { + { var order = new WorkflowDefinitionOrder { KeySelector = p => p.CreatedAt, @@ -66,7 +65,7 @@ internal class List : ElsaEndpoint { var order = new WorkflowDefinitionOrder { - KeySelector = p => p.Name, + KeySelector = p => p.Name ?? string.Empty, Direction = direction };