Provide Pretty descriptions for payment methods from their handlers (#852)

* small cleanup

* Provide Pretty descriptions for payment methods from their handlers

* remove PrettyMethod()
This commit is contained in:
Andrew Camilleri 2019-05-24 06:38:47 +00:00 committed by Nicolas Dorier
parent ef9c2e8af1
commit 25b08b21fa
7 changed files with 51 additions and 49 deletions

View file

@ -539,7 +539,22 @@ namespace BTCPayServer.Controllers
}
private SelectList GetPaymentMethodsSelectList()
{
return new SelectList(
_NetworkProvider.GetAll()
.SelectMany(network => new[]
{
new PaymentMethodId(network.CryptoCode, PaymentTypes.BTCLike),
new PaymentMethodId(network.CryptoCode, PaymentTypes.LightningLike)
}).Select(id =>
{
var handler = _paymentMethodHandlers.GetCorrectHandler(id);
return new SelectListItem(handler.ToPrettyString(id), id.ToString());
}),
nameof(SelectListItem.Value),
nameof(SelectListItem.Text));
}
[HttpGet]
[Route("invoices/create")]
[Authorize(AuthenticationSchemes = Policies.CookieAuthentication)]
@ -553,15 +568,7 @@ namespace BTCPayServer.Controllers
return RedirectToAction(nameof(UserStoresController.ListStores), "UserStores");
}
var paymentMethods = new SelectList(_NetworkProvider.GetAll().SelectMany(network => new[]
{
new PaymentMethodId(network.CryptoCode, PaymentTypes.BTCLike),
new PaymentMethodId(network.CryptoCode, PaymentTypes.LightningLike)
}).Select(id => new SelectListItem(id.ToString(true), id.ToString(false))),
nameof(SelectListItem.Value),
nameof(SelectListItem.Text));
return View(new CreateInvoiceModel() { Stores = stores, AvailablePaymentMethods = paymentMethods });
return View(new CreateInvoiceModel() { Stores = stores, AvailablePaymentMethods = GetPaymentMethodsSelectList() });
}
[HttpPost]
@ -573,14 +580,7 @@ namespace BTCPayServer.Controllers
var stores = await _StoreRepository.GetStoresByUserId(GetUserId());
model.Stores = new SelectList(stores, nameof(StoreData.Id), nameof(StoreData.StoreName), model.StoreId);
var paymentMethods = new SelectList(_NetworkProvider.GetAll().SelectMany(network => new[]
{
new PaymentMethodId(network.CryptoCode, PaymentTypes.BTCLike),
new PaymentMethodId(network.CryptoCode, PaymentTypes.LightningLike)
}).Select(id => new SelectListItem(id.ToString(true), id.ToString(false))),
nameof(SelectListItem.Value),
nameof(SelectListItem.Text));
model.AvailablePaymentMethods = paymentMethods;
model.AvailablePaymentMethods = GetPaymentMethodsSelectList();
var store = stores.FirstOrDefault(s => s.Id == model.StoreId);
if (store == null)

View file

