Skip to content

Commit

Permalink
Merge pull request #164 from swlodarski-sumoheavy/6.0.x
Browse files Browse the repository at this point in the history
SP-1028 Add X-BitPay-Platform-Info header
  • Loading branch information
bobbrodie authored Sep 4, 2024
2 parents 5060ff7 + c0fa22a commit c5909ca
Show file tree
Hide file tree
Showing 3 changed files with 82 additions and 34 deletions.
26 changes: 15 additions & 11 deletions BitPay/Client.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,26 +34,28 @@ public class Client
/// Create Client class for POS.
/// </summary>
/// <param name="token">Pos token VO.</param>
public Client(PosToken token)
/// <param name="platformInfo">Platform info.</param>
public Client(PosToken token, string? platformInfo = null)
{
if (token == null) throw new ArgumentNullException(nameof(token));

_accessTokens = GetAccessTokens(token);
_bitPayClient = GetDefaultBitPayClient(Environment.Prod);
_bitPayClient = GetDefaultBitPayClient(Environment.Prod, platformInfo);
}

/// <summary>
/// Create Client class for POS.
/// </summary>
/// <param name="token">Pos token VO.</param>
/// <param name="environment">Environment</param>
public Client(PosToken token, Environment environment)
/// <param name="platformInfo">Platform info.</param>
public Client(PosToken token, Environment environment, string? platformInfo = null)
{
if (token == null)
throw new ArgumentNullException(nameof(token));

_accessTokens = GetAccessTokens(token);
_bitPayClient = GetDefaultBitPayClient(environment);
_bitPayClient = GetDefaultBitPayClient(environment, platformInfo);
}

/// <summary>
Expand All @@ -62,7 +64,8 @@ public Client(PosToken token, Environment environment)
/// <param name="environment">Environment</param>
/// <param name="privateKey"></param>
/// <param name="accessTokens"></param>
public Client(PrivateKey privateKey, AccessTokens accessTokens, Environment environment = Environment.Prod)
/// <param name="platformInfo">Platform info.</param>
public Client(PrivateKey privateKey, AccessTokens accessTokens, Environment environment = Environment.Prod, string? platformInfo = null)
{
if (privateKey == null)
{
Expand All @@ -79,7 +82,7 @@ public Client(PrivateKey privateKey, AccessTokens accessTokens, Environment envi
var httpClient = GetHttpClient(baseUrl);

_accessTokens = accessTokens;
_bitPayClient = new BitPayClient(httpClient, baseUrl, ecKey);
_bitPayClient = new BitPayClient(httpClient, baseUrl, ecKey, platformInfo);
CreateIdentity(ecKey);
}

Expand All @@ -88,7 +91,8 @@ public Client(PrivateKey privateKey, AccessTokens accessTokens, Environment envi
/// </summary>
/// <param name="configFilePath">Config File Path</param>
/// <param name="environment">Environment</param>
public Client(ConfigFilePath configFilePath, Environment environment = Environment.Prod)
/// <param name="platformInfo">Platform info.</param>
public Client(ConfigFilePath configFilePath, Environment environment = Environment.Prod, string? platformInfo = null)
{
if (configFilePath == null)
{
Expand All @@ -102,7 +106,7 @@ public Client(ConfigFilePath configFilePath, Environment environment = Environme
var baseUrl = GetBaseUrl(environment);
var httpClient = GetHttpClient(baseUrl);

_bitPayClient = new BitPayClient(httpClient, baseUrl, ecKey);
_bitPayClient = new BitPayClient(httpClient, baseUrl, ecKey, platformInfo);
CreateIdentity(ecKey);
}

Expand Down Expand Up @@ -948,11 +952,11 @@ private AccessTokens GetAccessTokens(PosToken token)
return accessTokens;
}

private IBitPayClient GetDefaultBitPayClient(Environment environment)
private IBitPayClient GetDefaultBitPayClient(Environment environment, string? platformInfo)
{
var baseUrl = GetBaseUrl(environment);
var httpClient = GetHttpClient(baseUrl);
return new BitPayClient(httpClient, baseUrl, null);
return new BitPayClient(httpClient, baseUrl, null, platformInfo);
}

private static HttpClient GetHttpClient(string baseUrl)
Expand All @@ -977,4 +981,4 @@ private EcKey GetEcKey(IConfiguration config, string env)
.GetSection("BitPayConfiguration:EnvConfig:" + env + ":PrivateKey").Value);
}
}
}
}
45 changes: 23 additions & 22 deletions BitPay/Clients/BitPayClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,14 @@ public class BitPayClient : IBitPayClient
private readonly HttpClient _httpClient;
private readonly string _baseUrl;
private readonly EcKey? _ecKey;
private readonly string? _platformInfo;

