< 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
0%
Covered lines: 0
Uncovered lines: 76
Coverable lines: 76
Total lines: 190
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 20
Branch coverage: 0%
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%210%
AddApiClient(...)100%210%
AddApiClients(...)0%4260%
AddApi(...)100%210%
AddApi(...)0%7280%
AddApiWithoutRetryPolicy(...)0%2040%
CreateApi(...)100%210%
CreateApi(...)100%210%
ConfigureElsaApiHttpClient(...)0%620%

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.Features.Contracts;
 8using Elsa.Api.Client.Resources.Identity.Contracts;
 9using Elsa.Api.Client.Resources.IncidentStrategies.Contracts;
 10using Elsa.Api.Client.Resources.LogPersistenceStrategies;
 11using Elsa.Api.Client.Resources.Resilience.Contracts;
 12using Elsa.Api.Client.Resources.Shells.Contracts;
 13using Elsa.Api.Client.Resources.Scripting.Contracts;
 14using Elsa.Api.Client.Resources.StorageDrivers.Contracts;
 15using Elsa.Api.Client.Resources.Tasks.Contracts;
 16using Elsa.Api.Client.Resources.Tests;
 17using Elsa.Api.Client.Resources.VariableTypes.Contracts;
 18using Elsa.Api.Client.Resources.WorkflowActivationStrategies.Contracts;
 19using Elsa.Api.Client.Resources.WorkflowDefinitions.Contracts;
 20using Elsa.Api.Client.Resources.WorkflowExecutionContexts.Contracts;
 21using Elsa.Api.Client.Resources.WorkflowInstances.Contracts;
 22using JetBrains.Annotations;
 23using Microsoft.Extensions.DependencyInjection;
 24using Microsoft.Extensions.DependencyInjection.Extensions;
 25using Microsoft.Extensions.Options;
 26using Refit;
 27using static Elsa.Api.Client.RefitSettingsHelper;
 28
 29namespace Elsa.Api.Client.Extensions;
 30
 31/// <summary>
 32/// Provides extension methods for dependency injection.
 33/// </summary>
 34[PublicAPI]
 35public static class DependencyInjectionExtensions
 36{
 37    /// <summary>
 38    /// Adds default Elsa API clients configured to use an API key.
 39    /// </summary>
 40    public static IServiceCollection AddDefaultApiClientsUsingApiKey(this IServiceCollection services, Action<ElsaClient
 41    {
 042        var options = new ElsaClientOptions();
 043        configureOptions(options);
 44
 045        return services.AddDefaultApiClients(client =>
 046        {
 047            client.BaseAddress = options.BaseAddress;
 048            client.ApiKey = options.ApiKey;
 049            client.ConfigureHttpClient = options.ConfigureHttpClient;
 050        });
 51    }
 52
 53    /// <summary>
 54    /// Adds default Elsa API clients.
 55    /// </summary>
 56    public static IServiceCollection AddDefaultApiClients(this IServiceCollection services, Action<ElsaClientBuilderOpti
 57    {
 058        return services.AddApiClients(configureClient, builderOptions =>
 059        {
 060            var builderOptionsWithoutRetryPolicy = new ElsaClientBuilderOptions
 061            {
 062                ApiKey = builderOptions.ApiKey,
 063                AuthenticationHandler = builderOptions.AuthenticationHandler,
 064                BaseAddress = builderOptions.BaseAddress,
 065                ConfigureHttpClient = builderOptions.ConfigureHttpClient,
 066                ConfigureHttpClientBuilder = builderOptions.ConfigureHttpClientBuilder,
 067                ConfigureRetryPolicy = null
 068            };
 069
 070            services.AddApi<IWorkflowDefinitionsApi>(builderOptions);
 071            services.AddApi<IExecuteWorkflowApi>(builderOptionsWithoutRetryPolicy);
 072            services.AddApi<IWorkflowInstancesApi>(builderOptions);
 073            services.AddApi<IActivityDescriptorsApi>(builderOptions);
 074            services.AddApi<IActivityDescriptorOptionsApi>(builderOptions);
 075            services.AddApi<IActivityExecutionsApi>(builderOptions);
 076            services.AddApi<IStorageDriversApi>(builderOptions);
 077            services.AddApi<IVariableTypesApi>(builderOptions);
 078            services.AddApi<IWorkflowActivationStrategiesApi>(builderOptions);
 079            services.AddApi<IIncidentStrategiesApi>(builderOptions);
 080            services.AddApi<ILogPersistenceStrategiesApi>(builderOptions);
 081            services.AddApi<ICommitStrategiesApi>(builderOptions);
 082            services.AddApi<IResilienceStrategiesApi>(builderOptions);
 083            services.AddApi<IRetryAttemptsApi>(builderOptions);
 084            services.AddApi<ILoginApi>(builderOptions);
 085            services.AddApi<IFeaturesApi>(builderOptions);
 086            services.AddApi<IShellsApi>(builderOptions);
 087            services.AddApi<IJavaScriptApi>(builderOptions);
 088            services.AddApi<IExpressionDescriptorsApi>(builderOptions);
 089            services.AddApi<IWorkflowContextProviderDescriptorsApi>(builderOptions);
 090            services.AddApi<IAlterationsApi>(builderOptions);
 091            services.AddApi<ITasksApi>(builderOptions);
 092            services.AddApi<ITestsApi>(builderOptions);
 093        });
 94    }
 95
 96    /// <summary>
 97    /// Adds an API client to the service collection. Requires AddElsaClient to be called exactly once.
 98    /// </summary>
 99    public static IServiceCollection AddApiClient<T>(this IServiceCollection services, Action<ElsaClientBuilderOptions>?
 100    {
 0101        return services.AddApiClients(configureClient, builderOptions => services.AddApi<T>(builderOptions));
 102    }
 103
 104    /// <summary>
 105    /// Adds the Elsa client to the service collection.
 106    /// </summary>
 107    public static IServiceCollection AddApiClients(this IServiceCollection services, Action<ElsaClientBuilderOptions>? c
 108    {
 0109        var builderOptions = new ElsaClientBuilderOptions();
 0110        configureClient?.Invoke(builderOptions);
 0111        builderOptions.ConfigureHttpClientBuilder += builder => builder.AddHttpMessageHandler(sp => (DelegatingHandler)s
 112
 0113        services.TryAddScoped(builderOptions.AuthenticationHandler);
 114
 0115        services.Configure<ElsaClientOptions>(options =>
 0116        {
 0117            options.BaseAddress = builderOptions.BaseAddress;
 0118            options.ConfigureHttpClient = builderOptions.ConfigureHttpClient;
 0119            options.ApiKey = builderOptions.ApiKey;
 0120        });
 121
 0122        configureServices?.Invoke(builderOptions);
 0123        return services;
 124    }
 125
 126    /// <summary>
 127    /// Adds a refit client for the specified API type.
 128    /// </summary>
 129    /// <param name="services">The service collection.</param>
 130    /// <param name="httpClientBuilderOptions">An options object that can be used to configure the HTTP client builder.<
 131    /// <typeparam name="T">The type representing the API.</typeparam>
 132    public static IServiceCollection AddApi<T>(this IServiceCollection services, ElsaClientBuilderOptions? httpClientBui
 133    {
 0134        return services.AddApi(typeof(T), httpClientBuilderOptions);
 135    }
 136
 137    /// <summary>
 138    /// Adds a refit client for the specified API type.
 139    /// </summary>
 140    /// <param name="services">The service collection.</param>
 141    /// <param name="apiType">The type representing the API</param>
 142    /// <param name="httpClientBuilderOptions">An options object that can be used to configure the HTTP client builder.<
 143    public static IServiceCollection AddApi(this IServiceCollection services, Type apiType, ElsaClientBuilderOptions? ht
 144    {
 0145        var builder = services.AddRefitClient(apiType, sp => CreateRefitSettings(sp, httpClientBuilderOptions?.Configure
 0146        httpClientBuilderOptions?.ConfigureHttpClientBuilder(builder);
 0147        httpClientBuilderOptions?.ConfigureRetryPolicy?.Invoke(builder);
 0148        return services;
 149    }
 150
 151    /// <summary>
 152    /// Adds a refit client for the specified API type.
 153    /// </summary>
 154    /// <param name="services">The service collection.</param>
 155    /// <param name="httpClientBuilderOptions">An options object that can be used to configure the HTTP client builder.<
 156    /// <typeparam name="T">The type representing the API.</typeparam>
 157    public static void AddApiWithoutRetryPolicy<T>(this IServiceCollection services, ElsaClientBuilderOptions? httpClien
 158    {
 0159        var builder = services
 0160            .AddRefitClient<T>(sp => CreateRefitSettings(sp), typeof(T).Name)
 0161            .ConfigureHttpClient(ConfigureElsaApiHttpClient);
 0162        httpClientBuilderOptions?.ConfigureHttpClientBuilder(builder);
 0163    }
 164
 165    /// <summary>
 166    /// Creates an API client for the specified API type.
 167    /// </summary>
 168    public static T CreateApi<T>(this IServiceProvider serviceProvider, Uri baseAddress) where T : class
 169    {
 0170        var httpClientFactory = serviceProvider.GetRequiredService<IHttpClientFactory>();
 0171        var httpClient = httpClientFactory.CreateClient(typeof(T).Name);
 0172        httpClient.BaseAddress = baseAddress;
 0173        return CreateApi<T>(serviceProvider, httpClient);
 174    }
 175
 176    /// <summary>
 177    /// Creates an API client for the specified API type.
 178    /// </summary>
 179    public static T CreateApi<T>(this IServiceProvider serviceProvider, HttpClient httpClient) where T : class
 180    {
 0181        return RestService.For<T>(httpClient, CreateRefitSettings(serviceProvider));
 182    }
 183
 184    private static void ConfigureElsaApiHttpClient(IServiceProvider serviceProvider, HttpClient httpClient)
 185    {
 0186        var options = serviceProvider.GetRequiredService<IOptions<ElsaClientOptions>>().Value;
 0187        httpClient.BaseAddress = options.BaseAddress;
 0188        options.ConfigureHttpClient?.Invoke(serviceProvider, httpClient);
 0189    }
 190}