@ -36,6 +36,7 @@ namespace BTCPayServer.Controllers
private CurrencyNameTable _CurrencyNameTable;
EventAggregator _EventAggregator;
BTCPayNetworkProvider _NetworkProvider;
private readonly IEnumerable<IPaymentMethodHandler> _paymentMethodHandlers;
private readonly BTCPayWalletProvider _WalletProvider;
IServiceProvider _ServiceProvider;
public InvoiceController(
@ -48,7 +49,8 @@ namespace BTCPayServer.Controllers
EventAggregator eventAggregator,
BTCPayWalletProvider walletProvider,
ContentSecurityPolicies csp,
BTCPayNetworkProvider networkProvider)
BTCPayNetworkProvider networkProvider,
IEnumerable<IPaymentMethodHandler> paymentMethodHandlers)
{
_ServiceProvider = serviceProvider;
_CurrencyNameTable = currencyNameTable ?? throw new ArgumentNullException(nameof(currencyNameTable));
@ -58,6 +60,7 @@ namespace BTCPayServer.Controllers
_UserManager = userManager;
_EventAggregator = eventAggregator;
_NetworkProvider = networkProvider;
_paymentMethodHandlers = paymentMethodHandlers;
_WalletProvider = walletProvider;
_CSP = csp;
}
@ -247,7 +250,7 @@ namespace BTCPayServer.Controllers
{
try
{
var logPrefix = $"{supportedPaymentMethod.PaymentId.ToString(true)}:";
var logPrefix = $"{handler.ToPrettyString(supportedPaymentMethod.PaymentId)}:";
var storeBlob = store.GetStoreBlob();
var preparePayment = handler.PreparePayment(supportedPaymentMethod, store, network);
var rate = await fetchingByCurrencyPair[new CurrencyPair(network.CryptoCode, entity.ProductInformation.Currency)];

View file

@ -39,6 +39,11 @@ namespace BTCPayServer
{
public static class Extensions
{
public static IPaymentMethodHandler GetCorrectHandler(
this IEnumerable<IPaymentMethodHandler> paymentMethodHandlers, PaymentMethodId paymentMethodId)
{
return paymentMethodHandlers.First(handler => handler.CanHandle(paymentMethodId));
}
public static string PrettyPrint(this TimeSpan expiration)
{
StringBuilder builder = new StringBuilder();

View file

@ -42,6 +42,9 @@ namespace BTCPayServer.Payments.Bitcoin
};
}
public override string PrettyDescription => "On-Chain";
public override PaymentTypes PaymentType => PaymentTypes.BTCLike;
public override async Task<IPaymentMethodDetails> CreatePaymentMethodDetails(DerivationSchemeSettings supportedPaymentMethod, PaymentMethod paymentMethod, StoreData store, BTCPayNetwork network, object preparePaymentObject)
{
if (!_ExplorerProvider.IsAvailable(network))

View file

@ -30,6 +30,10 @@ namespace BTCPayServer.Payments
/// <param name="network"></param>
/// <returns></returns>
object PreparePayment(ISupportedPaymentMethod supportedPaymentMethod, StoreData store, BTCPayNetwork network);
bool CanHandle(PaymentMethodId paymentMethodId);
string ToPrettyString(PaymentMethodId paymentMethodId);
}
public interface IPaymentMethodHandler<T> : IPaymentMethodHandler where T : ISupportedPaymentMethod
@ -39,7 +43,8 @@ namespace BTCPayServer.Payments
public abstract class PaymentMethodHandlerBase<T> : IPaymentMethodHandler<T> where T : ISupportedPaymentMethod
{
public abstract string PrettyDescription { get; }
public abstract PaymentTypes PaymentType { get; }
public abstract Task<IPaymentMethodDetails> CreatePaymentMethodDetails(T supportedPaymentMethod, PaymentMethod paymentMethod, StoreData store, BTCPayNetwork network, object preparePaymentObject);
public virtual object PreparePayment(T supportedPaymentMethod, StoreData store, BTCPayNetwork network)
{
@ -55,6 +60,16 @@ namespace BTCPayServer.Payments
throw new NotSupportedException("Invalid supportedPaymentMethod");
}
public bool CanHandle(PaymentMethodId paymentMethodId)
{
return paymentMethodId.PaymentType.Equals(PaymentType);
}
public string ToPrettyString(PaymentMethodId paymentMethodId)
{
return $"{paymentMethodId.CryptoCode} ({PrettyDescription})";
}
Task<IPaymentMethodDetails> IPaymentMethodHandler.CreatePaymentMethodDetails(ISupportedPaymentMethod supportedPaymentMethod, PaymentMethod paymentMethod, StoreData store, BTCPayNetwork network, object preparePaymentObject)
{
if (supportedPaymentMethod is T method)

View file

@ -31,6 +31,9 @@ namespace BTCPayServer.Payments.Lightning
_lightningClientFactory = lightningClientFactory;
_socketFactory = socketFactory;
}
public override string PrettyDescription => "Off-Chain";
public override PaymentTypes PaymentType => PaymentTypes.LightningLike;
public override async Task<IPaymentMethodDetails> CreatePaymentMethodDetails(LightningSupportedPaymentMethod supportedPaymentMethod, PaymentMethod paymentMethod, StoreData store, BTCPayNetwork network, object preparePaymentObject)
{
var storeBlob = store.GetStoreBlob();

View file

@ -62,34 +62,7 @@ namespace BTCPayServer.Payments
public override string ToString()
{
return ToString(false);
}
public string ToString(bool pretty)
{
if (pretty)
{
return $"{CryptoCode} ({PrettyMethod(PaymentType)})";
}
else
{
if (PaymentType == PaymentTypes.BTCLike)
return CryptoCode;
return CryptoCode + "_" + PaymentType.ToString();
}
}
private static string PrettyMethod(PaymentTypes paymentType)
{
switch (paymentType)
{
case PaymentTypes.BTCLike:
return "On-Chain";
case PaymentTypes.LightningLike:
return "Off-Chain";
default:
return paymentType.ToString();
}
return PaymentType == PaymentTypes.BTCLike ? CryptoCode : $"{CryptoCode}_{PaymentType}";
}
public static bool TryParse(string str, out PaymentMethodId paymentMethodId)