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