using System.Text.Json; using System.Text.Json.Serialization; using Elsa.Api.Client.Contracts; using Elsa.Api.Client.Converters; using Elsa.Api.Client.HttpMessageHandlers; using Elsa.Api.Client.Options; using Elsa.Api.Client.Resources.ActivityDescriptors.Contracts; using Elsa.Api.Client.Resources.ActivityExecutions.Contracts; using Elsa.Api.Client.Resources.Features.Contracts; using Elsa.Api.Client.Resources.Identity.Contracts; using Elsa.Api.Client.Resources.IncidentStrategies.Contracts; using Elsa.Api.Client.Resources.Scripting.Contracts; using Elsa.Api.Client.Resources.StorageDrivers.Contracts; using Elsa.Api.Client.Resources.VariableTypes.Contracts; using Elsa.Api.Client.Resources.WorkflowActivationStrategies.Contracts; using Elsa.Api.Client.Resources.WorkflowDefinitions.Contracts; using Elsa.Api.Client.Resources.WorkflowInstances.Contracts; using Elsa.Api.Client.Services; using JetBrains.Annotations; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Refit; namespace Elsa.Api.Client.Extensions; /// /// Provides extension methods for dependency injection. /// [PublicAPI] public static class DependencyInjectionExtensions { /// /// Adds the Elsa client to the service collection. /// public static IServiceCollection AddElsaClient(this IServiceCollection services, Action? configureOptions = default, Action? configureBuilderOptions = default) { var builderOptions = new ElsaClientBuilderOptions(); configureBuilderOptions?.Invoke(builderOptions); services.Configure(configureOptions ?? (_ => { })); services.AddScoped(); services.AddScoped(); services.AddApi(builderOptions); services.AddApi(builderOptions); services.AddApi(builderOptions); services.AddApi(builderOptions); services.AddApi(builderOptions); services.AddApi(builderOptions); services.AddApi(builderOptions); services.AddApi(builderOptions); services.AddApi(builderOptions); services.AddApi(builderOptions); services.AddApi(builderOptions); return services; } /// /// Adds a refit client for the specified API type. /// /// The service collection. /// An options object that can be used to configure the HTTP client builder. /// The type representing the API. public static void AddApi(this IServiceCollection services, ElsaClientBuilderOptions? httpClientBuilderOptions = default) where T : class { var builder = services.AddRefitClient(CreateRefitSettings).ConfigureHttpClient(ConfigureElsaApiHttpClient); httpClientBuilderOptions?.ConfigureHttpClientBuilder?.Invoke(builder); } /// /// Creates an API client for the specified API type. /// public static T CreateApi(this IServiceProvider serviceProvider, Uri baseAddress) where T : class { return RestService.For(baseAddress.ToString(), CreateRefitSettings(serviceProvider)); } /// /// Creates an API client for the specified API type. /// public static T CreateApi(this IServiceProvider serviceProvider, HttpClient httpClient) where T : class { return RestService.For(httpClient, CreateRefitSettings(serviceProvider)); } private static void ConfigureElsaApiHttpClient(IServiceProvider serviceProvider, HttpClient httpClient) { var options = serviceProvider.GetRequiredService>().Value; httpClient.BaseAddress = options.BaseAddress; options.ConfigureHttpClient?.Invoke(serviceProvider, httpClient); } /// /// Creates a instance configured for Elsa. /// private static RefitSettings CreateRefitSettings(IServiceProvider serviceProvider) { JsonSerializerOptions serializerOptions = new() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, }; var elsaClientOptions = serviceProvider.GetRequiredService>().Value; serializerOptions.Converters.Add(new JsonStringEnumConverter()); serializerOptions.Converters.Add(new VersionOptionsJsonConverter()); serializerOptions.Converters.Add(new ExpressionJsonConverterFactory()); var settings = new RefitSettings { ContentSerializer = new SystemTextJsonContentSerializer(serializerOptions), HttpMessageHandlerFactory = () => elsaClientOptions.HttpMessageHandlerFactory(serviceProvider) }; return settings; } }