< Summary

Information
Class: Elsa.Api.Client.Extensions.DependencyInjectionExtensions
Assembly: Elsa.Api.Client
File(s): /home/runner/work/elsa-core/elsa-core/src/clients/Elsa.Api.Client/Extensions/DependencyInjectionExtensions.cs
Line coverage
75%
Covered lines: 60
Uncovered lines: 20
Coverable lines: 80
Total lines: 198
Line coverage: 75%
Branch coverage
60%
Covered branches: 12
Total branches: 20
Branch coverage: 60%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
AddDefaultApiClientsUsingApiKey(...)100%210%
AddDefaultApiClients(...)100%11100%
AddApiClient(...)100%210%
AddApiClients(...)100%66100%
AddApi(...)100%11100%
AddApi(...)62.5%88100%
AddApiWithoutRetryPolicy(...)0%2040%
CreateApi(...)100%210%
CreateApi(...)100%210%
ConfigureElsaApiHttpClient(...)50%2275%

File(s)

/home/runner/work/elsa-core/elsa-core/src/clients/Elsa.Api.Client/Extensions/DependencyInjectionExtensions.cs

#LineLine coverage
 1using Elsa.Api.Client.Options;
 2using Elsa.Api.Client.Resources.ActivityDescriptorOptions.Contracts;
 3using Elsa.Api.Client.Resources.ActivityDescriptors.Contracts;
 4using Elsa.Api.Client.Resources.ActivityExecutions.Contracts;
 5using Elsa.Api.Client.Resources.Alterations.Contracts;
 6using Elsa.Api.Client.Resources.CommitStrategies.Contracts;
 7using Elsa.Api.Client.Resources.ExternalAuthentication.Connections.Contracts;
 8using Elsa.Api.Client.Resources.ExternalAuthentication.Descriptors.Contracts;
 9using Elsa.Api.Client.Resources.ExternalAuthentication.IdentityLinks.Contracts;
 10using Elsa.Api.Client.Resources.Features.Contracts;
 11using Elsa.Api.Client.Resources.Identity.Contracts;
 12using Elsa.Api.Client.Resources.IncidentStrategies.Contracts;
 13using Elsa.Api.Client.Resources.LogPersistenceStrategies;
 14using Elsa.Api.Client.Resources.OutputConverters.Contracts;
 15using Elsa.Api.Client.Resources.Resilience.Contracts;
 16using Elsa.Api.Client.Resources.Shells.Contracts;
 17using Elsa.Api.Client.Resources.Scripting.Contracts;
 18using Elsa.Api.Client.Resources.StorageDrivers.Contracts;
 19using Elsa.Api.Client.Resources.Tasks.Contracts;
 20using Elsa.Api.Client.Resources.Tests;
 21using Elsa.Api.Client.Resources.VariableTypes.Contracts;
 22using Elsa.Api.Client.Resources.WorkflowActivationStrategies.Contracts;
 23using Elsa.Api.Client.Resources.WorkflowDefinitions.Contracts;
 24using Elsa.Api.Client.Resources.WorkflowExecutionContexts.Contracts;
 25using Elsa.Api.Client.Resources.WorkflowInstances.Contracts;
 26using JetBrains.Annotations;
 27using Microsoft.Extensions.DependencyInjection;
 28using Microsoft.Extensions.DependencyInjection.Extensions;
 29using Microsoft.Extensions.Options;
 30using Refit;
 31using static Elsa.Api.Client.RefitSettingsHelper;
 32
 33namespace Elsa.Api.Client.Extensions;
 34
 35/// <summary>
 36/// Provides extension methods for dependency injection.
 37/// </summary>
 38[PublicAPI]
 39public static class DependencyInjectionExtensions
 40{
 41    /// <summary>
 42    /// Adds default Elsa API clients configured to use an API key.
 43    /// </summary>
 44    public static IServiceCollection AddDefaultApiClientsUsingApiKey(this IServiceCollection services, Action<ElsaClient
 45    {
 046        var options = new ElsaClientOptions();
 047        configureOptions(options);
 48
 049        return services.AddDefaultApiClients(client =>
 050        {
 051            client.BaseAddress = options.BaseAddress;
 052            client.ApiKey = options.ApiKey;
 053            client.ConfigureHttpClient = options.ConfigureHttpClient;
 054        });
 55    }
 56
 57    /// <summary>
 58    /// Adds default Elsa API clients.
 59    /// </summary>
 60    public static IServiceCollection AddDefaultApiClients(this IServiceCollection services, Action<ElsaClientBuilderOpti
 61    {
 162        return services.AddApiClients(configureClient, builderOptions =>
 163        {
 164            var builderOptionsWithoutRetryPolicy = new ElsaClientBuilderOptions
 165            {
 166                ApiKey = builderOptions.ApiKey,
 167                AuthenticationHandler = builderOptions.AuthenticationHandler,
 168                BaseAddress = builderOptions.BaseAddress,
 169                ConfigureHttpClient = builderOptions.ConfigureHttpClient,
 170                ConfigureHttpClientBuilder = builderOptions.ConfigureHttpClientBuilder,
 171                ConfigureRetryPolicy = null
 172            };
 173
 174            services.AddApi<IWorkflowDefinitionsApi>(builderOptions);
 175            services.AddApi<IExecuteWorkflowApi>(builderOptionsWithoutRetryPolicy);
 176            services.AddApi<IWorkflowInstancesApi>(builderOptions);
 177            services.AddApi<IActivityDescriptorsApi>(builderOptions);
 178            services.AddApi<IActivityDescriptorOptionsApi>(builderOptions);
 179            services.AddApi<IActivityExecutionsApi>(builderOptions);
 180            services.AddApi<IStorageDriversApi>(builderOptions);
 181            services.AddApi<IVariableTypesApi>(builderOptions);
 182            services.AddApi<IWorkflowActivationStrategiesApi>(builderOptions);
 183            services.AddApi<IIncidentStrategiesApi>(builderOptions);
 184            services.AddApi<ILogPersistenceStrategiesApi>(builderOptions);
 185            services.AddApi<ICommitStrategiesApi>(builderOptions);
 186            services.AddApi<IResilienceStrategiesApi>(builderOptions);
 187            services.AddApi<IRetryAttemptsApi>(builderOptions);
 188            services.AddApi<ILoginApi>(builderOptions);
 189            services.AddApi<IExternalAuthenticationConnectionsApi>(builderOptions);
 190            services.AddApi<IExternalAuthenticationDescriptorsApi>(builderOptions);
 191            services.AddApi<IExternalIdentityLinksApi>(builderOptions);
 192            services.AddApi<IFeaturesApi>(builderOptions);
 193            services.AddApi<IShellsApi>(builderOptions);
 194            services.AddApi<IJavaScriptApi>(builderOptions);
 195            services.AddApi<IExpressionDescriptorsApi>(builderOptions);
 196            services.AddApi<IOutputConvertersApi>(builderOptions);
 197            services.AddApi<IWorkflowContextProviderDescriptorsApi>(builderOptions);
 198            services.AddApi<IAlterationsApi>(builderOptions);
 199            services.AddApi<ITasksApi>(builderOptions);
 1100            services.AddApi<ITestsApi>(builderOptions);
 2101        });
 102    }
 103
 104    /// <summary>
 105    /// Adds an API client to the service collection. Requires AddElsaClient to be called exactly once.
 106    /// </summary>
 107    public static IServiceCollection AddApiClient<T>(this IServiceCollection services, Action<ElsaClientBuilderOptions>?
 108    {
 0109        return services.AddApiClients(configureClient, builderOptions => services.AddApi<T>(builderOptions));
 110    }
 111
 112    /// <summary>
 113    /// Adds the Elsa client to the service collection.
 114    /// </summary>
 115    public static IServiceCollection AddApiClients(this IServiceCollection services, Action<ElsaClientBuilderOptions>? c
 116    {
 1117        var builderOptions = new ElsaClientBuilderOptions();
 1118        configureClient?.Invoke(builderOptions);
 29119        builderOptions.ConfigureHttpClientBuilder += builder => builder.AddHttpMessageHandler(sp => (DelegatingHandler)s
 120
 1121        services.TryAddScoped(builderOptions.AuthenticationHandler);
 122
 1123        services.Configure<ElsaClientOptions>(options =>
 1124        {
 1125            options.BaseAddress = builderOptions.BaseAddress;
 1126            options.ConfigureHttpClient = builderOptions.ConfigureHttpClient;
 1127            options.ApiKey = builderOptions.ApiKey;
 2128        });
 129
 1130        configureServices?.Invoke(builderOptions);
 1131        return services;
 132    }
 133
 134    /// <summary>
 135    /// Adds a refit client for the specified API type.
 136    /// </summary>
 137    /// <param name="services">The service collection.</param>
 138    /// <param name="httpClientBuilderOptions">An options object that can be used to configure the HTTP client builder.<
 139    /// <typeparam name="T">The type representing the API.</typeparam>
 140    public static IServiceCollection AddApi<T>(this IServiceCollection services, ElsaClientBuilderOptions? httpClientBui
 141    {
 27142        return services.AddApi(typeof(T), httpClientBuilderOptions);
 143    }
 144
 145    /// <summary>
 146    /// Adds a refit client for the specified API type.
 147    /// </summary>
 148    /// <param name="services">The service collection.</param>
 149    /// <param name="apiType">The type representing the API</param>
 150    /// <param name="httpClientBuilderOptions">An options object that can be used to configure the HTTP client builder.<
 151    public static IServiceCollection AddApi(this IServiceCollection services, Type apiType, ElsaClientBuilderOptions? ht
 152    {
 28153        var builder = services.AddRefitClient(apiType, sp => CreateRefitSettings(sp, httpClientBuilderOptions?.Configure
 27154        httpClientBuilderOptions?.ConfigureHttpClientBuilder(builder);
 27155        httpClientBuilderOptions?.ConfigureRetryPolicy?.Invoke(builder);
 27156        return services;
 157    }
 158
 159    /// <summary>
 160    /// Adds a refit client for the specified API type.
 161    /// </summary>
 162    /// <param name="services">The service collection.</param>
 163    /// <param name="httpClientBuilderOptions">An options object that can be used to configure the HTTP client builder.<
 164    /// <typeparam name="T">The type representing the API.</typeparam>
 165    public static void AddApiWithoutRetryPolicy<T>(this IServiceCollection services, ElsaClientBuilderOptions? httpClien
 166    {
 0167        var builder = services
 0168            .AddRefitClient<T>(sp => CreateRefitSettings(sp), typeof(T).Name)
 0169            .ConfigureHttpClient(ConfigureElsaApiHttpClient);
 0170        httpClientBuilderOptions?.ConfigureHttpClientBuilder(builder);
 0171    }
 172
 173    /// <summary>
 174    /// Creates an API client for the specified API type.
 175    /// </summary>
 176    public static T CreateApi<T>(this IServiceProvider serviceProvider, Uri baseAddress) where T : class
 177    {
 0178        var httpClientFactory = serviceProvider.GetRequiredService<IHttpClientFactory>();
 0179        var httpClient = httpClientFactory.CreateClient(typeof(T).Name);
 0180        httpClient.BaseAddress = baseAddress;
 0181        return CreateApi<T>(serviceProvider, httpClient);
 182    }
 183
 184    /// <summary>
 185    /// Creates an API client for the specified API type.
 186    /// </summary>
 187    public static T CreateApi<T>(this IServiceProvider serviceProvider, HttpClient httpClient) where T : class
 188    {
 0189        return RestService.For<T>(httpClient, CreateRefitSettings(serviceProvider));
 190    }
 191
 192    private static void ConfigureElsaApiHttpClient(IServiceProvider serviceProvider, HttpClient httpClient)
 193    {
 1194        var options = serviceProvider.GetRequiredService<IOptions<ElsaClientOptions>>().Value;
 1195        httpClient.BaseAddress = options.BaseAddress;
 1196        options.ConfigureHttpClient?.Invoke(serviceProvider, httpClient);
 0197    }
 198}