diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 8c83428..211ff23 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -19,17 +19,25 @@ jobs: steps: - uses: actions/checkout@v3 - name: Setup .NET 3.1 - uses: actions/setup-dotnet@v2 + uses: actions/setup-dotnet@v3 with: dotnet-version: 3.1.x - name: Setup .NET 5.0 - uses: actions/setup-dotnet@v2 + uses: actions/setup-dotnet@v3 with: dotnet-version: 5.0.x - name: Setup .NET 6.0 - uses: actions/setup-dotnet@v2 + uses: actions/setup-dotnet@v3 with: dotnet-version: 6.0.x + - name: Setup .NET 7.0 + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.x + - name: Setup .NET 8.0 + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 8.0.x - name: Restore dependencies run: dotnet restore - name: Build diff --git a/README.md b/README.md index 64a5f08..e740975 100644 --- a/README.md +++ b/README.md @@ -24,17 +24,17 @@ In order to get started, please follow these steps. _Package Manager_ ``` -Install-Package Forbury.Integrations -Version 1.5.0 +Install-Package Forbury.Integrations -Version 1.7.0 ``` _.NET CLI_ ``` -dotnet add PROJECT package Forbury.Integrations --version 1.5.0 +dotnet add PROJECT package Forbury.Integrations --version 1.7.0 ``` _PackageReference_ ``` - + ``` For a full list of the latest releases, please see the [package release page](https://www.nuget.org/packages/Forbury.Integrations). @@ -72,13 +72,48 @@ If you only have one client, you **will not** need to choose which client to mak public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) -{ +{ services.AddForburyApi(Configuration); ... } ``` -Alternatively, if you are using the new .NET 6 design **without** a `Startup.cs`, add the following inside your `Program.cs` _(.NET 6)_. +Alternatively, you are able to create your own configuration object and pass that in as parameter instead. +This gives you the flexibility to build your configuration outside the standard `appsettings.json` structure. + +```C# +public void ConfigureServices(IServiceCollection services) +{ + var forburyConfiguration = new ForburyConfiguration() + { + Api = new ApiConfiguration() + { + Url = "https://api.forbury.com/", + Version = 1 + }, + Authentication = new AuthenticationConfiguration() + { + Url = "https://account.forbury.com/", + Clients = new Dictionary() + { + { + "UNIQUE_CLIENT_NAME", + new AuthenticationClientConfiguration() + { + ClientId = "YOUR_CLIENT_ID", + ClientSecret = "YOUR_CLIENT_SECRET" + } + } + } + } + }; + + services.AddForburyApi(forburyConfiguration); + ... +} +``` + +_Note:_ If you are using the new .NET 6 design **without** a `Startup.cs`, add the following inside your `Program.cs` _(.NET 6)_. ```C# using Forbury.Integrations.API; diff --git a/assets/logo/logo_text.png b/assets/logo/logo_text.png index 7735196..f533435 100644 Binary files a/assets/logo/logo_text.png and b/assets/logo/logo_text.png differ diff --git a/src/Forbury.Integrations/API/IServiceCollectionExtensions.cs b/src/Forbury.Integrations/API/IServiceCollectionExtensions.cs index 2bf3174..f541276 100644 --- a/src/Forbury.Integrations/API/IServiceCollectionExtensions.cs +++ b/src/Forbury.Integrations/API/IServiceCollectionExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using Forbury.Integrations.API.Interfaces; using Forbury.Integrations.API.Models.Configuration; using Forbury.Integrations.API.Services; @@ -11,13 +12,22 @@ public static class IServiceCollectionExtensions { public static IServiceCollection AddForburyApi(this IServiceCollection services, IConfiguration configuration) { - services.AddForburyAuthenticationAndConfiguration(configuration); + var forburyConfiguration = new ForburyConfiguration(); + configuration.GetSection("Forbury").Bind(forburyConfiguration); + + services.AddForburyApi(forburyConfiguration); + + return services; + } + + public static IServiceCollection AddForburyApi(this IServiceCollection services, ForburyConfiguration forburyConfiguration) + { + services.AddForburyAuthenticationAndConfiguration(forburyConfiguration); // Leaving blank or "0" will setup all API versions for DI - var apiVersion = int.TryParse(configuration["Forbury:Api:Version"], out int parsedApiVersion) ? - parsedApiVersion : 0; + var apiVersion = forburyConfiguration.Api.Version; - if (apiVersion == 1 || apiVersion == 0) v1.ServiceBuilder.AddForburyServices(services, $"{configuration["Forbury:Api:Url"]}api/v1"); + if (apiVersion == 1 || apiVersion == 0) v1.ServiceBuilder.AddForburyServices(services, $"{forburyConfiguration.Api.Url}api/v1"); return services; } @@ -32,15 +42,16 @@ internal static void AddForburyHttpClient(this IServic }).AddHttpMessageHandler(); } - private static IServiceCollection AddForburyAuthenticationAndConfiguration(this IServiceCollection services, IConfiguration configuration) + private static IServiceCollection AddForburyAuthenticationAndConfiguration(this IServiceCollection services, + ForburyConfiguration forburyConfiguration) { - services.Configure(options => configuration.GetSection("Forbury").Bind(options)); + services.ConfigureOptions(forburyConfiguration); services.AddTransient(); services.AddHttpClient(config => { - config.BaseAddress = new Uri(configuration["Forbury:Authentication:Url"]); + config.BaseAddress = new Uri(forburyConfiguration.Authentication.Url); }); return services; diff --git a/src/Forbury.Integrations/API/Services/ForburyAuthenticationService.cs b/src/Forbury.Integrations/API/Services/ForburyAuthenticationService.cs index d505d59..4b41021 100644 --- a/src/Forbury.Integrations/API/Services/ForburyAuthenticationService.cs +++ b/src/Forbury.Integrations/API/Services/ForburyAuthenticationService.cs @@ -40,7 +40,7 @@ public async Task GetAccessTokenAsync(CancellationToken cancellationToke if (IsAuthorised(customerClient.ClientId)) return _tokens[customerClient.ClientId].AccessToken; - await _tokenSemaphore.WaitAsync(cancellationToken); + await _tokenSemaphore.WaitAsync(cancellationToken); try { diff --git a/src/Forbury.Integrations/API/v1/Clients/ForburyApiClient.cs b/src/Forbury.Integrations/API/v1/Clients/ForburyApiClient.cs index a0a9b07..290569d 100644 --- a/src/Forbury.Integrations/API/v1/Clients/ForburyApiClient.cs +++ b/src/Forbury.Integrations/API/v1/Clients/ForburyApiClient.cs @@ -12,6 +12,9 @@ using System.Text; using System.Threading; using System.Threading.Tasks; +using Forbury.Integrations.API.Models.Configuration; +using Microsoft.Extensions.Options; +using Microsoft.Extensions.Configuration; namespace Forbury.Integrations.API.v1.Clients { @@ -21,9 +24,13 @@ public abstract class ForburyApiClient : IForburyApiClient protected readonly HttpClient _httpClient; - public ForburyApiClient(HttpClient httpClient) + private readonly ForburyConfiguration _configuration; + + public ForburyApiClient(HttpClient httpClient, + IOptions configuration) { _httpClient = httpClient; + _configuration = configuration.Value; } public void SetClient(string name) @@ -36,6 +43,15 @@ public void SetClient(string name) _httpClient.DefaultRequestHeaders.Add(Constants.ClientHeaderName, name); } + public void SetClient(string name, AuthenticationClientConfiguration clientConfiguration) + { + // Try remove and then add new client + _configuration.Authentication.Clients.Remove(name); + _configuration.Authentication.Clients.Add(name, clientConfiguration); + + SetClient(name); + } + protected QueryBuilder GetPagedQueryBuilder(int amount, int page) { return new QueryBuilder diff --git a/src/Forbury.Integrations/API/v1/Clients/ForburyProductApiClient.cs b/src/Forbury.Integrations/API/v1/Clients/ForburyProductApiClient.cs index 0b12b82..7138d49 100644 --- a/src/Forbury.Integrations/API/v1/Clients/ForburyProductApiClient.cs +++ b/src/Forbury.Integrations/API/v1/Clients/ForburyProductApiClient.cs @@ -3,18 +3,21 @@ using System.Net.Http; using System.Threading; using System.Threading.Tasks; +using Forbury.Integrations.API.Models.Configuration; using Forbury.Integrations.API.v1.Dto.Enums; using Forbury.Integrations.API.v1.Dto.Product; using Forbury.Integrations.API.v1.Interfaces; using Forbury.Integrations.Helpers.Extensions; using Microsoft.AspNetCore.Http.Extensions; +using Microsoft.Extensions.Options; namespace Forbury.Integrations.API.v1.Clients { public class ForburyProductApiClient : ForburyApiClient, IForburyProductApiClient { - public ForburyProductApiClient(HttpClient httpClient) : - base(httpClient) + public ForburyProductApiClient(HttpClient httpClient, + IOptions configuration) : + base(httpClient, configuration) { } public async Task> GetProducts(CancellationToken cancellationToken = default) diff --git a/src/Forbury.Integrations/API/v1/Clients/ForburyPropertyApiClient.cs b/src/Forbury.Integrations/API/v1/Clients/ForburyPropertyApiClient.cs index fa12aa3..7700e19 100644 --- a/src/Forbury.Integrations/API/v1/Clients/ForburyPropertyApiClient.cs +++ b/src/Forbury.Integrations/API/v1/Clients/ForburyPropertyApiClient.cs @@ -2,19 +2,22 @@ using System.Net.Http; using System.Threading; using System.Threading.Tasks; +using Forbury.Integrations.API.Models.Configuration; using Forbury.Integrations.API.v1.Dto; using Forbury.Integrations.API.v1.Dto.Enums; using Forbury.Integrations.API.v1.Dto.Model; using Forbury.Integrations.API.v1.Dto.Property; using Forbury.Integrations.API.v1.Interfaces; using Microsoft.AspNetCore.Http.Extensions; +using Microsoft.Extensions.Options; namespace Forbury.Integrations.API.v1.Clients { public class ForburyPropertyApiClient : ForburyApiClient, IForburyPropertyApiClient { - public ForburyPropertyApiClient(HttpClient httpClient) : - base(httpClient) + public ForburyPropertyApiClient(HttpClient httpClient, + IOptions configuration) : + base(httpClient, configuration) { } public async Task> GetProperties(int amount = 20, diff --git a/src/Forbury.Integrations/API/v1/Clients/ForburyTeamApiClient.cs b/src/Forbury.Integrations/API/v1/Clients/ForburyTeamApiClient.cs index 66558b3..1ee8306 100644 --- a/src/Forbury.Integrations/API/v1/Clients/ForburyTeamApiClient.cs +++ b/src/Forbury.Integrations/API/v1/Clients/ForburyTeamApiClient.cs @@ -2,6 +2,7 @@ using System.Net.Http; using System.Threading; using System.Threading.Tasks; +using Forbury.Integrations.API.Models.Configuration; using Forbury.Integrations.API.v1.Dto; using Forbury.Integrations.API.v1.Dto.Enums; using Forbury.Integrations.API.v1.Dto.Model; @@ -9,13 +10,15 @@ using Forbury.Integrations.API.v1.Dto.Team; using Forbury.Integrations.API.v1.Interfaces; using Microsoft.AspNetCore.Http.Extensions; +using Microsoft.Extensions.Options; namespace Forbury.Integrations.API.v1.Clients { public class ForburyTeamApiClient : ForburyApiClient, IForburyTeamApiClient { - public ForburyTeamApiClient(HttpClient httpClient) : - base(httpClient) + public ForburyTeamApiClient(HttpClient httpClient, + IOptions configuration) : + base(httpClient, configuration) { } public async Task> GetTeams(int amount = 20, diff --git a/src/Forbury.Integrations/API/v1/Clients/Model/ForburyModelApiClient.cs b/src/Forbury.Integrations/API/v1/Clients/Model/ForburyModelApiClient.cs index 9b21195..661129b 100644 --- a/src/Forbury.Integrations/API/v1/Clients/Model/ForburyModelApiClient.cs +++ b/src/Forbury.Integrations/API/v1/Clients/Model/ForburyModelApiClient.cs @@ -3,19 +3,22 @@ using System.Net.Http; using System.Threading; using System.Threading.Tasks; +using Forbury.Integrations.API.Models.Configuration; using Forbury.Integrations.API.v1.Dto; using Forbury.Integrations.API.v1.Dto.Enums; using Forbury.Integrations.API.v1.Dto.File; using Forbury.Integrations.API.v1.Dto.Model; using Forbury.Integrations.API.v1.Interfaces.Model; using Microsoft.AspNetCore.Http.Extensions; +using Microsoft.Extensions.Options; namespace Forbury.Integrations.API.v1.Clients.Model { public class ForburyModelApiClient : ForburyApiClient, IForburyModelApiClient { - public ForburyModelApiClient(HttpClient httpClient) : - base(httpClient) + public ForburyModelApiClient(HttpClient httpClient, + IOptions configuration) : + base(httpClient, configuration) { } public async Task> GetModels(ProductType? productType = null, diff --git a/src/Forbury.Integrations/API/v1/Clients/Model/ForburyModelCommercialApiClient.cs b/src/Forbury.Integrations/API/v1/Clients/Model/ForburyModelCommercialApiClient.cs index f5e5cd0..8700f90 100644 --- a/src/Forbury.Integrations/API/v1/Clients/Model/ForburyModelCommercialApiClient.cs +++ b/src/Forbury.Integrations/API/v1/Clients/Model/ForburyModelCommercialApiClient.cs @@ -1,15 +1,18 @@ using System.Net.Http; using System.Threading; using System.Threading.Tasks; +using Forbury.Integrations.API.Models.Configuration; using Forbury.Integrations.API.v1.Dto.Model.Commercial; using Forbury.Integrations.API.v1.Interfaces.Model; +using Microsoft.Extensions.Options; namespace Forbury.Integrations.API.v1.Clients.Model { public class ForburyModelCommercialApiClient : ForburyModelApiClient, IForburyModelCommercialApiClient { - public ForburyModelCommercialApiClient(HttpClient httpClient) : - base(httpClient) + public ForburyModelCommercialApiClient(HttpClient httpClient, + IOptions configuration) : + base(httpClient, configuration) { } public async Task GetModelById(int modelId, diff --git a/src/Forbury.Integrations/API/v1/Clients/Model/ForburyModelDatumApiClient.cs b/src/Forbury.Integrations/API/v1/Clients/Model/ForburyModelDatumApiClient.cs index c72e64c..d4ba3c9 100644 --- a/src/Forbury.Integrations/API/v1/Clients/Model/ForburyModelDatumApiClient.cs +++ b/src/Forbury.Integrations/API/v1/Clients/Model/ForburyModelDatumApiClient.cs @@ -1,18 +1,21 @@ using System.Net.Http; using System.Threading; using System.Threading.Tasks; +using Forbury.Integrations.API.Models.Configuration; using Forbury.Integrations.API.v1.Dto.Model; using Forbury.Integrations.API.v1.Dto.Model.Datum; using Forbury.Integrations.API.v1.Dto.Model.Datum.Input; using Forbury.Integrations.API.v1.Interfaces.Model; using Microsoft.AspNetCore.Http.Extensions; +using Microsoft.Extensions.Options; namespace Forbury.Integrations.API.v1.Clients.Model { public class ForburyModelDatumApiClient : ForburyModelApiClient, IForburyModelDatumApiClient { - public ForburyModelDatumApiClient(HttpClient httpClient) : - base(httpClient) + public ForburyModelDatumApiClient(HttpClient httpClient, + IOptions configuration) : + base(httpClient, configuration) { } public async Task GetModelById(int modelId, diff --git a/src/Forbury.Integrations/API/v1/Interfaces/IForburyApiClient.cs b/src/Forbury.Integrations/API/v1/Interfaces/IForburyApiClient.cs index 27f24e5..db392b3 100644 --- a/src/Forbury.Integrations/API/v1/Interfaces/IForburyApiClient.cs +++ b/src/Forbury.Integrations/API/v1/Interfaces/IForburyApiClient.cs @@ -1,7 +1,10 @@ -namespace Forbury.Integrations.API.v1.Interfaces +using Forbury.Integrations.API.Models.Configuration; + +namespace Forbury.Integrations.API.v1.Interfaces { public interface IForburyApiClient { void SetClient(string name); + void SetClient(string name, AuthenticationClientConfiguration clientConfiguration); } } diff --git a/src/Forbury.Integrations/Forbury.Integrations.csproj b/src/Forbury.Integrations/Forbury.Integrations.csproj index 8c72881..87759cd 100644 --- a/src/Forbury.Integrations/Forbury.Integrations.csproj +++ b/src/Forbury.Integrations/Forbury.Integrations.csproj @@ -1,7 +1,7 @@  - 1.6.0 + 1.7.0 Forbury Development Team Forbury This .NET client library provides a quick and easy option for integrating with Forbury APIs. @@ -14,7 +14,7 @@ Forbury.Integrations Forbury.Integrations - net48;netcoreapp3.1;net5.0;net6.0 + net48;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 true