public BitPayClient(HttpClient httpClient, string baseUrl, EcKey? ecKey)
public BitPayClient(HttpClient httpClient, string baseUrl, EcKey? ecKey, string? platformInfo = null)
{
this._httpClient = httpClient;
this._baseUrl = baseUrl;
this._ecKey = ecKey;
this._platformInfo = platformInfo;
}

/// <summary>
Expand All @@ -39,11 +41,9 @@ public async Task<HttpResponseMessage> Get(string uri, Dictionary<string, dynami
bool signatureRequired = true)
{
var fullUrl = _baseUrl + uri;
_httpClient.DefaultRequestHeaders.Clear();
_httpClient.DefaultRequestHeaders.Add("x-accept-version", Config.BitPayApiVersion);
_httpClient.DefaultRequestHeaders.Add("x-bitpay-plugin-info", Config.BitPayPluginInfo);
_httpClient.DefaultRequestHeaders.Add("x-bitpay-api-frame", Config.BitPayApiFrame);
_httpClient.DefaultRequestHeaders.Add("x-bitpay-api-frame-version", Config.BitPayApiFrameVersion);

AddDefaultHeaders();

if (parameters != null)
{
fullUrl += "?";
Expand Down Expand Up @@ -84,11 +84,7 @@ public async Task<HttpResponseMessage> Get(string uri, Dictionary<string, dynami
public async Task<HttpResponseMessage> Delete(string uri, Dictionary<string, dynamic?>? parameters = null)
{
var fullUrl = _baseUrl + uri;
_httpClient.DefaultRequestHeaders.Clear();
_httpClient.DefaultRequestHeaders.Add("x-accept-version", Config.BitPayApiVersion);
_httpClient.DefaultRequestHeaders.Add("x-bitpay-plugin-info", Config.BitPayPluginInfo);
_httpClient.DefaultRequestHeaders.Add("x-bitpay-api-frame", Config.BitPayApiFrame);
_httpClient.DefaultRequestHeaders.Add("x-bitpay-api-frame-version", Config.BitPayApiFrameVersion);
AddDefaultHeaders();

if (parameters != null)
{
Expand Down Expand Up @@ -121,11 +117,7 @@ public async Task<HttpResponseMessage> Post(string uri, string json, bool signat
{
using var bodyContent = new StringContent(UnicodeToAscii(json));

_httpClient.DefaultRequestHeaders.Clear();
_httpClient.DefaultRequestHeaders.Add("x-accept-version", Config.BitPayApiVersion);
_httpClient.DefaultRequestHeaders.Add("x-bitpay-plugin-info", Config.BitPayPluginInfo);
_httpClient.DefaultRequestHeaders.Add("x-bitpay-api-frame", Config.BitPayApiFrame);
_httpClient.DefaultRequestHeaders.Add("x-bitpay-api-frame-version", Config.BitPayApiFrameVersion);
AddDefaultHeaders();
bodyContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
if (signatureRequired)
{
Expand Down Expand Up @@ -156,11 +148,7 @@ public async Task<HttpResponseMessage> Put(string uri, string json)
{
using var bodyContent = new StringContent(UnicodeToAscii(json));

_httpClient.DefaultRequestHeaders.Clear();
_httpClient.DefaultRequestHeaders.Add("x-accept-version", Config.BitPayApiVersion);
_httpClient.DefaultRequestHeaders.Add("x-bitpay-plugin-info", Config.BitPayPluginInfo);
_httpClient.DefaultRequestHeaders.Add("x-bitpay-api-frame", Config.BitPayApiFrame);
_httpClient.DefaultRequestHeaders.Add("x-bitpay-api-frame-version", Config.BitPayApiFrameVersion);
AddDefaultHeaders();
bodyContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

var signature = KeyUtils.Sign(_ecKey, _baseUrl + uri + json);
Expand Down Expand Up @@ -193,5 +181,18 @@ private string UnicodeToAscii(string json)
Encoding.ASCII.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0);
return new string(asciiChars);
}

private void AddDefaultHeaders()
{
_httpClient.DefaultRequestHeaders.Clear();
_httpClient.DefaultRequestHeaders.Add("x-accept-version", Config.BitPayApiVersion);
_httpClient.DefaultRequestHeaders.Add("x-bitpay-plugin-info", Config.BitPayPluginInfo);
_httpClient.DefaultRequestHeaders.Add("x-bitpay-api-frame", Config.BitPayApiFrame);
_httpClient.DefaultRequestHeaders.Add("x-bitpay-api-frame-version", Config.BitPayApiFrameVersion);

if (!string.IsNullOrEmpty(this._platformInfo)) {
_httpClient.DefaultRequestHeaders.Add("x-bitPay-platform-info", this._platformInfo);
}
}
}
}
}
45 changes: 44 additions & 1 deletion BitPayUnitTest/ClientTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,17 @@ public void it_should_provide_pos_client()
Assert.Equal(posToken, client.GetAccessToken("pos"));
}

[Fact]
public void it_should_provide_pos_client_with_platform_info_header()
{
string posToken = "posToken";

var client = new Client(new PosToken(posToken), "MyPlatform_v1.0.0");

Assert.IsType<Client>(client);
Assert.Equal(posToken, client.GetAccessToken("pos"));
}

[Fact]
public void it_should_provide_client_by_key()
{
Expand All @@ -65,6 +76,23 @@ public void it_should_provide_client_by_key()
Assert.Equal(merchantToken, client.GetAccessToken(Facade.Merchant));
}

[Fact]
public void it_should_provide_client_by_key_with_platform_info_header()
{
// given
String privateKey =
"75371435315047800683080420474719166774492308988314944856528163960396135344086";
String merchantToken = "merchantToken";
AccessTokens tokens = new AccessTokens();
tokens.AddMerchant(merchantToken);

// when
Client client = new Client(new PrivateKey(privateKey), tokens, Environment.Test, "MyPlatform_v1.0.0");

// then
Assert.Equal(merchantToken, client.GetAccessToken(Facade.Merchant));
}

[Fact]
public void it_should_provide_client_by_config_file()
{
Expand All @@ -79,6 +107,21 @@ public void it_should_provide_client_by_config_file()
Assert.Equal("payoutToken", bitpay.GetAccessToken(Facade.Payout));
}


[Fact]
public void it_should_provide_client_by_config_file_with_platform_info_header()
{
// given
string path = GetBitPayUnitTestPath() + Path.DirectorySeparatorChar + "BitPay.config.json";

// when
Client bitpay = new Client(new ConfigFilePath(path), Environment.Test, "MyPlatform_v1.0.0");

// then
Assert.Equal("merchantToken", bitpay.GetAccessToken(Facade.Merchant));
Assert.Equal("payoutToken", bitpay.GetAccessToken(Facade.Payout));
}

[Fact]
public void TestShouldThrowsBitPayExceptionForInvalidPrivateKey()
{
Expand Down Expand Up @@ -2073,4 +2116,4 @@ private Client GetTestedClassAsPayout()
);
}
}
}
}

0 comments on commit c5909ca

Please sign in to comment.