2018-01-17 15:59:31 +09:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
using BTCPayServer.Data;
|
|
|
|
|
|
|
|
|
|
namespace BTCPayServer.Services.Rates
|
|
|
|
|
{
|
|
|
|
|
public class TweakRateProvider : IRateProvider
|
|
|
|
|
{
|
|
|
|
|
private BTCPayNetwork network;
|
|
|
|
|
private IRateProvider rateProvider;
|
2018-04-15 21:18:51 +09:00
|
|
|
|
private RateRules rateRules;
|
2018-01-17 15:59:31 +09:00
|
|
|
|
|
2018-04-15 21:18:51 +09:00
|
|
|
|
public TweakRateProvider(BTCPayNetwork network, IRateProvider rateProvider, RateRules rateRules)
|
2018-01-17 15:59:31 +09:00
|
|
|
|
{
|
|
|
|
|
if (network == null)
|
|
|
|
|
throw new ArgumentNullException(nameof(network));
|
|
|
|
|
if (rateProvider == null)
|
|
|
|
|
throw new ArgumentNullException(nameof(rateProvider));
|
|
|
|
|
if (rateRules == null)
|
|
|
|
|
throw new ArgumentNullException(nameof(rateRules));
|
|
|
|
|
this.network = network;
|
|
|
|
|
this.rateProvider = rateProvider;
|
|
|
|
|
this.rateRules = rateRules;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task<decimal> GetRateAsync(string currency)
|
|
|
|
|
{
|
|
|
|
|
var rate = await rateProvider.GetRateAsync(currency);
|
|
|
|
|
foreach(var rule in rateRules)
|
|
|
|
|
{
|
|
|
|
|
rate = rule.Apply(network, rate);
|
|
|
|
|
}
|
|
|
|
|
return rate;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task<ICollection<Rate>> GetRatesAsync()
|
|
|
|
|
{
|
|
|
|
|
List<Rate> rates = new List<Rate>();
|
|
|
|
|
foreach (var rate in await rateProvider.GetRatesAsync())
|
|
|
|
|
{
|
|
|
|
|
var localRate = rate.Value;
|
|
|
|
|
foreach (var rule in rateRules)
|
|
|
|
|
{
|
|
|
|
|
localRate = rule.Apply(network, localRate);
|
|
|
|
|
}
|
|
|
|
|
rates.Add(new Rate(rate.Currency, localRate));
|
|
|
|
|
}
|
|
|
|
|
return rates;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|