mirror of
https://github.com/aljazceru/btcpayserver.git
synced 2025-12-18 14:34:23 +01:00
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:
committed by
Nicolas Dorier
parent
ef9c2e8af1
commit
25b08b21fa
@@ -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]
|
[HttpGet]
|
||||||
[Route("invoices/create")]
|
[Route("invoices/create")]
|
||||||
[Authorize(AuthenticationSchemes = Policies.CookieAuthentication)]
|
[Authorize(AuthenticationSchemes = Policies.CookieAuthentication)]
|
||||||
@@ -553,15 +568,7 @@ namespace BTCPayServer.Controllers
|
|||||||
return RedirectToAction(nameof(UserStoresController.ListStores), "UserStores");
|
return RedirectToAction(nameof(UserStoresController.ListStores), "UserStores");
|
||||||
}
|
}
|
||||||
|
|
||||||
var paymentMethods = new SelectList(_NetworkProvider.GetAll().SelectMany(network => new[]
|
return View(new CreateInvoiceModel() { Stores = stores, AvailablePaymentMethods = GetPaymentMethodsSelectList() });
|
||||||
{
|
|
||||||
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 });
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
@@ -573,14 +580,7 @@ namespace BTCPayServer.Controllers
|
|||||||
var stores = await _StoreRepository.GetStoresByUserId(GetUserId());
|
var stores = await _StoreRepository.GetStoresByUserId(GetUserId());
|
||||||
model.Stores = new SelectList(stores, nameof(StoreData.Id), nameof(StoreData.StoreName), model.StoreId);
|
model.Stores = new SelectList(stores, nameof(StoreData.Id), nameof(StoreData.StoreName), model.StoreId);
|
||||||
|
|
||||||
var paymentMethods = new SelectList(_NetworkProvider.GetAll().SelectMany(network => new[]
|
model.AvailablePaymentMethods = GetPaymentMethodsSelectList();
|
||||||
{
|
|
||||||
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;
|
|
||||||
|
|
||||||
var store = stores.FirstOrDefault(s => s.Id == model.StoreId);
|
var store = stores.FirstOrDefault(s => s.Id == model.StoreId);
|
||||||
if (store == null)
|
if (store == null)
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ namespace BTCPayServer.Controllers
|
|||||||
private CurrencyNameTable _CurrencyNameTable;
|
private CurrencyNameTable _CurrencyNameTable;
|
||||||
EventAggregator _EventAggregator;
|
EventAggregator _EventAggregator;
|
||||||
BTCPayNetworkProvider _NetworkProvider;
|
BTCPayNetworkProvider _NetworkProvider;
|
||||||
|
private readonly IEnumerable<IPaymentMethodHandler> _paymentMethodHandlers;
|
||||||
private readonly BTCPayWalletProvider _WalletProvider;
|
private readonly BTCPayWalletProvider _WalletProvider;
|
||||||
IServiceProvider _ServiceProvider;
|
IServiceProvider _ServiceProvider;
|
||||||
public InvoiceController(
|
public InvoiceController(
|
||||||
@@ -48,7 +49,8 @@ namespace BTCPayServer.Controllers
|
|||||||
EventAggregator eventAggregator,
|
EventAggregator eventAggregator,
|
||||||
BTCPayWalletProvider walletProvider,
|
BTCPayWalletProvider walletProvider,
|
||||||
ContentSecurityPolicies csp,
|
ContentSecurityPolicies csp,
|
||||||
BTCPayNetworkProvider networkProvider)
|
BTCPayNetworkProvider networkProvider,
|
||||||
|
IEnumerable<IPaymentMethodHandler> paymentMethodHandlers)
|
||||||
{
|
{
|
||||||
_ServiceProvider = serviceProvider;
|
_ServiceProvider = serviceProvider;
|
||||||
_CurrencyNameTable = currencyNameTable ?? throw new ArgumentNullException(nameof(currencyNameTable));
|
_CurrencyNameTable = currencyNameTable ?? throw new ArgumentNullException(nameof(currencyNameTable));
|
||||||
@@ -58,6 +60,7 @@ namespace BTCPayServer.Controllers
|
|||||||
_UserManager = userManager;
|
_UserManager = userManager;
|
||||||
_EventAggregator = eventAggregator;
|
_EventAggregator = eventAggregator;
|
||||||
_NetworkProvider = networkProvider;
|
_NetworkProvider = networkProvider;
|
||||||
|
_paymentMethodHandlers = paymentMethodHandlers;
|
||||||
_WalletProvider = walletProvider;
|
_WalletProvider = walletProvider;
|
||||||
_CSP = csp;
|
_CSP = csp;
|
||||||
}
|
}
|
||||||
@@ -247,7 +250,7 @@ namespace BTCPayServer.Controllers
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var logPrefix = $"{supportedPaymentMethod.PaymentId.ToString(true)}:";
|
var logPrefix = $"{handler.ToPrettyString(supportedPaymentMethod.PaymentId)}:";
|
||||||
var storeBlob = store.GetStoreBlob();
|
var storeBlob = store.GetStoreBlob();
|
||||||
var preparePayment = handler.PreparePayment(supportedPaymentMethod, store, network);
|
var preparePayment = handler.PreparePayment(supportedPaymentMethod, store, network);
|
||||||
var rate = await fetchingByCurrencyPair[new CurrencyPair(network.CryptoCode, entity.ProductInformation.Currency)];
|
var rate = await fetchingByCurrencyPair[new CurrencyPair(network.CryptoCode, entity.ProductInformation.Currency)];
|
||||||
|
|||||||
@@ -39,6 +39,11 @@ namespace BTCPayServer
|
|||||||
{
|
{
|
||||||
public static class Extensions
|
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)
|
public static string PrettyPrint(this TimeSpan expiration)
|
||||||
{
|
{
|
||||||
StringBuilder builder = new StringBuilder();
|
StringBuilder builder = new StringBuilder();
|
||||||
|
|||||||
@@ -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)
|
public override async Task<IPaymentMethodDetails> CreatePaymentMethodDetails(DerivationSchemeSettings supportedPaymentMethod, PaymentMethod paymentMethod, StoreData store, BTCPayNetwork network, object preparePaymentObject)
|
||||||
{
|
{
|
||||||
if (!_ExplorerProvider.IsAvailable(network))
|
if (!_ExplorerProvider.IsAvailable(network))
|
||||||
|
|||||||
@@ -30,6 +30,10 @@ namespace BTCPayServer.Payments
|
|||||||
/// <param name="network"></param>
|
/// <param name="network"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
object PreparePayment(ISupportedPaymentMethod supportedPaymentMethod, StoreData store, BTCPayNetwork network);
|
object PreparePayment(ISupportedPaymentMethod supportedPaymentMethod, StoreData store, BTCPayNetwork network);
|
||||||
|
|
||||||
|
bool CanHandle(PaymentMethodId paymentMethodId);
|
||||||
|
|
||||||
|
string ToPrettyString(PaymentMethodId paymentMethodId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface IPaymentMethodHandler<T> : IPaymentMethodHandler where T : ISupportedPaymentMethod
|
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 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 abstract Task<IPaymentMethodDetails> CreatePaymentMethodDetails(T supportedPaymentMethod, PaymentMethod paymentMethod, StoreData store, BTCPayNetwork network, object preparePaymentObject);
|
||||||
public virtual object PreparePayment(T supportedPaymentMethod, StoreData store, BTCPayNetwork network)
|
public virtual object PreparePayment(T supportedPaymentMethod, StoreData store, BTCPayNetwork network)
|
||||||
{
|
{
|
||||||
@@ -55,6 +60,16 @@ namespace BTCPayServer.Payments
|
|||||||
throw new NotSupportedException("Invalid supportedPaymentMethod");
|
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)
|
Task<IPaymentMethodDetails> IPaymentMethodHandler.CreatePaymentMethodDetails(ISupportedPaymentMethod supportedPaymentMethod, PaymentMethod paymentMethod, StoreData store, BTCPayNetwork network, object preparePaymentObject)
|
||||||
{
|
{
|
||||||
if (supportedPaymentMethod is T method)
|
if (supportedPaymentMethod is T method)
|
||||||
|
|||||||
@@ -31,6 +31,9 @@ namespace BTCPayServer.Payments.Lightning
|
|||||||
_lightningClientFactory = lightningClientFactory;
|
_lightningClientFactory = lightningClientFactory;
|
||||||
_socketFactory = socketFactory;
|
_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)
|
public override async Task<IPaymentMethodDetails> CreatePaymentMethodDetails(LightningSupportedPaymentMethod supportedPaymentMethod, PaymentMethod paymentMethod, StoreData store, BTCPayNetwork network, object preparePaymentObject)
|
||||||
{
|
{
|
||||||
var storeBlob = store.GetStoreBlob();
|
var storeBlob = store.GetStoreBlob();
|
||||||
|
|||||||
@@ -62,34 +62,7 @@ namespace BTCPayServer.Payments
|
|||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
{
|
{
|
||||||
return ToString(false);
|
return PaymentType == PaymentTypes.BTCLike ? CryptoCode : $"{CryptoCode}_{PaymentType}";
|
||||||
}
|
|
||||||
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static bool TryParse(string str, out PaymentMethodId paymentMethodId)
|
public static bool TryParse(string str, out PaymentMethodId paymentMethodId)
|
||||||
|
|||||||
Reference in New Issue
Block a user