From cd8ef0c1ffd2efa91a77248aa8932b03af1baa54 Mon Sep 17 00:00:00 2001 From: Nicolas Dorier Date: Thu, 18 Jan 2024 14:08:07 +0900 Subject: [PATCH] Fix: Bitpay's API rate route wasn't backward for some queries (#5671) --- BTCPayServer.Tests/UnitTest1.cs | 9 +++++++- .../Controllers/BitpayRateController.cs | 21 ++++++++++++------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/BTCPayServer.Tests/UnitTest1.cs b/BTCPayServer.Tests/UnitTest1.cs index 8e1144ad6..641b0dd74 100644 --- a/BTCPayServer.Tests/UnitTest1.cs +++ b/BTCPayServer.Tests/UnitTest1.cs @@ -1147,6 +1147,14 @@ namespace BTCPayServer.Tests bitpay = new Bitpay(k, tester.PayTester.ServerUri); Assert.True(bitpay.TestAccess(Facade.Merchant)); Assert.True(bitpay.TestAccess(Facade.PointOfSale)); + HttpClient client = new HttpClient(); + var token = (await bitpay.GetAccessTokenAsync(Facade.Merchant)).Value; + var getRates = tester.PayTester.ServerUri.AbsoluteUri + $"rates/?cryptoCode=BTC&token={token}"; + var req = new HttpRequestMessage(HttpMethod.Get, getRates); + req.Headers.Add("x-signature", NBitpayClient.Extensions.BitIdExtensions.GetBitIDSignature(k, getRates, null)); + req.Headers.Add("x-identity", k.PubKey.ToHex()); + var resp = await client.SendAsync(req); + resp.EnsureSuccessStatusCode(); // Can generate API Key var repo = tester.PayTester.GetService(); @@ -1167,7 +1175,6 @@ namespace BTCPayServer.Tests apiKey = apiKey2; // Can create an invoice with this new API Key - HttpClient client = new HttpClient(); HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Post, tester.PayTester.ServerUri.AbsoluteUri + "invoices"); message.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", diff --git a/BTCPayServer/Controllers/BitpayRateController.cs b/BTCPayServer/Controllers/BitpayRateController.cs index ad2173ac6..dce0494d8 100644 --- a/BTCPayServer/Controllers/BitpayRateController.cs +++ b/BTCPayServer/Controllers/BitpayRateController.cs @@ -48,7 +48,7 @@ namespace BTCPayServer.Controllers [Route("rates/{baseCurrency}")] [HttpGet] [BitpayAPIConstraint] - public async Task GetBaseCurrencyRates(string baseCurrency, CancellationToken cancellationToken) + public async Task GetBaseCurrencyRates(string baseCurrency, string cryptoCode = null, CancellationToken cancellationToken = default) { var supportedMethods = CurrentStore.GetSupportedPaymentMethods(_networkProvider); @@ -57,16 +57,16 @@ namespace BTCPayServer.Controllers var currencypairs = BuildCurrencyPairs(currencyCodes, baseCurrency); - var result = await GetRates2(currencypairs, null, cancellationToken); + var result = await GetRates2(currencypairs, null, cryptoCode, cancellationToken); var rates = (result as JsonResult)?.Value as Rate[]; return rates == null ? result : Json(new DataWrapper(rates)); } [HttpGet("rates/{baseCurrency}/{currency}")] [BitpayAPIConstraint] - public async Task GetCurrencyPairRate(string baseCurrency, string currency, CancellationToken cancellationToken) + public async Task GetCurrencyPairRate(string baseCurrency, string currency, string cryptoCode = null, CancellationToken cancellationToken = default) { - var result = await GetRates2($"{baseCurrency}_{currency}", null, cancellationToken); + var result = await GetRates2($"{baseCurrency}_{currency}", null, cryptoCode, cancellationToken); return (result as JsonResult)?.Value is not Rate[] rates ? result : Json(new DataWrapper(rates.First())); @@ -74,9 +74,9 @@ namespace BTCPayServer.Controllers [HttpGet("rates")] [BitpayAPIConstraint] - public async Task GetRates(string currencyPairs, string storeId = null, CancellationToken cancellationToken = default) + public async Task GetRates(string currencyPairs, string storeId = null, string cryptoCode = null, CancellationToken cancellationToken = default) { - var result = await GetRates2(currencyPairs, storeId, cancellationToken); + var result = await GetRates2(currencyPairs, storeId, cryptoCode, cancellationToken); return (result as JsonResult)?.Value is not Rate[] rates ? result : Json(new DataWrapper(rates)); @@ -84,7 +84,7 @@ namespace BTCPayServer.Controllers [AllowAnonymous] [HttpGet("api/rates")] - public async Task GetRates2(string currencyPairs, string storeId, CancellationToken cancellationToken) + public async Task GetRates2(string currencyPairs, string storeId, string cryptoCode = null, CancellationToken cancellationToken = default) { var store = CurrentStore ?? await _storeRepo.FindStore(storeId); if (store == null) @@ -95,7 +95,12 @@ namespace BTCPayServer.Controllers } if (currencyPairs == null) { - currencyPairs = store.GetStoreBlob().GetDefaultCurrencyPairString(); + var blob = store.GetStoreBlob(); + currencyPairs = blob.GetDefaultCurrencyPairString(); + if (string.IsNullOrEmpty(currencyPairs) && !string.IsNullOrWhiteSpace(cryptoCode)) + { + currencyPairs = $"{blob.DefaultCurrency}_{cryptoCode}".ToUpperInvariant(); + } if (string.IsNullOrEmpty(currencyPairs)) { var result = Json(new BitpayErrorsModel() { Error = "You need to setup the default currency pairs in 'Store Settings / Rates' or specify 'currencyPairs' query parameter (eg. BTC_USD,LTC_CAD)." });