From 69247dee8a2e25ef3430fae1def17c08f5ac4e38 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Fri, 19 Jan 2018 18:11:43 +0900 Subject: [PATCH] Fix api/rates allow to scope by cyrptoCode and storeId --- BTCPayServer/BTCPayServer.csproj | 2 +- BTCPayServer/Controllers/RateController.cs | 46 ++++++++++++++++--- BTCPayServer/Controllers/StoresController.cs | 2 + BTCPayServer/Data/StoreData.cs | 2 +- .../Services/Rates/CachedRateProvider.cs | 6 ++- 5 files changed, 47 insertions(+), 11 deletions(-) diff --git a/BTCPayServer/BTCPayServer.csproj b/BTCPayServer/BTCPayServer.csproj index 4f1a0083e..49e53e678 100644 --- a/BTCPayServer/BTCPayServer.csproj +++ b/BTCPayServer/BTCPayServer.csproj @@ -2,7 +2,7 @@ Exe netcoreapp2.0 - 1.0.1.14 + 1.0.1.15 diff --git a/BTCPayServer/Controllers/RateController.cs b/BTCPayServer/Controllers/RateController.cs index c0515e886..40055004c 100644 --- a/BTCPayServer/Controllers/RateController.cs +++ b/BTCPayServer/Controllers/RateController.cs @@ -7,34 +7,66 @@ using System.Linq; using System.Threading.Tasks; using BTCPayServer.Filters; using BTCPayServer.Services.Rates; +using BTCPayServer.Services.Stores; namespace BTCPayServer.Controllers { public class RateController : Controller { - IRateProvider _RateProvider; + IRateProviderFactory _RateProviderFactory; + BTCPayNetworkProvider _NetworkProvider; CurrencyNameTable _CurrencyNameTable; - public RateController(IRateProvider rateProvider, CurrencyNameTable currencyNameTable) + StoreRepository _StoreRepo; + public RateController( + IRateProviderFactory rateProviderFactory, + BTCPayNetworkProvider networkProvider, + StoreRepository storeRepo, + CurrencyNameTable currencyNameTable) { - _RateProvider = rateProvider ?? throw new ArgumentNullException(nameof(rateProvider)); + _RateProviderFactory = rateProviderFactory ?? throw new ArgumentNullException(nameof(rateProviderFactory)); + _NetworkProvider = networkProvider; + _StoreRepo = storeRepo; _CurrencyNameTable = currencyNameTable ?? throw new ArgumentNullException(nameof(currencyNameTable)); } [Route("rates")] [HttpGet] [BitpayAPIConstraint] - public async Task> GetRates() + public async Task GetRates(string cryptoCode = null, string storeId = null) { - var allRates = (await _RateProvider.GetRatesAsync()); - return new DataWrapper + cryptoCode = cryptoCode ?? "BTC"; + var network= _NetworkProvider.GetNetwork(cryptoCode); + if (network == null) + return NotFound(); + var rateProvider = _RateProviderFactory.GetRateProvider(network); + if (rateProvider == null) + return NotFound(); + + if(storeId != null) + { + var store = await _StoreRepo.FindStore(storeId); + if (store == null) + return NotFound(); + rateProvider = store.GetStoreBlob().ApplyRateRules(network, rateProvider); + } + + var allRates = (await rateProvider.GetRatesAsync()); + return Json(new DataWrapper (allRates.Select(r => new NBitpayClient.Rate() { Code = r.Currency, Name = _CurrencyNameTable.GetCurrencyData(r.Currency)?.Name, Value = r.Value - }).Where(n => n.Name != null).ToArray()); + }).Where(n => n.Name != null).ToArray())); } + + [Route("api/rates")] + [HttpGet] + public Task GetRates2(string cryptoCode = null, string storeId = null) + { + return GetRates(cryptoCode, storeId); + } } } diff --git a/BTCPayServer/Controllers/StoresController.cs b/BTCPayServer/Controllers/StoresController.cs index 8c04f188c..c61476377 100644 --- a/BTCPayServer/Controllers/StoresController.cs +++ b/BTCPayServer/Controllers/StoresController.cs @@ -278,6 +278,8 @@ namespace BTCPayServer.Controllers { return View(model); } + if (model.PreferredExchange != null) + model.PreferredExchange = model.PreferredExchange.Trim().ToLowerInvariant(); var store = await _Repo.FindStore(storeId, GetUserId()); if (store == null) return NotFound(); diff --git a/BTCPayServer/Data/StoreData.cs b/BTCPayServer/Data/StoreData.cs index 609329e33..40dac1763 100644 --- a/BTCPayServer/Data/StoreData.cs +++ b/BTCPayServer/Data/StoreData.cs @@ -248,7 +248,7 @@ namespace BTCPayServer.Data new CoinAverageRateProvider(network.CryptoCode) { Exchange = PreferredExchange }, cachedRateProvider.Inner }); - rateProvider = new CachedRateProvider(network.CryptoCode, rateProvider, cachedRateProvider.MemoryCache); + rateProvider = new CachedRateProvider(network.CryptoCode, rateProvider, cachedRateProvider.MemoryCache) { AdditionalScope = PreferredExchange }; } else { diff --git a/BTCPayServer/Services/Rates/CachedRateProvider.cs b/BTCPayServer/Services/Rates/CachedRateProvider.cs index a1999b87e..9f6016b6c 100644 --- a/BTCPayServer/Services/Rates/CachedRateProvider.cs +++ b/BTCPayServer/Services/Rates/CachedRateProvider.cs @@ -40,7 +40,7 @@ namespace BTCPayServer.Services.Rates public Task GetRateAsync(string currency) { - return MemoryCache.GetOrCreateAsync("CURR_" + currency + "_" + _CryptoCode, (ICacheEntry entry) => + return MemoryCache.GetOrCreateAsync("CURR_" + currency + "_" + _CryptoCode + "_" + AdditionalScope, (ICacheEntry entry) => { entry.AbsoluteExpiration = DateTimeOffset.UtcNow + CacheSpan; return _Inner.GetRateAsync(currency); @@ -49,11 +49,13 @@ namespace BTCPayServer.Services.Rates public Task> GetRatesAsync() { - return MemoryCache.GetOrCreateAsync("GLOBAL_RATES", (ICacheEntry entry) => + return MemoryCache.GetOrCreateAsync("GLOBAL_RATES_" + _CryptoCode + "_" + AdditionalScope, (ICacheEntry entry) => { entry.AbsoluteExpiration = DateTimeOffset.UtcNow + CacheSpan; return _Inner.GetRatesAsync(); }); } + + public string AdditionalScope { get; set; } } }