Skip to content

Commit 8a3746e

Browse files
authored
Merge branch 'main' into release/v5
2 parents e52fe96 + 60777fa commit 8a3746e

38 files changed

+476
-160
lines changed

AdminApi.Sdk/Endpoints/Common/XsrfAndApiKeyAuthenticator.cs renamed to AdminApi.Sdk/Authentication/XsrfAndApiKeyAuthenticator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
using System.Diagnostics.CodeAnalysis;
22
using Backbone.BuildingBlocks.SDK.Endpoints.Common;
33

4-
namespace Backbone.AdminApi.Sdk.Endpoints.Common;
4+
namespace Backbone.AdminApi.Sdk.Authentication;
55

66
public class XsrfAndApiKeyAuthenticator : IAuthenticator
77
{
@@ -40,7 +40,7 @@ private async Task<string> GetCookie()
4040
[MemberNotNull(nameof(_xsrfToken), nameof(_xsrfCookie))]
4141
private async Task RefreshToken()
4242
{
43-
HttpRequestMessage request = new(HttpMethod.Get, "xsrf");
43+
HttpRequestMessage request = new(HttpMethod.Get, "api/v1/xsrf");
4444
request.Headers.Add("X-API-KEY", _apiKey);
4545

4646
#pragma warning disable CS8774 // This warning ("Member must have a non-null value when exiting") must currently be disabled. (see https://github.com/dotnet/csharplang/discussions/ for details)

AdminApi.Sdk/Client.cs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,27 @@
1-
using Backbone.AdminApi.Sdk.Endpoints.ApiKeyValidation;
1+
using System.Text.Json;
2+
using Backbone.AdminApi.Sdk.Authentication;
3+
using Backbone.AdminApi.Sdk.Endpoints.ApiKeyValidation;
24
using Backbone.AdminApi.Sdk.Endpoints.Clients;
3-
using Backbone.AdminApi.Sdk.Endpoints.Common;
45
using Backbone.AdminApi.Sdk.Endpoints.Identities;
56
using Backbone.AdminApi.Sdk.Endpoints.Logs;
67
using Backbone.AdminApi.Sdk.Endpoints.Metrics;
78
using Backbone.AdminApi.Sdk.Endpoints.Relationships;
89
using Backbone.AdminApi.Sdk.Endpoints.Tiers;
910
using Backbone.BuildingBlocks.SDK.Endpoints.Common;
11+
using Backbone.Tooling.JsonConverters;
1012

1113
namespace Backbone.AdminApi.Sdk;
1214

1315
public class Client
1416
{
15-
public Client(Configuration config)
17+
private Client(HttpClient httpClient, string apiKey)
1618
{
17-
var httpClient = new HttpClient { BaseAddress = new Uri(config.BaseUrl) };
18-
var authenticator = new XsrfAndApiKeyAuthenticator(config.ApiKey, httpClient);
19-
var endpointClient = new EndpointClient(httpClient, authenticator, config.JsonSerializerOptions);
19+
var authenticator = new XsrfAndApiKeyAuthenticator(apiKey, httpClient);
20+
21+
var jsonSerializerOptions = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
22+
jsonSerializerOptions.Converters.Add(new UrlSafeBase64ToByteArrayJsonConverter());
23+
24+
var endpointClient = new EndpointClient(httpClient, authenticator, jsonSerializerOptions);
2025

2126
ApiKeyValidation = new ApiKeyValidationEndpoint(endpointClient);
2227
Clients = new ClientsEndpoint(endpointClient);
@@ -34,4 +39,14 @@ public Client(Configuration config)
3439
public MetricsEndpoint Metrics { get; }
3540
public RelationshipsEndpoint Relationships { get; }
3641
public TiersEndpoint Tiers { get; }
42+
43+
public static Client Create(string baseUrl, string apiKey)
44+
{
45+
return Create(new HttpClient { BaseAddress = new Uri(baseUrl) }, apiKey);
46+
}
47+
48+
public static Client Create(HttpClient httpClient, string apiKey)
49+
{
50+
return new Client(httpClient, apiKey);
51+
}
3752
}

AdminApi.Sdk/Configuration.cs

Lines changed: 0 additions & 16 deletions
This file was deleted.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using Backbone.BuildingBlocks.SDK.Endpoints.Common;
2+
3+
namespace Backbone.AdminApi.Sdk.Endpoints;
4+
5+
public abstract class AdminApiEndpoint : Endpoint
6+
{
7+
protected const string API_VERSION = "v1";
8+
9+
protected AdminApiEndpoint(EndpointClient client) : base(client)
10+
{
11+
}
12+
}

AdminApi.Sdk/Endpoints/ApiKeyValidation/ApiKeyValidationEndpoint.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55

66
namespace Backbone.AdminApi.Sdk.Endpoints.ApiKeyValidation;
77

8-
public class ApiKeyValidationEndpoint(EndpointClient client) : Endpoint(client)
8+
public class ApiKeyValidationEndpoint(EndpointClient client) : AdminApiEndpoint(client)
99
{
1010
public async Task<ApiResponse<ValidateApiKeyResponse>> ValidateApiKeyUnauthenticated(ValidateApiKeyRequest? request)
11-
=> await _client.PostUnauthenticated<ValidateApiKeyResponse>("ValidateApiKey", request);
11+
=> await _client.PostUnauthenticated<ValidateApiKeyResponse>($"api/{API_VERSION}/ValidateApiKey", request);
1212
}

AdminApi.Sdk/Endpoints/Clients/ClientsEndpoint.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,20 @@
66

77
namespace Backbone.AdminApi.Sdk.Endpoints.Clients;
88

9-
public class ClientsEndpoint(EndpointClient client) : Endpoint(client)
9+
public class ClientsEndpoint(EndpointClient client) : AdminApiEndpoint(client)
1010
{
11-
public async Task<ApiResponse<ListClientsResponse>> GetAllClients() => await _client.Get<ListClientsResponse>("Clients");
11+
public async Task<ApiResponse<ListClientsResponse>> GetAllClients() => await _client.Get<ListClientsResponse>($"api/{API_VERSION}/Clients");
1212

13-
public async Task<ApiResponse<ClientInfo>> GetClient(string id) => await _client.Get<ClientInfo>($"Clients/{id}");
13+
public async Task<ApiResponse<ClientInfo>> GetClient(string id) => await _client.Get<ClientInfo>($"api/{API_VERSION}/Clients/{id}");
1414

1515
public async Task<ApiResponse<CreateClientResponse>> CreateClient(CreateClientRequest request)
16-
=> await _client.Post<CreateClientResponse>("Clients", request);
16+
=> await _client.Post<CreateClientResponse>($"api/{API_VERSION}/Clients", request);
1717

1818
public async Task<ApiResponse<ClientInfo>> ChangeClientSecret(string id, ChangeClientSecretRequest request)
19-
=> await _client.Patch<ClientInfo>($"Clients/{id}/ChangeSecret", request);
19+
=> await _client.Patch<ClientInfo>($"api/{API_VERSION}/Clients/{id}/ChangeSecret", request);
2020

2121
public async Task<ApiResponse<ClientInfo>> UpdateClient(string id, UpdateClientRequest request)
22-
=> await _client.Put<ClientInfo>($"Clients/{id}", request);
22+
=> await _client.Put<ClientInfo>($"api/{API_VERSION}/Clients/{id}", request);
2323

24-
public async Task<ApiResponse<EmptyResponse>> DeleteClient(string id) => await _client.Delete<EmptyResponse>($"Clients/{id}");
24+
public async Task<ApiResponse<EmptyResponse>> DeleteClient(string id) => await _client.Delete<EmptyResponse>($"api/{API_VERSION}/Clients/{id}");
2525
}

AdminApi.Sdk/Endpoints/Identities/IdentitiesEndpoint.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,22 @@
66

77
namespace Backbone.AdminApi.Sdk.Endpoints.Identities;
88

9-
public class IdentitiesEndpoint(EndpointClient client) : Endpoint(client)
9+
public class IdentitiesEndpoint(EndpointClient client) : AdminApiEndpoint(client)
1010
{
1111
public async Task<ApiResponse<IndividualQuota>> CreateIndividualQuota(string address, CreateQuotaForIdentityRequest request)
12-
=> await _client.Post<IndividualQuota>($"Identities/{address}/Quotas", request);
12+
=> await _client.Post<IndividualQuota>($"api/{API_VERSION}/Identities/{address}/Quotas", request);
1313

1414
public async Task<ApiResponse<EmptyResponse>> DeleteIndividualQuota(string address, string quotaId)
15-
=> await _client.Delete<EmptyResponse>($"Identities/{address}/Quotas/{quotaId}");
15+
=> await _client.Delete<EmptyResponse>($"api/{API_VERSION}/Identities/{address}/Quotas/{quotaId}");
1616

17-
public async Task<ApiResponse<GetIdentityResponse>> GetIdentity(string address) => await _client.Get<GetIdentityResponse>($"Identities/{address}");
17+
public async Task<ApiResponse<GetIdentityResponse>> GetIdentity(string address) => await _client.Get<GetIdentityResponse>($"api/{API_VERSION}/Identities/{address}");
1818

1919
public async Task<ApiResponse<EmptyResponse>> UpdateIdentityTier(string address, UpdateIdentityTierRequest request)
20-
=> await _client.Put<EmptyResponse>($"Identities/{address}", request);
20+
=> await _client.Put<EmptyResponse>($"api/{API_VERSION}/Identities/{address}", request);
2121

2222
public async Task<ApiResponse<CreateIdentityResponse>> CreateIdentity(CreateIdentityRequest request)
23-
=> await _client.Post<CreateIdentityResponse>("Identities", request);
23+
=> await _client.Post<CreateIdentityResponse>($"api/{API_VERSION}", request);
2424

2525
public async Task<ApiResponse<StartDeletionProcessAsSupportResponse>> StartDeletionProcess(string address)
26-
=> await _client.Post<StartDeletionProcessAsSupportResponse>($"Identities/{address}/DeletionProcesses");
26+
=> await _client.Post<StartDeletionProcessAsSupportResponse>($"api/{API_VERSION}/Identities/{address}/DeletionProcesses");
2727
}

AdminApi.Sdk/Endpoints/Logs/LogsEndpoint.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
namespace Backbone.AdminApi.Sdk.Endpoints.Logs;
66

7-
public class LogsEndpoint(EndpointClient client) : Endpoint(client)
7+
public class LogsEndpoint(EndpointClient client) : AdminApiEndpoint(client)
88
{
9-
public async Task<ApiResponse<EmptyResponse>> CreateLog(LogRequest request) => await _client.Post<EmptyResponse>("Logs", request);
9+
public async Task<ApiResponse<EmptyResponse>> CreateLog(LogRequest request) => await _client.Post<EmptyResponse>($"api/{API_VERSION}/Logs", request);
1010
}

AdminApi.Sdk/Endpoints/Metrics/MetricsEndpoint.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
namespace Backbone.AdminApi.Sdk.Endpoints.Metrics;
66

7-
public class MetricsEndpoint(EndpointClient client) : Endpoint(client)
7+
public class MetricsEndpoint(EndpointClient client) : AdminApiEndpoint(client)
88
{
9-
public async Task<ApiResponse<ListMetricsResponse>> GetAllMetrics() => await _client.Get<ListMetricsResponse>("Metrics");
9+
public async Task<ApiResponse<ListMetricsResponse>> GetAllMetrics() => await _client.Get<ListMetricsResponse>($"api/{API_VERSION}/Metrics");
1010
}

AdminApi.Sdk/Endpoints/Relationships/RelationshipsEndpoint.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@
44

55
namespace Backbone.AdminApi.Sdk.Endpoints.Relationships;
66

7-
public class RelationshipsEndpoint(EndpointClient client) : Endpoint(client)
7+
public class RelationshipsEndpoint(EndpointClient client) : AdminApiEndpoint(client)
88
{
99
public async Task<ApiResponse<ListRelationshipsResponse>> GetAllRelationships(PaginationFilter? pagination = null)
10-
=> await _client.Get<ListRelationshipsResponse>("Relationships", null, pagination);
10+
=> await _client.Get<ListRelationshipsResponse>($"api/{API_VERSION}/Relationships", null, pagination);
1111

1212
public async Task<ApiResponse<ListRelationshipsResponse>> GetAllRelationships(string participant, PaginationFilter? pagination = null) => await _client
13-
.Request<ListRelationshipsResponse>(HttpMethod.Get, "Relationships")
13+
.Request<ListRelationshipsResponse>(HttpMethod.Get, $"api/{API_VERSION}/Relationships")
1414
.Authenticate()
1515
.WithPagination(pagination)
1616
.AddQueryParameter("participant", participant)

AdminApi.Sdk/Endpoints/Tiers/TiersEndpoint.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,19 @@
66

77
namespace Backbone.AdminApi.Sdk.Endpoints.Tiers;
88

9-
public class TiersEndpoint(EndpointClient client) : Endpoint(client)
9+
public class TiersEndpoint(EndpointClient client) : AdminApiEndpoint(client)
1010
{
11-
public async Task<ApiResponse<ListTiersResponse>> ListTiers() => await _client.Get<ListTiersResponse>("Tiers");
11+
public async Task<ApiResponse<ListTiersResponse>> ListTiers() => await _client.Get<ListTiersResponse>($"api/{API_VERSION}/Tiers");
1212

13-
public async Task<ApiResponse<TierDetails>> GetTier(string id) => await _client.Get<TierDetails>($"Tiers/{id}");
13+
public async Task<ApiResponse<TierDetails>> GetTier(string id) => await _client.Get<TierDetails>($"api/{API_VERSION}/Tiers/{id}");
1414

15-
public async Task<ApiResponse<Tier>> CreateTier(CreateTierRequest request) => await _client.Post<Tier>("Tiers", request);
15+
public async Task<ApiResponse<Tier>> CreateTier(CreateTierRequest request) => await _client.Post<Tier>($"api/{API_VERSION}/Tiers", request);
1616

17-
public async Task<ApiResponse<EmptyResponse>> DeleteTier(string id) => await _client.Delete<EmptyResponse>($"Tiers/{id}");
17+
public async Task<ApiResponse<EmptyResponse>> DeleteTier(string id) => await _client.Delete<EmptyResponse>($"api/{API_VERSION}/Tiers/{id}");
1818

1919
public async Task<ApiResponse<TierQuotaDefinition>> AddTierQuota(string id, CreateQuotaForTierRequest request)
20-
=> await _client.Post<TierQuotaDefinition>($"Tiers/{id}/Quotas", request);
20+
=> await _client.Post<TierQuotaDefinition>($"api/{API_VERSION}/Tiers/{id}/Quotas", request);
2121

2222
public async Task<ApiResponse<EmptyResponse>> DeleteTierQuota(string id, string quotaId)
23-
=> await _client.Delete<EmptyResponse>($"Tiers/{id}/Quotas/{quotaId}");
23+
=> await _client.Delete<EmptyResponse>($"api/{API_VERSION}/Tiers/{id}/Quotas/{quotaId}");
2424
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// ReSharper disable InconsistentNaming
2+
3+
#pragma warning disable IDE1006
4+
5+
namespace Backbone.BuildingBlocks.SDK.Crypto;
6+
7+
public enum CryptoExchangeAlgorithm
8+
{
9+
ECDH_P256 = 1,
10+
ECDH_P521 = 2,
11+
ECDH_X25519 = 3
12+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// ReSharper disable InconsistentNaming
2+
// ReSharper disable UnusedMember.Global
3+
4+
namespace Backbone.BuildingBlocks.SDK.Crypto;
5+
6+
public enum CryptoHashAlgorithm
7+
{
8+
SHA256 = 1,
9+
SHA512 = 2,
10+
BLAKE2B = 3
11+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// ReSharper disable InconsistentNaming
2+
3+
#pragma warning disable IDE1006
4+
5+
namespace Backbone.BuildingBlocks.SDK.Crypto;
6+
7+
public class CryptoSignaturePublicKey
8+
{
9+
public required CryptoExchangeAlgorithm alg;
10+
public required string pub;
11+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// ReSharper disable InconsistentNaming
2+
3+
#pragma warning disable IDE1006
4+
5+
namespace Backbone.BuildingBlocks.SDK.Crypto;
6+
7+
public class CryptoSignatureSignedChallenge
8+
{
9+
public required CryptoHashAlgorithm alg;
10+
public required byte[] sig;
11+
}

BuildingBlocks/src/BuildingBlocks.SDK/UriUtils.cs

Lines changed: 0 additions & 11 deletions
This file was deleted.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using Backbone.BuildingBlocks.SDK.Endpoints.Common;
2+
3+
namespace Backbone.ConsumerApi.Sdk.Authentication;
4+
5+
public class AnonymousAuthenticator : IAuthenticator
6+
{
7+
public Task Authenticate(HttpRequestMessage request)
8+
{
9+
throw new Exception("In order to use an authenticated request, you have to provide an user credentials.");
10+
}
11+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
namespace Backbone.ConsumerApi.Sdk.Authentication;
2+
3+
public class ClientCredentials
4+
{
5+
public ClientCredentials(string clientId, string clientSecret)
6+
{
7+
ClientId = clientId;
8+
ClientSecret = clientSecret;
9+
}
10+
11+
public string ClientId { get; }
12+
public string ClientSecret { get; }
13+
}

ConsumerApi.Sdk/Endpoints/Common/OAuthAuthenticator.cs renamed to ConsumerApi.Sdk/Authentication/OAuthAuthenticator.cs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,32 +5,37 @@
55
using System.Text.Json.Serialization;
66
using Backbone.BuildingBlocks.SDK.Endpoints.Common;
77

8-
namespace Backbone.ConsumerApi.Sdk.Endpoints.Common;
8+
namespace Backbone.ConsumerApi.Sdk.Authentication;
99

1010
public class OAuthAuthenticator : IAuthenticator
1111
{
1212
private static readonly JsonSerializerOptions SERIALIZER_OPTIONS = new() { PropertyNameCaseInsensitive = true };
1313

14+
private readonly Configuration.AuthenticationConfiguration _config;
1415
private readonly HttpClient _httpClient;
1516
private readonly Dictionary<string, string> _jwtRequestData;
1617
private Jwt? _jwt;
1718

1819
public OAuthAuthenticator(Configuration.AuthenticationConfiguration config, HttpClient httpClient)
1920
{
21+
_config = config;
2022
_httpClient = httpClient;
2123

2224
_jwtRequestData = new Dictionary<string, string>
2325
{
2426
{ "grant_type", "password" },
25-
{ "username", config.Username },
26-
{ "password", config.Password },
27-
{ "client_id", config.ClientId },
28-
{ "client_secret", config.ClientSecret }
27+
{ "username", config.UserCredentials?.Username! },
28+
{ "password", config.UserCredentials?.Password! },
29+
{ "client_id", config.ClientCredentials.ClientId },
30+
{ "client_secret", config.ClientCredentials.ClientSecret }
2931
};
3032
}
3133

3234
public async Task Authenticate(HttpRequestMessage request)
3335
{
36+
if (_config.UserCredentials == null)
37+
throw new InvalidOperationException("User credentials are required in order to authenticate this request.");
38+
3439
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", await GetJwt());
3540
}
3641

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
namespace Backbone.ConsumerApi.Sdk.Authentication;
2+
3+
public class UserCredentials
4+
{
5+
public UserCredentials(string username, string password)
6+
{
7+
Username = username;
8+
Password = password;
9+
}
10+
11+
public string Username { get; }
12+
public string Password { get; }
13+
}

0 commit comments

Comments
 (0)