Update API client

This commit is contained in:
Sipke Schoorstra 2023-05-16 22:37:08 +02:00
parent 3a2b7f40bc
commit c07e561ad3
8 changed files with 75 additions and 19 deletions

View file

@ -0,0 +1,24 @@
using System.Text.Json;
using System.Text.Json.Serialization;
using Elsa.Api.Client.Shared.Models;
namespace Elsa.Api.Client.Converters;
/// <summary>
/// A JSON converter that serializes <see cref="VersionOptions"/>.
/// </summary>
public class VersionOptionsJsonConverter : JsonConverter<VersionOptions>
{
/// <inheritdoc />
public override VersionOptions Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
var textValue = reader.GetString();
return string.IsNullOrWhiteSpace(textValue) ? VersionOptions.Published : VersionOptions.FromString(textValue);
}
/// <inheritdoc />
public override void Write(Utf8JsonWriter writer, VersionOptions value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString());
}
}

View file

@ -0,0 +1,17 @@
using System.ComponentModel;
using System.Globalization;
using Elsa.Api.Client.Shared.Models;
namespace Elsa.Api.Client.Converters;
/// <summary>
/// A type converter that converts <see cref="VersionOptions"/> to and from strings.
/// </summary>
public class VersionOptionsTypeConverter : TypeConverter
{
/// <inheritdoc />
public override bool CanConvertFrom(ITypeDescriptorContext? context, Type sourceType) => sourceType == typeof(string) || base.CanConvertFrom(context, sourceType);
/// <inheritdoc />
public override object ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object value) => value is string text ? VersionOptions.FromString(text) : base.ConvertFrom(context, culture, value)!;
}

View file

@ -36,7 +36,8 @@ public static class DependencyInjectionExtensions
/// <typeparam name="T">The API type.</typeparam>
public static void AddElsaApiClient<T>(this IServiceCollection services, RefitSettings settings) where T : class
{
services.AddRefitClient<T>(settings).ConfigureHttpClient(ConfigureElsaApiHttpClient);
services.AddRefitClient<T>(settings)
.ConfigureHttpClient(ConfigureElsaApiHttpClient);
}
private static void ConfigureElsaApiHttpClient(IServiceProvider serviceProvider, HttpClient httpClient)

View file

@ -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.
/// </summary>
/// <param name="request">The request containing options for listing workflow definitions.</param>
/// <param name="versionOptions">The version options.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>The response containing the workflow definitions.</returns>
[Get("/workflow-definitions")]
Task<ListWorkflowDefinitionsResponse> ListAsync(ListWorkflowDefinitionsRequest request, CancellationToken cancellationToken = default);
[Get("/workflow-definitions?versionOptions={VersionOptions}")]
Task<ListWorkflowDefinitionsResponse> ListAsync([Query]ListWorkflowDefinitionsRequest request, VersionOptions? versionOptions = default, CancellationToken cancellationToken = default);
/// <summary>
/// Deletes a workflow definition.

View file

@ -19,17 +19,19 @@ public class ListWorkflowDefinitionsRequest
public int? PageSize { get; set; }
/// <summary>
/// The version options.
/// The IDs of the workflow definitions to filter by.
/// </summary>
public VersionOptions? Version { get; set; }
public ICollection<string>? DefinitionIds { get; set; }
/// <summary>
/// The name of the workflow materializer to filter by.
/// </summary>
[AliasAs("materializer")] public string? MaterializerName { get; set; }
[AliasAs("materializer")]
public string? MaterializerName { get; set; }
/// <summary>
/// The labels to filter by.
/// </summary>
[AliasAs("label")] public string[]? Labels { get; set; }
[AliasAs("label")]
public string[]? Labels { get; set; }
}

View file

@ -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.
/// </summary>
[PublicAPI]
[TypeConverter(typeof(VersionOptionsTypeConverter))]
[JsonConverter(typeof(VersionOptionsJsonConverter))]
public struct VersionOptions
{
/// <summary>
@ -58,6 +63,12 @@ public struct VersionOptions
_ => SpecificVersion(int.Parse(value))
};
/// <summary>
/// Tries to parse a string into a <see cref="VersionOptions"/>.
/// </summary>
/// <param name="value">The value to parse.</param>
/// <param name="versionOptions">The parsed value.</param>
/// <returns><c>true</c> if the value was parsed successfully, otherwise <c>false</c>.</returns>
public static bool TryParse(string value, out VersionOptions versionOptions)
{
versionOptions = FromString(value);

View file

@ -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,

View file

@ -45,15 +45,14 @@ internal class List : ElsaEndpoint<Request, Response>
private async Task<Page<WorkflowDefinitionSummary>> 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<DateTimeOffset>
{
KeySelector = p => p.CreatedAt,
@ -66,7 +65,7 @@ internal class List : ElsaEndpoint<Request, Response>
{
var order = new WorkflowDefinitionOrder<string>
{
KeySelector = p => p.Name,
KeySelector = p => p.Name ?? string.Empty,
Direction = direction
};