using System.Text.Json; using System.Text.Json.Serialization; using Elsa.Api.Client.Contracts; using Elsa.Api.Client.Converters; 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.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) { services.Configure(configureOptions); services.AddScoped(); services.AddActivityTypeService(); services.AddApi(CreateRefitSettings); services.AddApi(CreateRefitSettings); services.AddApi(CreateRefitSettings); services.AddApi(CreateRefitSettings); services.AddApi(CreateRefitSettings); services.AddApi(CreateRefitSettings); services.AddApi(CreateRefitSettings); services.AddApi(CreateRefitSettings); services.AddApi(CreateRefitSettings); return services; } /// /// Adds activity type services to the service collection. /// public static IServiceCollection AddActivityTypeService(this IServiceCollection services) { return services; } /// /// Adds a refit client for the specified API type. /// /// The service collection. /// The refit settings. /// The API type. public static void AddApi(this IServiceCollection services, Func settings) where T : class { services.AddRefitClient(settings) .ConfigureHttpClient(ConfigureElsaApiHttpClient); } private static void ConfigureElsaApiHttpClient(IServiceProvider serviceProvider, HttpClient httpClient) { var options = serviceProvider.GetRequiredService>().Value; httpClient.BaseAddress = options.BaseAddress; options.ConfigureHttpClient?.Invoke(serviceProvider, httpClient); } private static RefitSettings CreateRefitSettings(IServiceProvider serviceProvider) { JsonSerializerOptions serializerOptions = new() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, }; serializerOptions.Converters.Add(new JsonStringEnumConverter()); serializerOptions.Converters.Add(new VersionOptionsJsonConverter()); serializerOptions.Converters.Add(new ExpressionJsonConverterFactory()); var settings = new RefitSettings { ContentSerializer = new SystemTextJsonContentSerializer(serializerOptions) }; return settings; } }